diff --git a/.cirrus.yml b/.cirrus.yml
index 7db6ce1a9112e..e13e22fd4e816 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -3,8 +3,10 @@ env:
 
 freebsd_task:
   name: FREEBSD_DEBUG_NTS
+  timeout_in: 50m
   freebsd_instance:
     image_family: freebsd-13-3
+  skip: "changesIncludeOnly('docs/**', 'NEWS', 'UPGRADING', 'UPGRADING.INTERNALS', '**/README.*', 'CONTRIBUTING.md', 'CODING_STANDARDS.md', '.circleci/**', 'EXTENSIONS', '**.md', 'docs-old/**')"
   env:
     ARCH: amd64
   install_script:
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 78ab712ddc237..8fb09206d3a6e 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -14,7 +14,7 @@
 # For more information, see the GitHub CODEOWNERS documentation:
 # https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
 
-/.github @iluuu1994 @TimWolla
+/.github @TimWolla
 /build/gen_stub.php @kocsismate
 /ext/bcmath @Girgias @nielsdos @SakiTakamachi
 /ext/curl @adoy
@@ -31,7 +31,7 @@
 /ext/mbstring @alexdowad @youkidearitai
 /ext/mysqlnd @SakiTakamachi
 /ext/odbc @NattyNarwhal
-/ext/opcache @dstogov @iluuu1994
+/ext/opcache @dstogov
 /ext/openssl @bukka
 /ext/pcntl @devnexen
 /ext/pdo @SakiTakamachi
@@ -54,27 +54,24 @@
 /ext/xsl @nielsdos
 /main @bukka
 /sapi/fpm @bukka
-/Zend/Optimizer @dstogov @iluuu1994
+/Zend/Optimizer @dstogov
 /Zend/zend.* @dstogov
 /Zend/zend_alloc.* @dstogov
-/Zend/zend_API.* @dstogov @iluuu1994
+/Zend/zend_API.* @dstogov
 /Zend/zend_call_stack.* @arnaud-lb
 /Zend/zend_closures.* @dstogov
-/Zend/zend_compile.* @iluuu1994
-/Zend/zend_enum.* @iluuu1994
-/Zend/zend_execute.* @dstogov @iluuu1994
-/Zend/zend_execute_API.c @dstogov @iluuu1994
-/Zend/zend_frameless_function.* @iluuu1994
+/Zend/zend_execute.* @dstogov
+/Zend/zend_execute_API.c @dstogov
 /Zend/zend_gc.* @dstogov @arnaud-lb
 /Zend/zend_hash.* @dstogov
-/Zend/zend_inheritance.* @dstogov @iluuu1994
+/Zend/zend_inheritance.* @dstogov
 /Zend/zend_max_execution_timer.* @arnaud-lb
-/Zend/zend_object_handlers.* @dstogov @iluuu1994
-/Zend/zend_objects.* @dstogov @iluuu1994
-/Zend/zend_objects_API.* @dstogov @iluuu1994
-/Zend/zend_opcode.* @dstogov @iluuu1994
+/Zend/zend_object_handlers.* @dstogov
+/Zend/zend_objects.* @dstogov
+/Zend/zend_objects_API.* @dstogov
+/Zend/zend_opcode.* @dstogov
 /Zend/zend_string.* @dstogov
-/Zend/zend_type*.h @dstogov @iluuu1994
+/Zend/zend_type*.h @dstogov
 /Zend/zend_variables.* @dstogov
-/Zend/zend_vm* @dstogov @iluuu1994
+/Zend/zend_vm* @dstogov
 *.stub.php @kocsismate
diff --git a/.github/actions/apk/action.yml b/.github/actions/apk/action.yml
index 49e336aa0fecb..039fc64a5491e 100644
--- a/.github/actions/apk/action.yml
+++ b/.github/actions/apk/action.yml
@@ -19,9 +19,6 @@ runs:
             re2c \
             pkgconf \
             mysql-client \
-            aspell-dev \
-            hunspell-dev \
-            hunspell-en \
             bzip2-dev \
             curl-dev \
             freetype-dev \
@@ -44,12 +41,10 @@ runs:
             readline-dev \
             sqlite-dev \
             tidyhtml-dev \
-            krb5-dev \
             gdbm-dev \
             lmdb-dev \
             argon2-dev \
             enchant2-dev \
-            enchant2-hunspell \
             freetds-dev \
             imap-dev \
             net-snmp-dev \
diff --git a/.github/actions/apt-x64/action.yml b/.github/actions/apt-x64/action.yml
index aa190ded78db6..a2ef014c5faa1 100644
--- a/.github/actions/apt-x64/action.yml
+++ b/.github/actions/apt-x64/action.yml
@@ -1,4 +1,8 @@
 name: apt
+inputs:
+  asan:
+    default: false
+    required: false
 runs:
   using: composite
   steps:
@@ -39,6 +43,7 @@ runs:
           libsqlite3-dev \
           libsqlite3-mod-spatialite \
           libwebp-dev \
+          ${{ inputs.asan == 'false' && 'libavif-dev' || '' }} \
           libonig-dev \
           libcurl4-openssl-dev \
           libxml2-dev \
@@ -47,7 +52,7 @@ runs:
           libedit-dev \
           libldap2-dev \
           libsodium-dev \
-          libargon2-0-dev \
+          libargon2-dev \
           libmm-dev \
           libsnmp-dev \
           postgresql \
diff --git a/.github/actions/brew/action.yml b/.github/actions/brew/action.yml
index 4975acfd30eba..287062e6f9f9c 100644
--- a/.github/actions/brew/action.yml
+++ b/.github/actions/brew/action.yml
@@ -11,32 +11,19 @@ runs:
         code=" keg.link\(verbose: verbose\?"
         sudo sed -Ei '' "s/$code.*/$code, overwrite: true\)/" "$formula_installer"
 
+        # Some packages exist on x86 but not arm, or vice versa.
+        # Install them with reinstall to avoid warnings.
+        brew reinstall autoconf webp tidy-html5 libzip libsodium icu4c
         brew install \
-          pkg-config \
-          autoconf \
           bison \
           re2c
         brew install \
-          openssl@1.1 \
-          curl \
           bzip2 \
           enchant \
           libffi \
-          libpng \
-          webp \
-          freetype \
           intltool \
-          icu4c \
           libiconv \
-          zlib \
           t1lib \
-          gd \
-          libzip \
-          gmp \
-          tidy-html5 \
           libxml2 \
           libjpeg \
-          libsodium \
-          libxslt \
-          postgresql
-        brew link icu4c gettext --force
+          libxslt
diff --git a/.github/actions/configure-x64/action.yml b/.github/actions/configure-x64/action.yml
index 3de17a246d02f..ff746791fb950 100644
--- a/.github/actions/configure-x64/action.yml
+++ b/.github/actions/configure-x64/action.yml
@@ -6,6 +6,9 @@ inputs:
   skipSlow:
     default: false
     required: false
+  asan:
+    default: false
+    required: false
 runs:
   using: composite
   steps:
@@ -28,6 +31,7 @@ runs:
           --enable-gd \
           --with-jpeg \
           --with-webp \
+          ${{ inputs.asan == 'false' && '--with-avif' || '' }} \
           --with-freetype \
           --with-xpm \
           --enable-exif \
diff --git a/.github/actions/setup-mssql/action.yml b/.github/actions/setup-mssql/action.yml
index c069744a21b59..dd372a5637aac 100644
--- a/.github/actions/setup-mssql/action.yml
+++ b/.github/actions/setup-mssql/action.yml
@@ -11,4 +11,4 @@ runs:
           -p 1433:1433 \
           --name sql1 \
           -h sql1 \
-          -d mcr.microsoft.com/mssql/server:2019-CU8-ubuntu-16.04
+          -d mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04
diff --git a/.github/actions/setup-x64/action.yml b/.github/actions/setup-x64/action.yml
index e5856c2fcdbe4..3ee5cd3f28f25 100644
--- a/.github/actions/setup-x64/action.yml
+++ b/.github/actions/setup-x64/action.yml
@@ -6,16 +6,12 @@ runs:
       run: |
         set -x
 
-        sudo service mysql start
         sudo service slapd start
-        mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS test"
-        # Ensure local_infile tests can run.
-        mysql -uroot -proot -e "SET GLOBAL local_infile = true"
-        docker exec sql1 /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U SA -P "" -Q "create login pdo_test with password='password', check_policy=off; create user pdo_test for login pdo_test; grant alter, control to pdo_test;"
-        docker exec sql1 /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U SA -P "" -Q "create login odbc_test with password='password', check_policy=off; create user odbc_test for login odbc_test; grant alter, control, delete to odbc_test;"
-        docker exec sql1 /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U SA -P "" -Q "ALTER SERVER ROLE sysadmin ADD MEMBER odbc_test;"
-        docker exec sql1 /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U SA -P "" -Q "CREATE DATABASE odbc;"
-        docker exec sql1 /opt/mssql-tools/bin/sqlcmd -S 127.0.0.1 -U SA -P "" -Q "CREATE DATABASE pdo_odbc;"
+        docker exec sql1 /opt/mssql-tools18/bin/sqlcmd -S 127.0.0.1 -U SA -C -P "" -Q "create login pdo_test with password='password', check_policy=off; create user pdo_test for login pdo_test; grant alter, control to pdo_test;"
+        docker exec sql1 /opt/mssql-tools18/bin/sqlcmd -S 127.0.0.1 -U SA -C -P "" -Q "create login odbc_test with password='password', check_policy=off; create user odbc_test for login odbc_test; grant alter, control, delete to odbc_test;"
+        docker exec sql1 /opt/mssql-tools18/bin/sqlcmd -S 127.0.0.1 -U SA -C -P "" -Q "ALTER SERVER ROLE sysadmin ADD MEMBER odbc_test;"
+        docker exec sql1 /opt/mssql-tools18/bin/sqlcmd -S 127.0.0.1 -U SA -C -P "" -Q "CREATE DATABASE odbc;"
+        docker exec sql1 /opt/mssql-tools18/bin/sqlcmd -S 127.0.0.1 -U SA -C -P "" -Q "CREATE DATABASE pdo_odbc;"
         sudo locale-gen de_DE
 
         ./.github/scripts/setup-slapd.sh
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 675aed5ebc76c..00807db1d135b 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -389,3 +389,109 @@
   - changed-files:
       - any-glob-to-any-file:
         - sapi/phpdbg/**/*
+
+"ABI break":
+  - changed-files:
+    - any-glob-to-any-file:
+      - 'TSRM/*.h'
+      - 'Zend/*.h'
+      - 'Zend/Optimizer/zend_call_graph.h'
+      - 'Zend/Optimizer/zend_cfg.h'
+      - 'Zend/Optimizer/zend_dfg.h'
+      - 'Zend/Optimizer/zend_dump.h'
+      - 'Zend/Optimizer/zend_func_info.h'
+      - 'Zend/Optimizer/zend_inference.h'
+      - 'Zend/Optimizer/zend_optimizer.h'
+      - 'Zend/Optimizer/zend_ssa.h'
+      - 'Zend/Optimizer/zend_worklist.h'
+      - 'ext/curl/php_curl.h'
+      - 'ext/date/lib/timelib.h'
+      - 'ext/date/lib/timelib_config.h'
+      - 'ext/date/php_date.h'
+      - 'ext/dom/dom_ce.h'
+      - 'ext/dom/namespace_compat.h'
+      - 'ext/dom/xml_common.h'
+      - 'ext/dom/xpath_callbacks.h'
+      - 'ext/filter/php_filter.h'
+      - 'ext/gd/libgd/*.h'
+      - 'ext/gd/php_gd.h'
+      - 'ext/gmp/php_gmp_int.h'
+      - 'ext/hash/php_hash.h'
+      - 'ext/hash/php_hash_adler32.h'
+      - 'ext/hash/php_hash_crc32.h'
+      - 'ext/hash/php_hash_fnv.h'
+      - 'ext/hash/php_hash_gost.h'
+      - 'ext/hash/php_hash_haval.h'
+      - 'ext/hash/php_hash_joaat.h'
+      - 'ext/hash/php_hash_md.h'
+      - 'ext/hash/php_hash_murmur.h'
+      - 'ext/hash/php_hash_ripemd.h'
+      - 'ext/hash/php_hash_sha.h'
+      - 'ext/hash/php_hash_sha3.h'
+      - 'ext/hash/php_hash_snefru.h'
+      - 'ext/hash/php_hash_tiger.h'
+      - 'ext/hash/php_hash_whirlpool.h'
+      - 'ext/hash/php_hash_xxhash.h'
+      - 'ext/hash/xxhash/xxhash.h'
+      - 'ext/iconv/php_iconv.h'
+      - 'ext/json/php_json.h'
+      - 'ext/json/php_json_parser.h'
+      - 'ext/json/php_json_scanner.h'
+      - 'ext/libxml/php_libxml.h'
+      - 'ext/mbstring/libmbfl/config.h'
+      - 'ext/mbstring/libmbfl/mbfl/eaw_table.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfilter.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfilter_8bit.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfilter_pass.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfilter_wchar.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfl_consts.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfl_convert.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfl_defs.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfl_encoding.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfl_filter_output.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfl_language.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfl_memory_device.h'
+      - 'ext/mbstring/libmbfl/mbfl/mbfl_string.h'
+      - 'ext/mbstring/mbstring.h'
+      - 'ext/mbstring/php_mbregex.h'
+      - 'ext/mbstring/php_onig_compat.h'
+      - 'ext/mysqli/mysqli_mysqlnd.h'
+      - 'ext/mysqli/php_mysqli_structs.h'
+      - 'ext/mysqlnd/*.h'
+      - 'ext/pcre/pcre2lib/*.h'
+      - 'ext/pcre/php_pcre.h'
+      - 'ext/pdo/pdo_sql_parser.h'
+      - 'ext/pdo/php_pdo.h'
+      - 'ext/pdo/php_pdo_driver.h'
+      - 'ext/pdo/php_pdo_error.h'
+      - 'ext/phar/php_phar.h'
+      - 'ext/random/php_random.h'
+      - 'ext/random/php_random_csprng.h'
+      - 'ext/random/php_random_uint128.h'
+      - 'ext/session/mod_files.h'
+      - 'ext/session/mod_mm.h'
+      - 'ext/session/mod_user.h'
+      - 'ext/session/php_session.h'
+      - 'ext/simplexml/php_simplexml.h'
+      - 'ext/simplexml/php_simplexml_exports.h'
+      - 'ext/sockets/php_sockets.h'
+      - 'ext/sockets/windows_common.h'
+      - 'ext/sodium/php_libsodium.h'
+      - 'ext/spl/php_spl.h'
+      - 'ext/spl/spl_array.h'
+      - 'ext/spl/spl_directory.h'
+      - 'ext/spl/spl_dllist.h'
+      - 'ext/spl/spl_exceptions.h'
+      - 'ext/spl/spl_fixedarray.h'
+      - 'ext/spl/spl_functions.h'
+      - 'ext/spl/spl_heap.h'
+      - 'ext/spl/spl_iterators.h'
+      - 'ext/spl/spl_observer.h'
+      - 'ext/standard/*.h'
+      - 'ext/xml/expat_compat.h'
+      - 'ext/xml/php_xml.h'
+      - 'main/*.h'
+      - 'main/streams/*.h'
+      - 'sapi/cli/cli.h'
+      - 'sapi/embed/php_embed.h'
+      - 'win32/*.h'
diff --git a/.github/nightly_matrix.php b/.github/nightly_matrix.php
index f0603dd97d73e..7c2797f249e59 100644
--- a/.github/nightly_matrix.php
+++ b/.github/nightly_matrix.php
@@ -1,7 +1,8 @@
  'master', 'ref' => 'master', 'version' => ['major' => 8, 'minor' => 4]],
+    ['name' => 'master', 'ref' => 'master', 'version' => ['major' => 8, 'minor' => 5]],
+    ['name' => 'PHP-8.4', 'ref' => 'PHP-8.4', 'version' => ['major' => 8, 'minor' => 4]],
     ['name' => 'PHP-8.3', 'ref' => 'PHP-8.3', 'version' => ['major' => 8, 'minor' => 3]],
     ['name' => 'PHP-8.2', 'ref' => 'PHP-8.2', 'version' => ['major' => 8, 'minor' => 2]],
     ['name' => 'PHP-8.1', 'ref' => 'PHP-8.1', 'version' => ['major' => 8, 'minor' => 1]],
@@ -101,7 +102,7 @@ function get_macos_matrix_include(array $branches) {
                     'branch' => $branch,
                     'debug' => $debug,
                     'zts' => $zts,
-                    'os' => $branch['name'] === 'master' ? '13' : '12',
+                    'os' => in_array($branch['name'], ['master', 'PHP-8.4'], true) ? '13' : '12',
                     'arch' => 'X64',
                     'test_jit' => true,
                 ];
diff --git a/.github/scripts/windows/build_task.bat b/.github/scripts/windows/build_task.bat
index e8d84b8c0bfd6..ec4ce4459d088 100644
--- a/.github/scripts/windows/build_task.bat
+++ b/.github/scripts/windows/build_task.bat
@@ -31,12 +31,7 @@ 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%
 
-rem Some undefined behavior is reported on 32-bit, this should be fixed
-if "%PLATFORM%" == "x86" (
-	set CFLAGS=/W1
-) else (
-	set CFLAGS=/W1 /WX
-)
+set CFLAGS=/W1 /WX
 
 cmd /c configure.bat ^
 	--enable-snapshot-build ^
diff --git a/.github/scripts/windows/find-target-branch.bat b/.github/scripts/windows/find-target-branch.bat
index 77d1684048142..a0b47f2488946 100644
--- a/.github/scripts/windows/find-target-branch.bat
+++ b/.github/scripts/windows/find-target-branch.bat
@@ -3,6 +3,6 @@
 for /f "usebackq tokens=3" %%i in (`findstr PHP_MAJOR_VERSION main\php_version.h`) do set BRANCH=%%i
 for /f "usebackq tokens=3" %%i in (`findstr PHP_MINOR_VERSION main\php_version.h`) do set BRANCH=%BRANCH%.%%i
 
-if /i "%BRANCH%" equ "8.4" (
+if /i "%BRANCH%" equ "8.5" (
 	set BRANCH=master
 )
diff --git a/.github/scripts/windows/test_task.bat b/.github/scripts/windows/test_task.bat
index 4e1e2f491e74c..0d6117324d63d 100644
--- a/.github/scripts/windows/test_task.bat
+++ b/.github/scripts/windows/test_task.bat
@@ -50,7 +50,12 @@ set ODBC_TEST_DSN=Driver={ODBC Driver 17 for SQL Server};Server=^(local^)\SQLEXP
 set PDOTEST_DSN=odbc:%ODBC_TEST_DSN%
 
 rem setup Firebird related exts
-curl -sLo Firebird.zip https://github.com/FirebirdSQL/firebird/releases/download/v4.0.4/Firebird-4.0.4.3010-0-x64.zip
+if "%PLATFORM%" == "x64" (
+	set PHP_FIREBIRD_DOWNLOAD_URL=https://github.com/FirebirdSQL/firebird/releases/download/v4.0.4/Firebird-4.0.4.3010-0-x64.zip
+) else (
+	set PHP_FIREBIRD_DOWNLOAD_URL=https://github.com/FirebirdSQL/firebird/releases/download/v4.0.4/Firebird-4.0.4.3010-0-Win32.zip
+)
+curl -sLo Firebird.zip %PHP_FIREBIRD_DOWNLOAD_URL%
 7z x -oC:\Firebird Firebird.zip
 set PDO_FIREBIRD_TEST_DATABASE=C:\test.fdb
 set PDO_FIREBIRD_TEST_DSN=firebird:dbname=%PDO_FIREBIRD_TEST_DATABASE%
@@ -84,8 +89,6 @@ rem set SSLEAY_CONF=
 
 rem prepare for OPcache
 if "%OPCACHE%" equ "1" set OPCACHE_OPTS=-d opcache.enable=1 -d opcache.enable_cli=1 -d opcache.protect_memory=1 -d opcache.jit_buffer_size=64M -d opcache.jit=tracing
-rem work-around for failing to dl(mysqli) with OPcache (https://github.com/php/php-src/issues/8508)
-if "%OPCACHE%" equ "1" set OPCACHE_OPTS=%OPCACHE_OPTS% -d extension=mysqli
 
 rem prepare for enchant
 mkdir %~d0\usr\local\lib\enchant-2
@@ -96,14 +99,15 @@ mkdir %~d0\usr\local\share\enchant\hunspell
 if %errorlevel% neq 0 exit /b 3
 echo Fetching enchant dicts
 pushd %~d0\usr\local\share\enchant\hunspell
-powershell -Command wget http://windows.php.net/downloads/qa/appveyor/ext/enchant/dict.zip -OutFile dict.zip
+powershell -Command wget https://downloads.php.net/~windows/qa/appveyor/ext/enchant/dict.zip -OutFile dict.zip
 unzip dict.zip
 del /q dict.zip
 popd
 
 rem prepare for snmp
 set MIBDIRS=%DEPS_DIR%\share\mibs
-start %DEPS_DIR%\bin\snmpd.exe -C -c %APPVEYOR_BUILD_FOLDER%\ext\snmp\tests\snmpd.conf -Ln
+sed -i "s/exec HexTest .*/exec HexTest cscript\.exe \/nologo %GITHUB_WORKSPACE:\=\/%\/ext\/snmp\/tests\/bigtest\.js/g" %GITHUB_WORKSPACE%\ext\snmp\tests\snmpd.conf
+start %DEPS_DIR%\bin\snmpd.exe -C -c %GITHUB_WORKSPACE%\ext\snmp\tests\snmpd.conf -Ln
 
 set PHP_BUILD_DIR=%PHP_BUILD_OBJ_DIR%\Release
 if "%THREAD_SAFE%" equ "1" set PHP_BUILD_DIR=%PHP_BUILD_DIR%_TS
@@ -131,15 +135,10 @@ set TEST_PHPDBG_EXECUTABLE=%PHP_BUILD_DIR%\phpdbg.exe
 
 mkdir c:\tests_tmp
 
-nmake test TESTS="%OPCACHE_OPTS% -g FAIL,BORK,LEAK,XLEAK --no-progress -q --offline --show-diff --show-slow 1000 --set-timeout 120 --temp-source c:\tests_tmp --temp-target c:\tests_tmp --bless %PARALLEL%"
+nmake test TESTS="%OPCACHE_OPTS% -g FAIL,BORK,LEAK,XLEAK --no-progress -q --offline --show-diff --show-slow 1000 --set-timeout 120 --temp-source c:\tests_tmp --temp-target c:\tests_tmp %PARALLEL%"
 
 set EXIT_CODE=%errorlevel%
 
 taskkill /f /im snmpd.exe
 
-if %EXIT_CODE% GEQ 1 (
-	git checkout ext\pgsql\tests\config.inc
-	git diff > bless_tests.patch
-)
-
 exit /b %EXIT_CODE%
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 0319a911a6901..bb1755769e9ca 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -24,7 +24,7 @@ jobs:
           # the correct commit hashes.
           fetch-depth: 0
       - name: Grab the commit mapping
-        uses: actions/cache@v3
+        uses: actions/cache@v4
         with:
           path: branch-commit-cache.json
           # The cache key needs to change every time for the
@@ -103,6 +103,13 @@ jobs:
     needs: GENERATE_MATRIX
     if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }}
     services:
+      mysql:
+        image: mysql:8.3
+        ports:
+          - 3306:3306
+        env:
+          MYSQL_DATABASE: test
+          MYSQL_ROOT_PASSWORD: root
       postgres:
         image: postgres
         env:
@@ -140,6 +147,8 @@ jobs:
         uses: ./.github/actions/setup-mssql
       - name: apt
         uses: ./.github/actions/apt-x64
+        with:
+          asan: ${{ matrix.asan && 'true' || 'false' }}
       - name: System info
         run: |
           echo "::group::Show host CPU info"
@@ -155,6 +164,7 @@ jobs:
             ${{ matrix.configuration_parameters }}
             --${{ matrix.debug && 'enable' || 'disable' }}-debug
             --${{ matrix.zts && 'enable' || 'disable' }}-zts
+          asan: ${{ matrix.asan && 'true' || 'false' }}
       - name: make
         run: make -j$(/usr/bin/nproc) >/dev/null
       - name: make install
@@ -341,6 +351,13 @@ jobs:
   COVERAGE_DEBUG_NTS:
     if: github.repository == 'php/php-src' || github.event_name == 'workflow_dispatch'
     services:
+      mysql:
+        image: mysql:8.3
+        ports:
+          - 3306:3306
+        env:
+          MYSQL_DATABASE: test
+          MYSQL_ROOT_PASSWORD: root
       postgres:
         image: postgres
         env:
@@ -587,6 +604,13 @@ jobs:
     needs: GENERATE_MATRIX
     if: ${{ needs.GENERATE_MATRIX.outputs.branches != '[]' }}
     services:
+      mysql:
+        image: mysql:8.3
+        ports:
+          - 3306:3306
+        env:
+          MYSQL_DATABASE: test
+          MYSQL_ROOT_PASSWORD: root
       postgres:
         image: postgres
         env:
@@ -849,13 +873,12 @@ jobs:
           repository: php-memcached-dev/php-memcached
           path: memcached
       - name: git checkout redis
-        # Currently fails to build
-        if: false
         uses: actions/checkout@v4
         with:
           repository: phpredis/phpredis
           path: redis
       - name: git checkout xdebug
+        if: false
         uses: actions/checkout@v4
         with:
           repository: xdebug/xdebug
@@ -911,14 +934,13 @@ jobs:
           ./configure --prefix=/opt/php --with-php-config=/opt/php/bin/php-config
           make -j$(/usr/bin/nproc)
       - name: build redis
-        # Currently fails to build
-        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
+        if: false
         run: |
           cd xdebug
           /opt/php/bin/phpize
diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml
index 63745e628779f..684934c7073ee 100644
--- a/.github/workflows/push.yml
+++ b/.github/workflows/push.yml
@@ -15,6 +15,7 @@ on:
       - PHP-8.1
       - PHP-8.2
       - PHP-8.3
+      - PHP-8.4
       - master
   pull_request:
     paths-ignore:
@@ -29,6 +30,7 @@ on:
       - .circleci/**
     branches:
       - '**'
+  workflow_dispatch: ~
 permissions:
   contents: read
 concurrency:
@@ -76,21 +78,13 @@ jobs:
             zts: true
             asan: true
     name: "LINUX_X64_${{ matrix.debug && 'DEBUG' || 'RELEASE' }}_${{ matrix.zts && 'ZTS' || 'NTS' }}${{ matrix.asan && '_ASAN' || '' }}"
-    runs-on: ubuntu-${{ !matrix.asan && '22' || '20' }}.04
-    container:
-      image: ${{ matrix.asan && 'ubuntu:23.04' || null }}
+    runs-on: ubuntu-${{ !matrix.asan && '22' || '24' }}.04
+    timeout-minutes: 50
     steps:
       - name: git checkout
         uses: actions/checkout@v4
       - name: apt
         uses: ./.github/actions/apt-x64
-      - name: LLVM 16 (ASAN-only)
-        if: ${{ matrix.asan }}
-        run: |
-          DEBIAN_FRONTEND=noninteractive sudo apt-get install -y lsb-release wget software-properties-common gnupg
-          wget https://apt.llvm.org/llvm.sh
-          chmod u+x llvm.sh
-          sudo ./llvm.sh 16
       - name: System info
         run: |
           echo "::group::Show host CPU info"
@@ -119,7 +113,7 @@ jobs:
           configurationParameters: >-
             --${{ matrix.debug && 'enable' || 'disable' }}-debug
             --${{ matrix.zts && 'enable' || 'disable' }}-zts
-            ${{ matrix.asan && 'CFLAGS="-fsanitize=undefined,address -DZEND_TRACK_ARENA_ALLOC" LDFLAGS="-fsanitize=undefined,address" CC=clang-16 CXX=clang++-16' || '' }}
+            ${{ matrix.asan && 'CFLAGS="-fsanitize=undefined,address -fno-sanitize=function -DZEND_TRACK_ARENA_ALLOC" LDFLAGS="-fsanitize=undefined,address -fno-sanitize=function" CC=clang CXX=clang++' || '' }}
           skipSlow: ${{ matrix.asan }}
       - name: make
         run: make -j$(/usr/bin/nproc) >/dev/null
@@ -146,6 +140,7 @@ jobs:
     if: github.repository == 'php/php-src' || github.event_name == 'pull_request'
     name: LINUX_X32_DEBUG_ZTS
     runs-on: ubuntu-latest
+    timeout-minutes: 50
     container:
       image: ubuntu:20.04
     env:
@@ -199,6 +194,7 @@ jobs:
             arch: ARM64
     name: MACOS_${{ matrix.arch }}_DEBUG_NTS
     runs-on: macos-${{ matrix.os }}
+    timeout-minutes: 50
     steps:
       - name: git checkout
         uses: actions/checkout@v4
@@ -233,6 +229,7 @@ jobs:
     if: github.repository == 'php/php-src' || github.event_name == 'pull_request'
     name: WINDOWS_X64_ZTS
     runs-on: windows-2022
+    timeout-minutes: 50
     env:
       PHP_BUILD_CACHE_BASE_DIR: C:\build-cache
       PHP_BUILD_OBJ_DIR: C:\obj
@@ -259,6 +256,7 @@ jobs:
     name: BENCHMARKING
     if: github.repository == 'php/php-src' || github.event_name == 'pull_request'
     runs-on: ubuntu-22.04
+    timeout-minutes: 50
     steps:
       - name: git checkout
         uses: actions/checkout@v4
diff --git a/.github/workflows/real-time-benchmark.yml b/.github/workflows/real-time-benchmark.yml
new file mode 100644
index 0000000000000..9e1fa9fdbe6a2
--- /dev/null
+++ b/.github/workflows/real-time-benchmark.yml
@@ -0,0 +1,132 @@
+name: Real-time Benchmark
+on:
+  schedule:
+    - cron: "30 0 * * *"
+permissions:
+  contents: read
+jobs:
+  REAL_TIME_BENCHMARK:
+    name: REAL_TIME_BENCHMARK
+    if: github.repository == 'php/php-src'
+    runs-on: ubuntu-22.04
+    steps:
+      - name: Install dependencies
+        run: |
+          set -ex
+          sudo apt-get update
+          sudo apt-get install gpg
+
+          wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
+          gpg --no-default-keyring --keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg --fingerprint
+          echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
+          export DEBIAN_FRONTEND=noninteractive
+          sudo apt-get update -y
+          sudo apt-get install -y terraform=1.5.7-*
+      - name: Checkout benchmark suite
+        uses: actions/checkout@v4
+        with:
+          repository: 'kocsismate/php-version-benchmarks'
+          ref: 'main'
+          fetch-depth: 1
+          path: 'php-version-benchmarks'
+      - name: Checkout php-src
+        uses: actions/checkout@v4
+        with:
+          repository: 'php/php-src'
+          ref: '${{ github.sha }}'
+          fetch-depth: 100
+          path: 'php-version-benchmarks/tmp/php_master'
+      - name: Setup benchmark results
+        run: |
+          git config --global user.name "Benchmark"
+          git config --global user.email "benchmark@php.net"
+          
+          rm -rf ./php-version-benchmarks/docs/results
+      - name: Checkout benchmark data
+        uses: actions/checkout@v4
+        with:
+          repository: php/real-time-benchmark-data
+          ssh-key: ${{ secrets.PHP_VERSION_BENCHMARK_RESULTS_DEPLOY_KEY }}
+          path: 'php-version-benchmarks/docs/results'
+      - name: Set benchmark config
+        run: |
+          set -e
+
+          # Set infrastructure config
+          cp ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini.dist ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
+          ESCAPED_DOCKER_REGISTRY=$(printf '%s\n' "${{ secrets.PHP_VERSION_BENCHMARK_DOCKER_REGISTRY }}" | sed -e 's/[\/&]/\\&/g')
+          sed -i "s/INFRA_DOCKER_REGISTRY=public.ecr.aws\/abcdefgh/INFRA_DOCKER_REGISTRY=$ESCAPED_DOCKER_REGISTRY/g" ./php-version-benchmarks/config/infra/aws/x86_64-metal.ini
+          cp ./php-version-benchmarks/build/infrastructure/config/aws.tfvars.dist ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
+          sed -i 's/access_key = ""/access_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_ACCESS_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
+          sed -i 's/secret_key = ""/secret_key = "${{ secrets.PHP_VERSION_BENCHMARK_AWS_SECRET_KEY }}"/g' ./php-version-benchmarks/build/infrastructure/config/aws.tfvars
+
+          YEAR="$(date '+%Y')"
+          DATABASE="./php-version-benchmarks/docs/results/$YEAR/database.tsv"
+          if [ -f "$DATABASE" ]; then
+            LAST_RESULT_SHA="$(tail -n 2 "$DATABASE" | head -n 1 | cut -f 6)"
+          else
+            YESTERDAY="$(date -d "-2 day 23:59:59" '+%Y-%m-%d %H:%M:%S')"
+            LAST_RESULT_SHA="$(cd ./php-version-benchmarks/tmp/php_master/ && git --no-pager log --until="$YESTERDAY" -n 1 --pretty='%H')"
+          fi
+
+          BASELINE_SHA="d5f6e56610c729710073350af318c4ea1b292cfe"
+          BASELINE_SHORT_SHA="$(echo "$BASELINE_SHA" | cut -c1-4)"
+
+          # Set config for the baseline PHP version
+          cp ./php-version-benchmarks/config/php/master.ini.dist ./php-version-benchmarks/config/php/master_baseline.ini
+          sed -i 's/PHP_NAME="PHP - master"/PHP_NAME="PHP - baseline@'"$BASELINE_SHORT_SHA"'"/g' ./php-version-benchmarks/config/php/master_baseline.ini
+          sed -i "s/PHP_ID=php_master/PHP_ID=php_master_baseline/g" ./php-version-benchmarks/config/php/master_baseline.ini
+          sed -i "s/PHP_COMMIT=/PHP_COMMIT=$BASELINE_SHA/g" ./php-version-benchmarks/config/php/master_baseline.ini
+
+          # Set config for the previous PHP version
+          cp ./php-version-benchmarks/config/php/master.ini.dist ./php-version-benchmarks/config/php/master_last.ini
+          sed -i 's/PHP_NAME="PHP - master"/PHP_NAME="PHP - previous master"/g' ./php-version-benchmarks/config/php/master_last.ini
+          sed -i "s/PHP_ID=php_master/PHP_ID=php_master_previous/g" ./php-version-benchmarks/config/php/master_last.ini
+          sed -i "s/PHP_COMMIT=/PHP_COMMIT=$LAST_RESULT_SHA/g" ./php-version-benchmarks/config/php/master_last.ini
+
+          # Set config for the current PHP version
+          cp ./php-version-benchmarks/config/php/master.ini.dist ./php-version-benchmarks/config/php/master_now.ini
+          sed -i "s/PHP_COMMIT=/PHP_COMMIT=${{ github.sha }}/g" ./php-version-benchmarks/config/php/master_now.ini
+
+          # Set config for current PHP version with JIT
+          git clone ./php-version-benchmarks/tmp/php_master/ ./php-version-benchmarks/tmp/php_master_jit
+          cp ./php-version-benchmarks/config/php/master_jit.ini.dist ./php-version-benchmarks/config/php/master_now_jit.ini
+          sed -i "s/PHP_COMMIT=/PHP_COMMIT=${{ github.sha }}/g" ./php-version-benchmarks/config/php/master_now_jit.ini
+
+          # Set test configs
+          cp ./php-version-benchmarks/config/test/1_laravel.ini.dist ./php-version-benchmarks/config/test/1_laravel.ini
+          cp ./php-version-benchmarks/config/test/2_symfony_main.ini.dist ./php-version-benchmarks/config/test/2_symfony_main.ini
+          cp ./php-version-benchmarks/config/test/4_wordpress.ini.dist ./php-version-benchmarks/config/test/4_wordpress.ini
+          cp ./php-version-benchmarks/config/test/5_bench.php.ini.dist ./php-version-benchmarks/config/test/5_bench.php.ini
+          cp ./php-version-benchmarks/config/test/6_micro_bench.php.ini.dist ./php-version-benchmarks/config/test/6_micro_bench.php.ini
+      - name: Run benchmark
+        run: ./php-version-benchmarks/benchmark.sh run aws
+      - name: Store results
+        run: |
+          set -ex
+
+          cd ./php-version-benchmarks/docs/results
+          git pull --autostash
+          if [ -e ".git/MERGE_HEAD" ]; then
+            echo "Merging, can't proceed"
+            exit 1
+          fi
+          git add .
+          if git diff --cached --quiet; then
+            exit 1
+          fi
+          git commit -m "Add result for ${{ github.repository }}@${{ github.sha }}"
+          git push
+      - name: Cleanup
+        if: always()
+        run: |
+          set -ex
+
+          rm -rf ./php-version-benchmarks/tmp/
+          rm -f ./php-version-benchmarks/build/infrastructure/config/*.tfvars
+          rm -rf ./php-version-benchmarks/build/infrastructure/aws/.terraform/
+          rm -f ./php-version-benchmarks/build/infrastructure/aws/.terraform.lock.hcl
+          rm -f ./php-version-benchmarks/build/infrastructure/aws/aws.tfplan
+          rm -f ./php-version-benchmarks/build/infrastructure/aws/terraform.tfstate
+          rm -f ./php-version-benchmarks/build/infrastructure/aws/terraform.tfstate.backup
+          rm -f ./php-version-benchmarks/config/infra/aws/*.ini
diff --git a/CODING_STANDARDS.md b/CODING_STANDARDS.md
index 5fb2586eadd78..c599194ed50e3 100644
--- a/CODING_STANDARDS.md
+++ b/CODING_STANDARDS.md
@@ -9,12 +9,10 @@ rewritten to comply with these rules.
 
 1. Document your code in source files and the manual. (tm)
 
-1. PHP is implemented in C99.
+1. PHP is implemented in C11.
     For instance, the optional fixed-width integers from
     stdint.h (int8_t, int16_t, int32_t, int64_t and their unsigned
     counterparts) are supposed to be available.
-    However, some features (most notably variable-length arrays) which are not
-    supported by all relevant compilers, must not be used.
 
 1. Functions that are given pointers to resources should not free them.
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 2318f896b7a9b..a9f34c239c55e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -350,7 +350,8 @@ Currently, we have the following branches in use:
 
 | Branch    |           |
 | --------- | --------- |
-| master    | Active development branch for PHP 8.4, which is open for backwards incompatible changes and major internal API changes. |
+| master    | Active development branch for PHP 8.5, which is open for backwards incompatible changes and major internal API changes. |
+| 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 a current stable version and is open for bugfixes 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. |
diff --git a/EXTENSIONS b/EXTENSIONS
index ec75284085b71..4081f85adf64f 100644
--- a/EXTENSIONS
+++ b/EXTENSIONS
@@ -364,6 +364,7 @@ EXTENSION:           mbstring
 PRIMARY MAINTAINER:  Rui Hirokawa  (2001 - 2013)
                      Nikita Popov  (2017 - 2020)
                      Alex Dowad  (2021 - 2024)
+                     Yuya Hamada  (2024 - 2024)
 MAINTENANCE:         Maintained
 STATUS:              Working
 -------------------------------------------------------------------------------
diff --git a/NEWS b/NEWS
index 1a2422c653f58..01bc51d2a757f 100644
--- a/NEWS
+++ b/NEWS
@@ -1,718 +1,46 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
-?? ??? ????, PHP 8.4.0beta5
+?? ??? ????, PHP 8.5.0alpha1
 
-- BCMath:
-  . Fixed LONG_MAX in BCMath ext. (Saki Takamachi)
-  . Fixed bcdiv() div by one. (Saki Takamachi)
-  . [RFC] Support object types in BCMath. (Saki Takamachi)
-
-- Core:
-  . Fixed bug GH-15330 (Do not scan generator frames more than once). (Arnaud)
-  . Fixed bug GH-15644 (Asymmetric visibility doesn't work with hooks). (ilutov)
-  . Implemented lazy objects RFC. (Arnaud)
-  . Fixed bug GH-15686 (Building shared iconv with external iconv library).
-    (Peter Kokot, zeriyoshi)
-  . Fixed missing error when adding asymmetric visibility to unilateral virtual
-    property. (ilutov)
-  . Fixed bug GH-15693 (Unnecessary include in main.c bloats binary).
-    (nielsdos)
-  . Fixed bug GH-15731 (AllowDynamicProperties validation should error on
-    enums). (DanielEScherzer)
-
-- Curl:
-  . The CURLOPT_DNS_USE_GLOBAL_CACHE option is now silently ignored. (Ayesh Karunaratne)
-
-- DOM:
-  . Fixed bug GH-13988 (Storing DOMElement consume 4 times more memory in
-    PHP 8.1 than in PHP 8.0). (nielsdos)
-  . Fixed bug GH-15654 (Signed integer overflow in ext/dom/nodelist.c).
-    (nielsdos)
-
-- GD:
-  . Added gdImageClone to bundled libgd. (David Carlier)
-
-- Hash:
-  . Fixed bug GH-15742 (php_hash_sha.h incompatible with C++). (cmb)
-
-- OpenSSL:
-  . Implement GH-13514 PASSWORD_ARGON2 from OpenSSL 3.2. (Remi)
-
-- PDO:
-  . The internal header php_pdo_int.h is no longer installed; it is not
-    supposed to be used by PDO drivers. (cmb)
-
-- PDO_Firebird:
-  . Fixed GH-15604 (Always make input parameters nullable). (sim1984)
-
-- Reflection:
-  . Fixed bug GH-15718 (Segfault on ReflectionProperty::get{Hook,Hooks}() on
-    dynamic properties). (DanielEScherzer)
-
-- SOAP:
-  . Fixed bug #61525 (SOAP functions require at least one space after HTTP
-    header colon). (nielsdos)
-
-- Standard:
-  . Fixed bug GH-15552 (Signed integer overflow in ext/standard/scanf.c). (cmb)
-  . Implemented GH-15685 (improve proc_open error reporting on Windows). (cmb)
-
-- Streams:
-  . Fixed bug GH-15628 (php_stream_memory_get_buffer() not zero-terminated).
-    (cmb)
-
-29 Aug 2024, PHP 8.4.0beta4
-
-- Core:
-  . Fixed bug GH-15408 (MSan false-positve on zend_max_execution_timer).
-    (zeriyoshi)
-  . Fixed bug GH-15438 (Hooks on constructor promoted properties without
-    visibility are ignored). (ilutov)
-  . Fixed bug GH-15419 (Missing readonly+hook incompatibility check for readonly
-    classes). (ilutov)
-  . Fixed bug GH-15187 (Various hooked object iterator issues). (ilutov)
-  . Fixed bug GH-15456 (Crash in get_class_vars() on virtual properties).
-    (ilutov)
-  . Fixed bug GH-15501 (Windows HAVE__H macros defined to 1 or
-    undefined). (Peter Kokot)
-  . Fixed bug GH-15565 (--disable-ipv6 during compilation produces error
-    EAI_SYSTEM not found). (nielsdos)
-  . Implemented asymmetric visibility for properties. (ilutov)
-
-- Curl:
-  . Added CURLOPT_PREREQFUNCTION Curl option to set a custom callback
-    after the connection is established, but before the request is
-    performed. (Ayesh Karunaratne)
-  . Added CURLOPT_SERVER_RESPONSE_TIMEOUT, which was formerly known as
-    CURLOPT_FTP_RESPONSE_TIMEOUT. (Ayesh Karunaratne)
-
-- Date:
-  . Fixed bug GH-13773 (DatePeriod not taking into account microseconds for end
-    date). (Mark Bennewitz, Derick)
-
-- DOM:
-  . Fixed bug GH-15551 (Segmentation fault (access null pointer) in
-    ext/dom/xml_common.h). (nielsdos)
-  . Fixed bug GH-15570 (Segmentation fault (access null pointer) in
-    ext/dom/html5_serializer.c). (nielsdos)
-
-- FPM:
-  . Added memory peak to the scoreboard / status page. (Flávio Heleno)
-
-- MySQLnd:
-  . Fixed bug GH-15432 (Heap corruption when querying a vector). (cmb,
-    Kamil Tekiela)
-
-- Opcache:
-  . Fixed bug GH-15490 (Building of callgraph modifies preloaded symbols).
-    (ilutov)
-  . Fixed bug GH-15178 (Assertion in tracing JIT on hooks). (ilutov)
-
-- PDO_MYSQL:
-  . mysqlnd: support ER_CLIENT_INTERACTION_TIMEOUT. (Appla)
-
-- Session:
-  . Emit warnings for non-positive values of session.gc_divisor and negative values
-    of session.gc_probability. (Jorg Sowa)
-
-- Standard:
-  . The "allowed_classes" option for unserialize() now throws TypeErrors and
-    ValueErrors	if it is not an	array of class names. (Girgias)
-
-- Streams:
-  . Fixed bug GH-14930 (Custom stream wrapper dir_readdir output truncated to
-    255 characters in PHP 8.3). (Joe Cai)
-
-
-15 Aug 2024, PHP 8.4.0beta3
-
-- Core:
-  . Exiting a namespace now clears seen symbols. (ilutov)
-  . The exit (and die) language constructs now behave more like a function.
-    They can be passed liked callables, are affected by the strict_types
-    declare statement, and now perform the usual type coercions instead of
-    casting any non-integer value to a string.
-    As such, passing invalid types to exit/die may now result in a TypeError
-    being thrown. (Girgias)
-
-- CURL:
-  . Added CURLOPT_TCP_KEEPCNT to set the number of probes to send before
-    dropping the connection. (David Carlier)
-
-- Hash:
-  . Fix GH-15384 (Build fails on Alpine / Musl for amd64). (timwolla)
-
-- Sockets:
-  . Added SO_BINDTOIFINDEX to bind a socket to an interface index.
-    (David Carlier)
-
-- Standard:
-  . php_uname() now throws ValueErrors on invalid inputs. (Girgias)
-
-15 Aug 2024, PHP 8.4.0beta1
-
-- Core:
-  . Updated build system scripts config.guess to 2024-07-27 and config.sub to
-    2024-05-27. (Peter Kokot)
-  . Fixed bug GH-15240 (Infinite recursion in trait hook). (ilutov)
-  . Fixed bug GH-15140 (Missing variance check for abstract set with asymmetric
-    type). (ilutov)
-  . Fixed bug GH-15181 (Disabled output handler is flushed again). (cmb)
-  . Passing E_USER_ERROR to trigger_error() is now deprecated. (Girgias)
-  . Fixed bug GH-15292 (Dynamic AVX detection is broken for MSVC). (nielsdos)
-  . Using "_" as a class name is now deprecated. (Girgias)
-
-- Curl:
-  . Added constants CURL_HTTP_VERSION_3 (libcurl 7.66) and CURL_HTTP_VERSION_3ONLY
-    (libcurl 7.88) as options for CURLOPT_HTTP_VERSION (Ayesh Karunaratne)
-
-- Date:
-  . Constants SUNFUNCS_RET_TIMESTAMP, SUNFUNCS_RET_STRING, and SUNFUNCS_RET_DOUBLE
-    are now deprecated. (Jorg Sowa)
-
-- DBA:
-  . Passing null or false to dba_key_split() is deprecated. (Grigias)
-
-- DOM:
-  . Fixed bug GH-15192 (Segmentation fault in dom extension
-    (html5_serializer)). (nielsdos)
-  . Deprecated DOM_PHP_ERR constant. (nielsdos)
-  . Removed DOMImplementation::getFeature(). (nielsdos)
-  . Fixed bug GH-15331 (Element::$substitutedNodeValue test failed). (nielsdos)
-
-- Hash:
-  . Deprecated passing incorrect data types for options to ext/hash functions.
-    (nielsdos)
-  . Added SSE2 and SHA-NI implementation of SHA-256. (timwolla, Colin Percival,
-    Graham Percival)
-
-- Mysqli:
-  . The mysqli_ping() function and mysqli::ping() method are now deprecated,
-    as the reconnect feature was removed in PHP 8.2. (Kamil Tekiela)
-  . The mysqli_kill() function and mysqli::kill() method are now deprecated.
-    If this functionality is needed a SQL "KILL" command can be used instead.
-    (Kamil Tekiela)
-  . The mysqli_refresh() function and mysqli::refresh() method are now deprecated.
-    If this functionality is needed a SQL "FLUSH" command can be used instead.
-    (Kamil Tekiela)
-  . Passing explicitly the $mode parameter to mysqli_store_result() has been
-    deprecated. As the MYSQLI_STORE_RESULT_COPY_DATA constant was only used in
-    conjunction with this function it has also been deprecated. (Girgias)
-
-- PDO_Firebird:
-  . Support proper formatting of time zone types. (sim1984)
-
-- PHPDBG:
-  . array out of bounds, stack overflow handled for segfault handler on windows.
-    (David Carlier)
-
-- Random:
-  . lcg_value() is now deprecated. (timwolla)
-
-- Readline:
-  . Fixed bug #51558 (Shared readline build fails). (Peter Kokot)
-
-- Session:
-  . INI settings session.sid_length and session.sid_bits_per_character are now
-    deprecated. (timwolla)
-
-- SOAP:
-  . Passing an int to SoapServer::addFunction() is now deprecated.
-    If all PHP functions need to be provided flatten the array returned by
-    get_defined_functions(). (Girgias)
-  . The SOAP_FUNCTIONS_ALL constant is now deprecated. (Girgias)
-
-- Sockets:
-  . Added IP_PORTRANGE* constants for BSD systems to control ephemeral port
-    ranges. (David Carlier)
-  . Added SOCK_NONBLOCK/SOCK_CLOEXEC constants for socket_create and
-    socket_create_pair to apply O_NONBLOCK/O_CLOEXEC flags to the
-    newly created sockets. (David Carlier)
-
-- SPL:
-  . The SplFixedArray::__wakeup() method has been deprecated as it implements
-    __serialize() and __unserialize() which need to be overwritten instead.
-    (TysonAndre)
-  . Passing a non-empty string for the $enclosure parameter of:
-    - SplFileObject::setCsvControl()
-    - SplFileObject::fputcsv()
-    - SplFileObject::fgetcsv()
-    is now deprecated. (Girgias)
-
-- Standard:
-  . Unserializing the uppercase 'S' tag is now deprecated. (timwolla)
-  . Enables crc32 auxiliary detection on OpenBSD. (David Carlier)
-  . Passing a non-empty string for the $enclosure parameter of:
-    - fputcsv()
-    - fgetcsv()
-    - str_getcsv()
-    is now deprecated. (Girgias)
-  . The str_getcsv() function now throws ValueErrors when the $separator and
-    $enclosure arguments are not one byte long, or if the $escape is not one
-    byte long or the empty string. This aligns the behaviour to be identical
-    to that of fputcsv() and fgetcsv(). (Girgias)
-
-- Streams:
-  . Implemented GH-15155 (Stream context is lost when custom stream wrapper is
-    being filtered). (Quentin Dreyer)
-
-- XML:
-  . The xml_set_object() function has been deprecated. (Girgias)
-  . Passing non-callable strings to the xml_set_*_handler() functions is now
-    deprecated. (Girgias)
-
-01 Aug 2024, PHP 8.4.0alpha4
-
-- GMP:
-  . RFC: Change GMP bool cast behavior. (Saki Takamachi)
-
-01 Aug 2024, PHP 8.4.0alpha3
-
-- Core:
-  . Fix GH-14978 (The xmlreader extension phpize build). (Peter Kokot)
-  . Throw Error exception when encountering recursion during comparison, rather
-    than fatal error. (ilutov)
-  . Added missing cstddef include for C++ builds. (cmb)
-  . Fixed bug GH-15108 (Segfault when destroying generator during shutdown).
-    (Arnaud)
-  . Fixed bug GH-15275 (Crash during GC of suspended generator delegate).
-    (Arnaud)
-
-- BCMath:
-  . Adjust bcround()'s $mode parameter to only accept the RoundingMode
-    enum. (timwolla, saki)
-
-- DOM:
-  . Fix trampoline leak in xpath callables. (nielsdos)
-  . Throw instead of silently failing when creating a too long text node in
-    (DOM)ParentNode and (DOM)ChildNode. (nielsdos)
-
-- FPM:
-  . /dev/poll events.mechanism for Solaris/Illumos setting had been retired.
-    (David Carlier)
-
-- GMP:
-  . The GMP class is now final and cannot be extended anymore. (Girgias)
-
-- Intl:
-  . Added SpoofChecker::setAllowedChars to set unicode chars ranges.
-    (David Carlier)
-  . Fixed bug GH-15087 (IntlChar::foldCase()'s $option is not optional). (cmb)
-
-- Opcache:
-  . Fixed bug GH-13775 (Memory leak possibly related to opcache SHM placement).
-    (Arnaud, nielsdos)
-
-- OpenSSL:
-  . Bumped minimum required OpenSSL version to 1.1.0. (cmb)
-
-- PDO_FIREBIRD:
-  . Added Pdo\Firebird::ATTR_API_VERSION. (SakiTakamachi)
-  . Added getApiVersion() and removed from getAttribute().
-    (SakiTakamachi)
-  . Supported Firebird 4.0 datatypes. (sim1984)
-
-- PGSQL:
-  . pg_convert/pg_insert/pg_update/pg_delete ; regexes are now cached.
-    (David Carlier)
-
-- Random:
-  . Fixed bug GH-15094 (php_random_default_engine() is not C++ conforming).
-    (cmb)
-
-- Readline:
-  . Fixed readline_info, rl_line_buffer_length/rl_len globals on update.
-    (David Carlier)
-
-- Standard:
-  . Fix references in request_parse_body() options array. (nielsdos)
-  . Add RoundingMode enum. (timwolla, saki)
-
-- Tidy:
-  . Failures in the constructor now throw exceptions rather than emitting
-    warnings and having a broken object. (nielsdos)
-  . Add tidyNode::getNextSibling() and tidyNode::getPreviousSibling().
-    (nielsdos)
-
-- XMLReader:
-  . Fixed bug GH-15123 (var_dump doesn't actually work on XMLReader).
-    (nielsdos)
-
-- XSL:
-  . Fix trampoline leak in xpath callables. (nielsdos)
-
-18 Jul 2024, PHP 8.4.0alpha2
-
-- Core:
-  . Fixed bug GH-14801 (Fix build for armv7). (andypost)
-  . Implemented property hooks RFC. (ilutov)
-
-- DOM:
-  . Improve support for template elements. (nielsdos)
-
-- GD:
-  . Check overflow/underflow for imagescale/imagefilter. (David Carlier)
-
-- LibXML:
-  . Added LIBXML_NO_XXE constant. (nielsdos)
-
-- Opcache:
-  . Fixed bug GH-14873 (PHP 8.4 min function fails on typed integer).
-    (nielsdos)
-
-- PDO:
-  . Fixed bug GH-14792 (Compilation failure on pdo_* extensions).
-    (Peter Kokot)
-
-- Standard:
-  . Change highlight_string() and print_r() return type to string|true. (Ayesh)
-
-- Windows:
-  . Update the icon of the Windows executables, e.g. php.exe. (Ayesh,
-    Nurudin Imširović)
-
-- XML:
-  . Fixed bug #81481 (xml_get_current_byte_index limited to 32-bit numbers on
-    64-bit builds). (nielsdos)
-
-04 Jul 2024, PHP 8.4.0alpha1
-
-- BCMath:
-  . [RFC] Add bcfloor, bcceil and bcround to BCMath. (Saki Takamachi)
-  . Improve performance. (Saki Takamachi, nielsdos)
-
-- Core:
-  . Added zend_call_stack_get implementation for NetBSD, DragonFlyBSD,
-    Solaris and Haiku. (David Carlier)
-  . Enabled ifunc checks on FreeBSD from the 12.x releases. (Freaky)
-  . Changed the type of PHP_DEBUG and PHP_ZTS constants to bool. (haszi)
-  . Fixed bug GH-13142 (Undefined variable name is shortened when contains \0).
-    (nielsdos)
-  . Fixed bug GH-13178 (Iterator positions incorrect when converting packed
-    array to hashed). (ilutov)
-  . Fixed zend fiber build for solaris default mode (32 bits). (David Carlier)
-  . Fixed zend call stack size for macOs/arm64. (David Carlier)
-  . Added support for Zend Max Execution Timers on FreeBSD. (Kévin Dunglas)
-  . Ensure fiber stack is not backed by THP. (crrodriguez)
-  . Implement GH-13609 (Dump wrapped object in WeakReference class). (nielsdos)
-  . Added sparc64 arch assembly support for zend fiber. (Claudio Jeker)
-  . Fixed GH-13581 no space available for TLS on NetBSD. (Paul Ripke)
-  . Added fiber Sys-V loongarch64 support. (qiangxuhui)
-  . Adjusted closure names to include the parent function's name. (timwolla)
-  . Improve randomness of uploaded file names and files created by tempnam().
-    (Arnaud)
-  . Added gc and shutdown callbacks to zend_mm custom handlers.
-    (Florian Engelhardt)
-  . Fixed bug GH-14650 (Compute the size of pages before allocating memory).
-    (Julien Voisin)
-  . Fixed bug GH-11928 (The --enable-re2c-cgoto doesn't add the -g flag).
-    (Peter Kokot)
-  . Added the #[\Deprecated] attribute. (beberlei, timwolla)
-  . Fixed GH-11389 (Allow suspending fibers in destructors). (Arnaud, trowski)
+- COM:
+  . Fix property access of PHP objects wrapped in variant. (cmb)
 
 - Curl:
-  . Deprecated the CURLOPT_BINARYTRANSFER constant. (divinity76)
-  . Bumped required libcurl version to 7.61.0. (Ayesh)
-  . Added feature_list key to the curl_version() return value. (Ayesh)
-
-- Date:
-  . Added DateTime[Immutable]::createFromTimestamp. (Marc Bennewitz)
-  . Added DateTime[Immutable]::[get|set]Microsecond. (Marc Bennewitz)
+  . Added curl_multi_get_handles(). (timwolla)
 
 - DOM:
-  . Added DOMNode::compareDocumentPosition(). (nielsdos)
-  . Implement #53655 (Improve speed of DOMNode::C14N() on large XML documents).
-    (nielsdos)
-  . Fix cloning attribute with namespace disappearing namespace. (nielsdos)
-  . Implement DOM HTML5 parsing and serialization RFC. (nielsdos)
-  . Fix DOMElement->prefix with empty string creates bogus prefix. (nielsdos)
-  . Handle OOM more consistently. (nielsdos)
-  . Implemented "Improve callbacks in ext/dom and ext/xsl" RFC. (nielsdos)
-  . Added DOMXPath::quote() static method. (divinity76)
-  . Implemented opt-in ext/dom spec compliance RFC. (nielsdos)
-  . Fixed bug #79701 (getElementById does not correctly work with duplicate
-    definitions). (nielsdos)
-  . Implemented "New ext-dom features in PHP 8.4" RFC. (nielsdos)
-  . Fixed GH-14698 (segfault on DOM node dereference). (David Carlier)
-
-- Fileinfo:
-  . Update to libmagic 5.45. (nielsdos)
-  . Fixed bug #65106 (PHP fails to compile ext/fileinfo). (Guillaume Outters)
-
-- FPM:
-  . Implement GH-12385 (flush headers without body when calling flush()).
-    (nielsdos)
-  . Added DragonFlyBSD system to the list which set FPM_BACKLOG_DEFAULT
-    to SOMAXCONN. (David Carlier)
-
-- FTP:
-  . Removed the deprecated inet_ntoa call support. (David Carlier)
-  . Fixed bug #63937 (Upload speed 10 times slower with PHP). (nielsdos)
-
-- GD:
-  . Fix parameter numbers and missing alpha check for imagecolorset().
-    (Giovanni Giacobbi)
-  . imagepng/imagejpeg/imagewep/imageavif now throw an exception on
-    invalid quality parameter. (David Carlier)
-
-- Gettext:
-  . bind_textdomain_codeset, textdomain and d(*)gettext functions
-    now throw an exception on empty domain. (David Carlier)
-
-- Hash:
-  . Changed return type of hash_update() to true. (nielsdos)
-  . Added HashContext::__debugInfo(). (timwolla)
-
-- IMAP:
-  . Moved to PECL. (Derick Rethans)
-
-- Intl:
-  . Added IntlDateFormatter::PATTERN constant. (David Carlier)
-  . Fixed Numberformatter::__construct when the locale is invalid, now
-    throws an exception. (David Carlier)
-  . Added NumberFormatter::ROUND_TOWARD_ZERO and ::ROUND_AWAY_FROM_ZERO as
-    aliases for ::ROUND_DOWN and ::ROUND_UP. (Jorg Sowa)
-  . Added NumberFormatter::ROUND_HALFODD. (Ayesh Karunaratne)
-  . Added PROPERTY_IDS_UNARY_OPERATOR, PROPERTY_ID_COMPAT_MATH_START and
-    PROPERTY_ID_COMPAT_MATH_CONTINUE constants. (David Carlier)
-  . Added IntlDateFormatter::getIanaID/intltz_get_iana_id method/function.
-    (David Carlier)
-  . Set to C++17 standard for icu 74 and onwards. (David Carlier)
-  . resourcebundle_get(), ResourceBundle::get(), and accessing offsets on a
-    ResourceBundle object now throw:
-    - TypeError for invalid offset types
-    - ValueError for an empty string
-    - ValueError if the integer index does not fit in a signed 32 bit integer
-  . ResourceBundle::get() now has a tentative return type of:
-    ResourceBundle|array|string|int|null
-  . Added the new Grapheme function grapheme_str_split. (youkidearitai)
-  . Added IntlDateFormatter::parseToCalendar. (David Carlier)
-
-- LDAP:
-  . Added LDAP_OPT_X_TLS_PROTOCOL_MAX/LDAP_OPT_X_TLS_PROTOCOL_TLS1_3
-    constants. (StephenWall)
-
-- LibXML:
-  . Added LIBXML_RECOVER constant. (nielsdos)
-  . libxml_set_streams_context() now throws immediately on an invalid context
-    instead of at the use-site. (nielsdos)
-
-- MBString:
-  . Added mb_trim, mb_ltrim and mb_rtrim. (Yuya Hamada)
-  . Added mb_ucfirst and mb_lcfirst. (Yuya Hamada)
-  . Updated Unicode data tables to Unicode 15.1. (Ayesh Karunaratne)
-
-- MySQLnd:
-  . Fixed bug GH-13440 (PDO quote bottleneck). (nielsdos)
-  . Fixed bug GH-10599 (Apache crash on Windows when using a self-referencing
-    anonymous function inside a class with an active mysqli connection).
-    (nielsdos)
-
-- Opcache:
-  . Added large shared segments support for FreeBSD. (David Carlier)
-  . If JIT is enabled, PHP will now exit with a fatal error on startup in case
-    of JIT startup initialization issues. (danog)
-  . Increased the maximum value of opcache.interned_strings_buffer to 32767 on
-    64bit archs. (Arnaud)
-  . Fixed bug GH-13834 (Applying non-zero offset 36 to null pointer in
-    zend_jit.c). (nielsdos)
-  . Fixed bug GH-14361 (Deep recursion in zend_cfg.c causes segfault).
-    (nielsdos)
-
-- OpenSSL:
-  . Fixed bug #80269 (OpenSSL sets Subject wrong with extraattribs parameter).
-    (Jakub Zelenka)
-  . Implement request #48520 (openssl_csr_new - allow multiple values in DN).
-    (Jakub Zelenka)
-  . Introduced new serial_hex parameter to openssl_csr_sign. (Jakub Zelenka,
-    Florian Sowade)
-  . Added X509_PURPOSE_OCSP_HELPER and X509_PURPOSE_TIMESTAMP_SIGN constants.
-    (Vincent Jardin)
-  . Bumped minimum required OpenSSL version to 1.1.1. (Ayesh Karunaratne)
-  . Added compile-time option --with-openssl-legacy-provider to enable legacy
-    provider. (Adam Saponara)
-  . Added support for Curve25519 + Curve448 based keys. (Manuel Mausz)
-  . Fixed bug GH-13343 (openssl_x509_parse should not allow omitted seconds in
-    UTCTimes). (Jakub Zelenka)
+  . Added Dom\Element::$outerHTML. (nielsdos)
 
 - Output:
-  . Clear output handler status flags during handler initialization. (haszi)
-  . Fixed bug with url_rewriter.hosts not used by output_add_rewrite_var().
-    (haszi)
-
-- PCNTL:
-  . Added pcntl_setns for Linux. (David Carlier)
-  . Added pcntl_getcpuaffinity/pcntl_setcpuaffinity. (David Carlier)
-  . Updated pcntl_get_signal_handler signal id upper limit to be
-    more in line with platforms limits. (David Carlier)
-  . Added pcntl_getcpu for Linux/FreeBSD/Solaris/Illumos. (David Carlier)
-  . Added pcntl_getqos_class/pcntl_setqos_class for macOs. (David Carlier)
-  . Added SIGCKPT/SIGCKPTEXIT constants for DragonFlyBSD. (David Carlier)
-  . Added FreeBSD's SIGTRAP handling to pcntl_siginfo_to_zval. (David Carlier)
-  . Added POSIX pcntl_waitid. (Vladimir Vrzić)
-
-- PCRE:
-  . Upgrade bundled pcre2lib to version 10.43. (nielsdos)
-  . Add "/r" modifier. (Ayesh)
-  . Upgrade bundled pcre2lib to version 10.44. (Ayesh)
-
-- PDO:
-  . Fixed setAttribute and getAttribute. (SakiTakamachi)
-  . Implemented PDO driver-specific subclasses RFC. (danack, kocsismate)
-  . Added support for PDO driver-specific SQL parsers. (Matteo Beccati)
-
-- PDO_DBLIB:
-  . Fixed setAttribute and getAttribute. (SakiTakamachi)
-  . Added class Pdo\DbLib. (danack, kocsismate)
-
-- PDO_FIREBIRD:
-  . Fixed setAttribute and getAttribute. (SakiTakamachi)
-  . Feature: Add transaction isolation level and mode settings to pdo_firebird.
-    (SakiTakamachi)
-  . Added class Pdo\Firebird. (danack, kocsismate)
-
-- PDO_MYSQL:
-  . Fixed setAttribute and getAttribute. (SakiTakamachi)
-  . Added class Pdo\Mysql. (danack, kocsismate)
-  . Added custom SQL parser. (Matteo Beccati)
-
-- PDO_ODBC:
-  . Added class Pdo\Odbc. (danack, kocsismate)
+  . Fixed calculation of aligned buffer size. (cmb)
 
 - PDO_PGSQL:
-  . Fixed GH-12423, DSN credentials being prioritized over the user/password
-    PDO constructor arguments. (SakiTakamachi)
-  . Fixed native float support with pdo_pgsql query results. (Yurunsoft)
-  . Added class Pdo\Pgsql. (danack, kocsismate)
-  . Retrieve the memory usage of the query result resource. (KentarouTakeda)
-  . Added Pdo\Pgsql::setNoticeCallBack method to receive DB notices.
-    (outtersg)
-  . Added custom SQL parser. (Matteo Beccati)
-
-- PDO_SQLITE:
-  . Added class Pdo\Sqlite. (danack, kocsismate)
-  . Fixed bug #81227 (PDO::inTransaction reports false when in transaction).
-    (nielsdos)
-  . Added custom SQL parser. (Matteo Beccati)
+  . Added Iterable support for PDO::pgsqlCopyFromArray. (KentarouTakeda)
+  . Implement GH-15387 Pdo\Pgsql::setAttribute(PDO::ATTR_PREFETCH, 0) or
+    Pdo\Pgsql::prepare(…, [ PDO::ATTR_PREFETCH => 0 ]) make fetch() lazy
+    instead of storing the whole result set in memory (Guillaume Outters)
 
 - PGSQL:
-  . Added the possibility to have no conditions for pg_select. (OmarEmaraDev)
-  . Persistent connections support the PGSQL_CONNECT_FORCE_RENEW flag.
-    (David Carlier)
-  . Added pg_result_memory_size to get the query result memory usage.
-    (KentarouTakeda)
-  . Added pg_change_password to alter an user's password. (David Carlier)
-  . Added pg_put_copy_data/pg_put_copy_end to send COPY commands and signal
-    the end of the COPY. (David Carlier)
-  . Added pg_socket_poll to poll on the connection. (David Carlier)
-  . Added pg_jit to get infos on server JIT support. (David Carlier)
-  . Added pg_set_chunked_rows_size to fetch results per chunk. (David Carlier)
-
-- Phar:
-  . Fixed bug GH-12532 (PharData created from zip has incorrect timestamp).
-    (nielsdos)
-
-- POSIX:
-  . Added POSIX_SC_CHILD_MAX and POSIX_SC_CLK_TCK constants. (Jakub Zelenka)
-  . Updated posix_isatty to set the error number on file descriptors.
-    (David Carlier)
-
-- PSpell:
-  . Moved to PECL. (Derick Rethans)
+  . Added pg_close_stmt to close a prepared statement while allowing
+    its name to be reused. (David Carlier)
+  . Added Iterable support for pgsql_copy_from. (David Carlier)
 
-- Reflection:
-  . Implement GH-12908 (Show attribute name/class in ReflectionAttribute dump).
-    (nielsdos)
-  . Make ReflectionGenerator::getFunction() legal after generator termination.
-    (timwolla)
-  . Added ReflectionGenerator::isClosed(). (timwolla)
-
-- SimpleXML:
-  . Fixed bug GH-12192 (SimpleXML infinite loop when getName() is called
-    within foreach). (nielsdos)
-  . Fixed bug GH-12208 (SimpleXML infinite loop when a cast is used inside a
-    foreach). (nielsdos)
-  . Fixed bug #55098 (SimpleXML iteration produces infinite loop). (nielsdos)
-  . Fix signature of simplexml_import_dom(). (nielsdos)
-
-- Sockets:
-  . Added multicast group support for ipv4 on FreeBSD. (jonathan@tangential.ca)
-  . Added the TCP_SYNCNT constant for Linux to set number of attempts to send
-    SYN packets from the client. (David Carlier)
-  . Added the SO_EXCLBIND constant for exclusive socket binding on illumos/solaris.
-    (David Carlier)
-  . Updated the socket_create_listen backlog argument default value to SOMAXCONN.
-    (David Carlier)
-  . Added the SO_NOSIGPIPE constant to control the generation of SIGPIPE for
-    macOs and FreeBSD. (David Carlier)
-  . Added SO_LINGER_SEC for macOs, true equivalent of SO_LINGER in other platforms.
-    (David Carlier)
-  . Add close-on-exec on socket created with socket_accept on unixes. (David Carlier)
-
-- SNMP:
-  . Removed the deprecated inet_ntoa call support. (David Carlier)
+- Random:
+  . Moves from /dev/urandom usage to arc4random_buf on Haiku. (David Carlier)
 
 - SOAP:
-  . Add support for clark notation for namespaces in class map. (lxShaDoWxl)
-  . Mitigate #51561 (SoapServer with a extented class and using sessions,
-    lost the setPersistence()). (nielsdos)
-  . Fixed bug #49278 (SoapClient::__getLastResponseHeaders returns NULL if
-    wsdl operation !has output). (nielsdos)
-  . Fixed bug #44383 (PHP DateTime not converted to xsd:datetime). (nielsdos)
-  . Fixed bug GH-11941 (soap with session persistence will silently fail when
-    "session" built as a shared object). (nielsdos)
-
-- Sockets:
-  . Removed the deprecated inet_ntoa call support. (David Carlier)
-  . Added the SO_EXECLUSIVEADDRUSE windows constant. (David Carlier)
-  . Added the SOCK_CONN_DGRAM/SOCK_DCCP netbsd constants. (David Carlier)
-
-- Sodium:
-  . Add support for AEGIS-128L and AEGIS-256. (jedisct1)
-  . Enable AES-GCM on aarch64 with the ARM crypto extensions. (jedisct1)
-
-- SPL:
-  . Implement SeekableIterator for SplObjectStorage. (nielsdos)
-
-- Standard:
-  . Implement GH-12188 (Indication for the int size in phpinfo()). (timwolla)
-  . Partly fix GH-12143 (Incorrect round() result for 0.49999999999999994).
-    (timwolla)
-  . Fix GH-12252 (round(): Validate the rounding mode). (timwolla)
-  . Increase the default BCrypt cost to 12. (timwolla)
-  . Fixed bug GH-12592 (strcspn() odd behaviour with NUL bytes and empty mask).
-    (nielsdos)
-  . Removed the deprecated inet_ntoa call support. (David Carlier)
-  . Cast large floats that are within int range to int in number_format so
-    the precision is not lost. (Marc Bennewitz)
-  . Add support for 4 new rounding modes to the round() function. (Jorg Sowa)
-  . debug_zval_dump() now indicates whether an array is packed. (Max Semenik)
-  . Fix GH-12143 (Optimize round). (SakiTakamachi)
-  . Changed return type of long2ip to string from string|false. (Jorg Sowa)
-  . Fix GH-12143 (Extend the maximum precision round can handle by one digit).
-    (SakiTakamachi)
-  . Added the http_get_last_response_headers() and
-    http_clear_last_response_headers() that allows retrieving the same content
-    as the magic $http_response_header variable.
-  . Add php_base64_encode_ex() API. (Remi)
-  . Implemented "Raising zero to the power of negative number" RFC. (Jorg Sowa)
-  . Added array_find(), array_find_key(), array_all(), and array_any(). (josh)
-
-- XML:
-  . Added XML_OPTION_PARSE_HUGE parser option. (nielsdos)
-
-- XMLReader:
-  . Declares class constant types. (Ayesh)
-  . Add XMLReader::fromStream(), XMLReader::fromUri(), XMLReader::fromString(). (nielsdos)
+  . Fixed bug #49169 (SoapServer calls wrong function, although "SOAP action"
+    header is correct). (nielsdos)
 
 - XMLWriter:
-  . Add XMLWriter::toStream(), XMLWriter::toUri(), XMLWriter::toMemory(). (nielsdos)
+  . Improved performance and reduce memory consumption. (nielsdos)
 
 - XSL:
-  . Implement request #64137 (XSLTProcessor::setParameter() should allow both
-    quotes to be used). (nielsdos)
-  . Implemented "Improve callbacks in ext/dom and ext/xsl" RFC. (nielsdos)
-  . Added XSLTProcessor::$maxTemplateDepth and XSLTProcessor::$maxTemplateVars.
-    (nielsdos)
+  . Implement request #30622 (make $namespace parameter functional). (nielsdos)
+
+- Zlib:
+  . gzfile, gzopen and readgzfile, their "use_include_path" argument
+    is now a boolean. (David Carlier)
+
 
 <<< NOTE: Insert NEWS from last stable release here prior to actual release! >>>
diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c
index 52fbc95bbd457..4b8445542fce8 100644
--- a/TSRM/tsrm_win32.c
+++ b/TSRM/tsrm_win32.c
@@ -708,6 +708,7 @@ TSRM_API int shmget(key_t key, size_t size, int flags)
 	if (NULL != shm->descriptor && (shm->descriptor->shm_perm.key != key || size > shm->descriptor->shm_segsz)) {
 		if (NULL != shm->segment) {
 			CloseHandle(shm->segment);
+			shm->segment = INVALID_HANDLE_VALUE;
 		}
 		UnmapViewOfFile(shm->descriptor);
 		shm->descriptor = NULL;
diff --git a/UPGRADING b/UPGRADING
index 18831fdd25a9d..110080e2ee425 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -1,4 +1,4 @@
-PHP 8.4 UPGRADE NOTES
+PHP 8.5 UPGRADE NOTES
 
 1. Backward Incompatible Changes
 2. New Features
@@ -19,1088 +19,91 @@ PHP 8.4 UPGRADE NOTES
 1. Backward Incompatible Changes
 ========================================
 
-- CLI:
-  . The builtin server looks for an index file recursively by traversing parent
-    directories in case the specified file cannot be located. This process was
-    previously skipped if the path looked like it was referring to a file, i.e.
-    if the last path component contained a period. In that case, a 404 error was
-    returned. The behavior has been changed to look for an index file in all
-    cases.
+- BZ2:
+  . bzcompress() now throws a ValueError when $block_size is not between
+    1 and 9.
+  . bzcompress() now throws a ValueError when $work_factor is not between
+    0 and 250.
 
-- Core:
-  . The type of PHP_DEBUG and PHP_ZTS constants changed to bool.
-  . The name of uploaded files and files created by the tempnam() function are
-    now 13 bytes longer. Total length is platform-dependent.
-  . Encountering recursion during comparison now results in a Error exception,
-    rather than a fatal error.
-  . Indirect modification of readonly properties within __clone() is no longer
-    allowed, e.g. $ref = &$this->readonly. This was already forbidden for
-    readonly initialization, and was an oversight in the "readonly
-    reinitialization during cloning" implementation.
-  . The exit (and die) language constructs now behave more like a function.
-    They can be passed liked callables, are affected by the strict_types
-    declare statement, and now perform the usual type coercions instead of
-    casting any non-integer value to a string.
-    As such, passing invalid types to exit/die may now result in a TypeError
-    being thrown.
-    RFC: https://wiki.php.net/rfc/exit-as-function
-
-- DBA:
-  . dba_open() and dba_popen() will now return a Dba\Connection
-    object rather than a resource. Return value checks using is_resource()
-    should be replaced with checks for `false`.
-
-- DOM:
-  . Added DOMNode::compareDocumentPosition() and DOMNode::DOCUMENT_POSITION_*
-    constants.
-    If you have a method or constant with the same name, you might encounter errors
-    if the declaration is incompatible.
-  . Some DOM methods previously returned false or a PHP_ERR DOMException if a new
-    node could not be allocated. They consistently throw an INVALID_STATE_ERR
-    DOMException now. This situation is extremely unlikely though and probably
-    will not affect you. As a result DOMImplementation::createDocument() now has
-    a tentative return type of DOMDocument instead of DOMDocument|false.
-  . Previously, DOMXPath objects could be cloned, but resulted in an unusable
-    object. This is no longer possible, and cloning a DOMXPath object now throws
-    an error.
-  . DOMDocument::$actualEncoding, DOMDocument::config, DOMEntity::$actualEncoding,
-    DOMEntity::$encoding, DOMEntity::$version have been deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#formally_deprecate_soft-deprecated_domdocument_and_domentity_properties
-
-- GMP:
-  . The GMP class is now final and cannot be extended anymore.
-    RFC: https://wiki.php.net/rfc/gmp-final
-  . Casting a GMP object to bool changed so that 0 becomes false and everything else
-    becomes true.
-    RFC: https://wiki.php.net/rfc/fix_up_bcmath_number_class
-
-- Intl:
-  . resourcebundle_get(), ResourceBundle::get(), and accessing offsets on a
-    ResourceBundle object now throw:
-    - TypeError for invalid offset types
-    - ValueError for an empty string
-    - ValueError if the integer index does not fit in a signed 32 bit integer
-
-- MBString:
-  . mb_encode_numericentity() and mb_decode_numericentity() now check that
-    the $map is only composed of integers, if not a ValueError is thrown.
-  . mb_http_input() now always throws a ValueError if the $type is invalid.
-  . mb_http_output() now checks that the $encoding parameter does not
-    contain any null bytes. If it does, a ValueError is now thrown.
-  . On invalid strings (those with encoding errors), mb_substr() now interprets
-    character indices in the same manner as most other mbstring functions. This
-    means that character indices returned by mb_strpos() can be passed to mb_substr().
-  . For SJIS-Mac (MacJapanese) strings, character indices passed to mb_substr() now
-    refer to the indices of the Unicode codepoints which are produced when the string
-    is converted to Unicode. This is significant because around 40 SJIS-Mac characters
-    convert to a sequence of multiple Unicode codepoints.
-
-- MySQLnd:
-  . The error code reported for MySQL server wait timeouts has been changed from 2006
-    to 4031 for MySQL server versions 8.0.24 and above.
-
-- ODBC:
-  . odbc_fetch_row() returns false when a value less than or equal to 0 is
-    passed for parameter $row. Now, a warning is emitted in this case.
-  . odbc_connect() and odbc_pconnect() will now return an Odbc\Connection
-    object rather than a resource. Return value checks using is_resource()
-    should be replaced with checks for `false`.
-  . odbc_prepare(), odbc_exec(), and various other functions will now return
-    an Odbc\Result object rather than a resource. Return value checks using
-    is_resource() should be replaced with checks for `false`.
-
-- Opcache:
-  . The JIT config defaults changed from opcache.jit=tracing and
-    opcache.jit_buffer_size=0 to opcache.jit=disable and
-    opcache.jit_buffer_size=64M, respectively. This does not affect the default
-    behavior, the JIT is still disabled by default. However, it is now disabled
-    through the opcache.jit setting, rather than opcache.jit_buffer_size. This
-    may affect users who previously enabled JIT through opcache.jit_buffer_size
-    exclusively, without also specifying a JIT mode using opcache.jit. To enable
-    JIT, set the opcache.jit config value accordingly.
-  . The maximum value of the opcache.interned_strings_buffer setting on 64bit
-    architectures is now 32767 (it was previously 4095).
-  . If JIT is enabled, PHP will now exit with a fatal error on startup in case
-    of JIT startup initialization issues.
-
-- PCNTL:
-  . The functions pcntl_sigprocmask(), pcntl_sigwaitinfo() and
-    pcntl_sigtimedwait() now throw:
-    - A ValueError if the $signals array is empty (except for
-      pcntl_sigprocmask() if the $mode is SIG_SETMASK).
-    - A TypeError if a value of the $signals array is not an integer
-    - A ValueError if a value of the $signals array is not a valid signal number
-    Moreover, those functions now always return false on failure.
-    In some case previously it could return the value -1.
-  . The function pcntl_sigprocmask() will also now throw:
-    - A ValueError if $mode is not one of SIG_BLOCK, SIG_UNBLOCK, or SIG_SETMASK
-  . The function pcntl_sigtimedwait() will also now throw:
-    - A ValueError if $seconds is less than 0
-    - A ValueError if $nanoseconds is less than 0 or greater than 1e9
-    - A ValueError if both $seconds and $nanoseconds are 0
-
-- PCRE:
-  . The bundled pcre2lib has been updated to version 10.44.
-    As a consequence, this means {,3} is now recognized as a quantifier instead
-    of as text. Furthermore, the meaning of some character classes in UCP mode
-    has changed. Consult https://github.com/PCRE2Project/pcre2/blob/master/NEWS
-    for a full changelog.
-
-- PDO_DBLIB:
-  . setAttribute, DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER and DBLIB_ATTR_DATETIME_CONVERT
-    have been changed to set value as a bool.
-
-- PDO_FIREBIRD:
-  . Since some Firebird C++ APIs are used now, this extension requires a C++
-    compiler to be built. This also implies that the extension has to be built
-    against fbclient 3.0 or higher.
-  . getAttribute, ATTR_AUTOCOMMIT has been changed to get the value as a bool.
-
-- PDO_MYSQL:
-  . getAttribute, ATTR_AUTOCOMMIT, ATTR_EMULATE_PREPARES, MYSQL_ATTR_DIRECT_QUERY have
-    been changed to get values as bool.
-
-- PDO_PGSQL:
-  . The DSN's credentials, when set, are given priority over their PDO
-    constructor counterparts, being closer to the documentation states.
-
-- Reflection:
-  . Added methods ReflectionClass::newLazyGhost(),
-    ReflectionClass::newLazyProxy(), ReflectionClass::resetAsLazyGhost(),
-    ReflectionClass::resetAsLazyProxy(),
-    ReflectionClass::isUninitializedLazyObject(),
-    ReflectionClass::initializeLazyObject(),
-    ReflectionClass::markLazyObjectAsInitialized(),
-    ReflectionClass::getLazyInitializer(),
-    ReflectionProperty::skipLazyInitialization(),
-    ReflectionProperty::setRawValueWithoutLazyInitialization() and constants
-    ReflectionClass::SKIP_*.
-    If you have a method or constant with the same name, you might encounter
-    errors if the declaration is incompatible.
-
-- SimpleXML:
-  . Get methods called, or casting to a string on a SimpleXMLElement will no
-    longer implicitly reset the iterator data, unless explicitly rewound.
-    For example, casting an element to a string within a foreach loop would
-    cause an infinite loop because it destroyed the current iterator data.
-    This is no longer the case as a consequence of the bugfixes for GH-12192,
-    GH-12208, #55098.
-  . Calling simplexml_import_dom() with a non-XML object now throws a TypeError
-    instead of a ValueError.
-
-- SOAP:
-  . SoapClient::$httpurl is now a Soap\Url object rather than a resource.
-    Checks using is_resource() (i.e. is_resource($client->httpurl)) should be
-    replaced with checks for null (i.e. $client->httpurl !== null).
-  . SoapClient::$sdl is now a Soap\Sdl object rather than a resource.
-    Checks using is_resource() (i.e. is_resource($client->sdl)) should be
-    replaced with checks for null (i.e. $client->sdl !== null).
-  . SoapClient::$typemap is now an array rather than a resource.
-    Checks using is_resource() (i.e. is_resource($client->typemap)) should be
-    replaced with checks for null (i.e. $client->typemap !== null).
-  . The SOAP extension gained an optional dependency on the session extension.
-    If you build PHP without the session extension and with --enable-rtld-now,
-    you will experience errors on startup if you also use the SOAP extension.
-    To solve this, either don't use rtld-now or load the session extension.
+- LDAP:
+  . ldap_get_option() and ldap_set_option() now throw a ValueError when
+    passing an invalid option.
 
 - SPL:
-  . Out of bounds accesses in SplFixedArray now throw an exception of type
-    OutOfBoundsException instead of RuntimeException. As OutOfBoundsException
-    is a child class of RuntimeException, code that uses RuntimeException
-    continues to function.
-
-- Standard:
-  . round() now validates the value of the $mode parameter and throws a ValueError
-    for invalid modes. Previously invalid modes would have been interpreted as
-    PHP_ROUND_HALF_UP.
-  . strcspn() with empty $characters now returns the length of the string instead
-    of incorrectly stopping at the first NUL character. See GH-12592.
-  . The str_getcsv() function now throws ValueErrors when the $separator and
-    $enclosure arguments are not one byte long, or if the $escape is not one
-    byte long or the empty string. This aligns the behaviour to be identical
-    to that of fputcsv() and fgetcsv().
-  . php_uname() now throws ValueErrors on invalid inputs.
-  . The "allowed_classes" option for unserialize() now throws TypeErrors and
-    ValueErrors if it is not an array of class names.
-
-- Tidy:
-  . Failures in the constructor now throw exceptions rather than emitting
-    warnings and having a broken object.
-
-- XML:
-  . The xml_set_*_handler() functions now declare and check for an effective
-    signature of callable|string|null for the $handler parameters.
-    Moreover, values of type string that correspond to method names,
-    of object set with xml_set_object() are now checked to see if the method
-    exists on the class of the previously passed object.
-    This means that xml_set_object() must now always be called prior to setting
-    method names as callables.
-    Passing an empty string to disable the handler is still allowed,
-    but deprecated.
-
-- XMLReader:
-  . Passing an invalid character encoding to XMLReader::open() or
-    XMLReader::XML() now throws a ValueError. Passing a string containing NULL
-    bytes previously emitted a warning and now throws a ValueError as well.
-
-- XMLWriter:
-  . Passing a string containing NULL bytes previously emitted a warning and
-    now throws a ValueError.
-
-- XSL:
-  . XSLTProcessor::setParameter() will now throw a ValueError when its arguments
-    contain null bytes. This never actually worked correctly in the first place,
-    which is why it throws an exception nowadays.
-  . Failure to call a PHP function callback during evaluation now throws
-    instead of emitting a warning.
-    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
-  . Calling XSLTProcessor::importStyleSheet() with a non-XML object now throws
-    a TypeError instead of a ValueError.
+  . ArrayObject no longer accepts enums, as modifying the $name or $value
+    properties can break engine assumptions.
 
 ========================================
 2. New Features
 ========================================
 
-- Core:
-  . Added request_parse_body() function that allows parsing RFC1867 (multipart)
-    requests in non-POST HTTP requests.
-    RFC: https://wiki.php.net/rfc/rfc1867-non-post
-  . Getting the debug info for WeakReference will now also output the object
-    it references, or null if the reference is no longer valid.
-  . The output of Closure::__debugInfo() now includes the name, file, and line
-    of the Closure.
-  . new expressions with constructor arguments are now dereferencable, meaning
-    they allow chaining method calls, property accesses, etc. without enclosing
-    the expression in parentheses.
-    RFC: https://wiki.php.net/rfc/new_without_parentheses
-  . Added the #[\Deprecated] attribute.
-    RFC: https://wiki.php.net/rfc/deprecated_attribute
-  . Implemented property hooks.
-    RFC: https://wiki.php.net/rfc/property-hooks
-  . Exiting a namespace now clears seen symbols. This allows using a symbol in a
-    namespace block, even if a previous namespace block declared a symbol with
-    the same name.
-    See Zend/tests/use_function/ns_end_resets_seen_symbols_1.phpt.
-  . Implemented asymmetric property visibility.
-    RFC: https://wiki.php.net/rfc/asymmetric-visibility-v2
-  . Implemented lazy objects.
-    RFC: https://wiki.php.net/rfc/lazy-objects
-
-- Curl:
-  . curl_version() returns an additional feature_list value, which is an
-    associative array of all known Curl features, and whether they are
-    supported (true) or not (false).
-  . Added CURL_HTTP_VERSION_3 and CURL_HTTP_VERSION_3ONLY constants (available
-    since libcurl 7.66 and 7.88) as available options for CURLOPT_HTTP_VERSION.
-  . Added CURLOPT_PREREQFUNCTION as a Curl option that accepts a callback to
-    be called after the connection is made, but before the request is sent.
-    The callback must return either CURL_PREREQFUNC_OK or CURL_PREREQFUNC_ABORT
-    to allow or abort the request.
-  . Added CURLOPT_SERVER_RESPONSE_TIMEOUT, which was formerly known as
-    CURLOPT_FTP_RESPONSE_TIMEOUT. Both constants hold the same value.
-
-- Date:
-  . Added static methods
-    DateTime[Immutable]::createFromTimestamp(int|float $timestamp): static.
-  . Added method DateTime[Immutable]::getMicrosecond(): int.
-  . Added method
-    DateTime[Immutable]::setMicrosecond(int $microsecond): static.
-
 - DOM:
-  . Added constant DOMNode::DOCUMENT_POSITION_DISCONNECTED.
-  . Added constant DOMNode::DOCUMENT_POSITION_PRECEDING.
-  . Added constant DOMNode::DOCUMENT_POSITION_FOLLOWING.
-  . Added constant DOMNode::DOCUMENT_POSITION_CONTAINS.
-  . Added constant DOMNode::DOCUMENT_POSITION_CONTAINED_BY.
-  . Added constant DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC.
-  . It is now possible to pass any callable to registerPhpFunctions().
-    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
-
-- FPM:
-  . Flushing headers without a body will now succeed. See GH-12785.
-  . Status page has a new field to display a memory peak.
-
-- Hash:
-  . Added HashContext::__debugInfo().
-
-- Intl:
-  . NumberFormatter::ROUND_HALFODD added to complement existing
-    NumberFormatter::ROUND_HALFEVEN functionality.
-
-- OpenSSL:
-  . Added support for Curve25519 + Curve448 based keys. Specifically x25519,
-    ed25519, x448 and ed448 fields are supported in openssl_pkey_new and
-    openssl_pkey_get_details as well as openssl_sign and openssl_verify were
-    extended to support those keys.
-  . Implement PASSWORD_ARGON2 password hashing.
-    Requires OpenSSL 3.2 and NTS build.
-
-- PCRE:
-  . The bundled pcre2lib has been updated to version 10.44.
-    As a consequence, LoongArch JIT support has been added, spaces
-    are now allowed between braces in Perl-compatible items, and
-    variable-length lookbehind assertions are now supported.
-  . With pcre2lib version 10.44, the maximum length of named capture groups
-    has changed from 32 to 128.
-  . Added support for the "r" (PCRE2_EXTRA_CASELESS_RESTRICT) modifier, as well
-    as the (?r) mode modifier. When enabled along with the case-insensitive
-    modifier ("i"), the expression locks out mixing of ASCII and non-ASCII
-    characters.
-
-- PDO:
-  . Added support for driver-specific subclasses.
-    RFC: https://wiki.php.net/rfc/pdo_driver_specific_subclasses
-    This RFC adds subclasses for PDO in order to better support
-    database-specific functionalities. The new classes are
-    instantiatable either via calling the PDO::connect() method
-    or by invoking their constructor directly.
-  . Added support for driver specific SQL parsers. The default parser supports:
-    - single and double quoted literals, with doubling as escaping mechanism.
-    - two-dashes and non-nested C-style comments.
-    RFC: https://wiki.php.net/rfc/pdo_driver_specific_parsers
-
-- PDO_DBLIB:
-  . Added class Pdo\DbLib.
-
-- PDO_FIREBIRD:
-  . Added class Pdo\Firebird.
-
-- PDO_MYSQL:
-  . Added class Pdo\Mysql.
-  . Added custom parser supporting:
-    - single and double-quoted literals, with doubling and backslash as escaping
-      mechanism
-    - backtick literal identifiers and with doubling as escaping mechanism
-    - two dashes followed by at least 1 whitespace, non-nested C-style comments,
-      and hash-comments
-    RFC: https://wiki.php.net/rfc/pdo_driver_specific_parsers
-
-- PDO_ODBC:
-  . Added class Pdo\Odbc.
-
-- PDO_PGSQL:
-  . Added class Pdo\Pgsql.
-  . Added custom parser supporting:
-    - single and double quoted literals, with doubling as escaping mechanism
-    - C-style "escape" string literals (E'string')
-    - dollar-quoted string literals
-    - two-dashes and C-style comments (non-nested)
-    - support for "??" as escape sequence for the "?" operator
-    RFC: https://wiki.php.net/rfc/pdo_driver_specific_parsers
-
-- PDO_SQLITE:
-  . Added class Pdo\Sqlite.
-  . Added custom parser supporting:
-    - single, double quoted, and backtick literals, with doubling as escaping mechanism
-    - square brackets quoting for identifiers
-    - two-dashes and C-style comments (non-nested)
-    RFC: https://wiki.php.net/rfc/pdo_driver_specific_parsers
-
-- PgSQL:
-  . Added pg_result_memory_size to get the visibility the memory used by a query result.
-
-- Phar:
-  . Added support for the unix timestamp extension for zip archives.
-
-- POSIX:
-  . Added constant POSIX_SC_CHILD_MAX
-  . Added constant POSIX_SC_CLK_TCK
-
-- Readfile:
-  . Added ability to change .php_history path through PHP_HISTFILE env variable.
-
-- Reflection:
-  . ReflectionAttribute now contains a $name property to improve the debugging
-    experience.
-  . ReflectionClassConstant::__toString() and ReflectionProperty::__toString()
-    now returns the attached doc comments.
-  . ReflectionConstant was introduced.
-  . ReflectionClassConstant::isDeprecated() was introduced.
-  . ReflectionGenerator::isClosed() was introduced.
-  . Multiple methods and constants related to lazy objects were introduced:
-    - ReflectionClass::newLazyGhost()
-    - ReflectionClass::newLazyProxy()
-    - ReflectionClass::resetAsLazyGhost()
-    - ReflectionClass::resetAsLazyProxy()
-    - ReflectionClass::isUninitializedLazyObject()
-    - ReflectionClass::initializeLazyObject()
-    - ReflectionClass::markLazyObjectAsInitialized()
-    - ReflectionClass::getLazyInitializer()
-    - ReflectionProperty::skipLazyInitialization()
-    - ReflectionProperty::setRawValueWithoutLazyInitialization()
-    - ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
-    - ReflectionClass::SKIP_DESTRUCTOR
-    RFC: https://wiki.php.net/rfc/lazy-objects
-
-- SOAP:
-  . Added support for clark notation for namespaces in class map.
-    It is now possible to specify entries in a class map with clark notation
-    to resolve a type with a specific namespace to a specific class.
-    For example: '{http://example.com}foo' => 'FooClass'.
-  . Instances of DateTimeInterface that are passed to xsd:datetime or similar
-    elements are now serialized as such instead of being serialized as an
-    empty string.
-  . Session persistence now works with a shared session module.
-
-- Standard:
-  . stream_bucket_make_writeable() and stream_bucket_new() will now return a
-    StreamBucket instance instead of an instance of stdClass.
-    RFC: https://wiki.php.net/rfc/dedicated_stream_bucket
-  . Added a new RoundingMode enum with clearer naming and improved discoverability
-    compared to the PHP_ROUND_* constants.
-    RFC: https://wiki.php.net/rfc/correctly_name_the_rounding_mode_and_make_it_an_enum
+  . Added Dom\Element::$outerHTML.
 
 - XSL:
-  . It is now possible to use parameters that contain both single and double
-    quotes.
-  . It is now possible to pass any callable to registerPhpFunctions().
-    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
-  . Added XSLTProcessor::$maxTemplateDepth and XSLTProcessor::$maxTemplateVars
-    to control the recursion depth of XSL template evaluation.
+  . The $namespace argument of XSLTProcessor::getParameter(),
+    XSLTProcessor::setParameter() and XSLTProcessor::removeParameter()
+    now actually works instead of being treated as empty.
+    This only works if the $name argument does not use Clark notation
+    and is not a QName because in those cases the namespace is taken
+    from the namespace href or prefix respectively.
 
 ========================================
 3. Changes in SAPI modules
 ========================================
 
-- apache2handler
-  . Support for EOL Apache 2.0 and 2.2 has been removed. Minimum required Apache
-    version is now 2.4.
-
-- FPM:
-  . /dev/poll events.mechanism setting for Solaris/Illumos had been retired.
-
 ========================================
 4. Deprecated Functionality
 ========================================
 
-- Core:
-  . Implicitly nullable parameter types are now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecate-implicitly-nullable-types
-  . Passing E_USER_ERROR to trigger_error() is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_passing_e_user_error_to_trigger_error
-  . Using "_" as a class name is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_using_a_single_underscore_as_a_class_name
-
-- Curl:
-  . The CURLOPT_BINARYTRANSFER constant is deprecated.
-
-- Date:
-  . Calling DatePeriod::__construct(string $isostr, int $options = 0) is
-    deprecated. Use DatePeriod::createFromISO8601String() instead.
-  . Constants SUNFUNCS_RET_TIMESTAMP, SUNFUNCS_RET_STRING, and
-    SUNFUNCS_RET_DOUBLE are now deprecated, following the deprecation of
-    the associated date_sunset() and date_sunrise() functions in PHP 8.1.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#constants_sunfuncs_ret_string_sunfuncs_ret_double_sunfuncs_ret_timestamp
-
-- DBA:
-  . Passing null or false to dba_key_split() is deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_passing_null_and_false_to_dba_key_split
-
-- DOM:
-  . Deprecated DOM_PHP_ERR constant.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_dom_php_err_constant
-
-- Hash:
-  . Deprecated passing incorrect data types for options to ext/hash functions.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_passing_incorrect_data_types_for_options_to_exthash_functions
-
-- Intl:
-  . Calling intlcal_set() as well as calling IntlCalendar::set() with
-    more than 2 arguments is deprecated. Use either IntlCalendar::setDate()
-    or IntlCalendar::setDateTime() instead.
-  . Calling intlgregcal_create_instance() as well as calling
-    IntlGregorianCalendar::__construct() with more than 2 arguments is
-    deprecated. Use either IntlGregorianCalendar::createFromDate() or
-    IntlGregorianCalendar::createFromDateTime() instead.
-
-- LDAP:
-  . Calling ldap_connect() with more than 2 arguments is deprecated. Use
-    ldap_connect_wallet() instead.
-  . Calling ldap_exop() with more than 4 arguments is deprecated. Use
-    ldap_exop_sync() instead.
-
-- Mysqli:
-  . The mysqli_ping() function and mysqli::ping() method are now deprecated,
-    as the reconnect feature was removed in PHP 8.2.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#mysqli_ping_and_mysqliping
-  . The mysqli_kill() function and mysqli::kill() method are now deprecated.
-    If this functionality is needed a SQL "KILL" command can be used instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_mysqli_kill
-  . The mysqli_refresh() function and mysqli::refresh() method are now deprecated.
-    If this functionality is needed a SQL "FLUSH" command can be used instead.
-    All MYSQLI_REFRESH_* constants have been deprecated as well.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_mysqli_refresh
-  . Passing explicitly the $mode parameter to mysqli_store_result() has been
-    deprecated. As the MYSQLI_STORE_RESULT_COPY_DATA constant was only used in
-    conjunction with this function it has also been deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_the_second_parameter_to_mysqli_store_result
-
-- PDO_PGSQL:
-  . Using escaped question marks (??) inside dollar-quoted strings is deprecated.
-    Since PDO_PGSQL has its own SQL parser with dollar-quoted strings support, it
-    is no longer necessary to escape question marks inside them.
-
-- PgSQL:
-  . Calling pg_fetch_result() with 2 arguments is deprecated. Use the
-    3-parameter signature with a null $row parameter instead.
-  . Calling pg_field_prtlen() with 2 arguments is deprecated. Use the
-    3-parameter signature with a null $row parameter instead.
-  . Calling pg_field_is_null() with 2 arguments is deprecated. Use the
-    3-parameter signature with a null $row parameter instead.
-
-- Random:
-  . lcg_value() is deprecated, as the function is broken in multiple ways.
-    Use \Random\Randomizer::getFloat() instead.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_lcg_value
-
-- Reflection:
-  . Calling ReflectionMethod::__construct() with 1 argument is deprecated.
-    Use ReflectionMethod::createFromMethodName() instead.
-
-- Session:
-  . Calling session_set_save_handler() with more than 2 arguments is
-    deprecated. Use the 2-parameter signature instead.
-  . Changing the INI settings session.sid_length and session.sid_bits_per_character
-    is deprecated. Update the session storage backend to accept 32 character
-    hexadecimal session IDs and stop changing these two INI settings.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#sessionsid_length_and_sessionsid_bits_per_character
-
-- SOAP:
-  . Passing an int to SoapServer::addFunction() is now deprecated.
-    If all PHP functions need to be provided flatten the array returned by
-    get_defined_functions().
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_soap_functions_all_constant_and_passing_it_to_soapserveraddfunction
-  . The SOAP_FUNCTIONS_ALL constant is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_soap_functions_all_constant_and_passing_it_to_soapserveraddfunction
-
-- SPL:
-  . The SplFixedArray::__wakeup() method has been deprecated as it implements
-    __serialize() and __unserialize() which need to be overwritten instead.
-  . Passing a non-empty string for the $enclosure parameter of:
-    - SplFileObject::setCsvControl()
-    - SplFileObject::fputcsv()
-    - SplFileObject::fgetcsv()
-    is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_proprietary_csv_escaping_mechanism
-
-- Standard:
-  . Calling stream_context_set_option() with 2 arguments is deprecated.
-    Use stream_context_set_options() instead.
-  . Raising zero to the power of negative number is deprecated.
-    RFC: https://wiki.php.net/rfc/raising_zero_to_power_of_negative_number
-  . Unserializing strings using the uppercase 'S' tag is deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#unserialize_s_s_tag
-  . Passing a non-empty string for the $enclosure parameter of:
-    - fputcsv()
-    - fgetcsv()
-    - str_getcsv()
-    is now deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#deprecate_proprietary_csv_escaping_mechanism
-
-- XML:
-  . The xml_set_object() function has been deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#xml_set_object_and_xml_set_handler_with_string_method_names
-  . Passing non-callable strings to the xml_set_*_handler() functions is now
-    deprecated.
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#xml_set_object_and_xml_set_handler_with_string_method_names
-
 ========================================
 5. Changed Functions
 ========================================
 
-- Core:
-  . trigger_error() and user_error() now have a return type of true instead of
-    bool.
-
-- Curl:
-  . curl_multi_select throws a ValueError if the timeout argument if it's negative
-    or greater than PHP_INT_MAX.
-
-- DOM:
-  . DOMDocument::registerNodeClass() now has a tentative return type of true.
-    Previously, the return type was bool but only true could be returned in practice.
-
-- GD:
-  . imagejpeg/imagewebp/imagepng/imageavif throws an exception if an invalid
-    quality parameter value is passed. In addition, imageavif will throw an exception
-    if an invalid speed parameter value is passed.
-  . imagescale throws an exception if the width/height argument underflows/overflows or
-    if the mode argument is invalid.
-    imagefilter with IMG_FILTER_SCATTER throws an exception if the sub/plus arguments
-    underflows/overflows.
-
-- Gettext:
-  . bind_textdomain_codeset, textdomain and d(*)gettext functions now throw an exception
-    if the domain argument is empty.
-
-- Hash:
-  . Changed the return type of hash_update() to true. It was already the case that only
-    true could be returned, but the stub was not updated yet.
-
-- Intl:
-  . IntlDateFormatter::__construct() throws a ValueError if the locale is invalid.
-  . NumberFormatter::__construct() throws a ValueError if the locale is invalid.
-  . NumberFormatter::ROUND_TOWARD_ZERO and NumberFormatter::ROUND_AWAY_FROM_ZERO
-    have been added as aliases for NumberFormatter::ROUND_DOWN and
-    NumberFormatter::ROUND_UP to be consistent with the new PHP_ROUND_* modes.
-    RFC: https://wiki.php.net/rfc/new_rounding_modes_to_round_function
-  . ResourceBundle::get() now has a tentative return type of:
-    ResourceBundle|array|string|int|null
-
-- LibXML:
-  . libxml_set_streams_context() now immediately throws a TypeError when a
-    non-stream-context resource is passed to the function, instead of throwing
-    later when the stream context is used.
-
-- MBString:
-  . The behavior of mb_strcut is more consistent now on invalid UTF-8 and UTF-16
-    strings. (For valid UTF-8 and UTF-16 strings, there is no change.)
-
-- ODBC:
-  . Parameter $row of odbc_fetch_object(), odbc_fetch_array(), and
-    odbc_fetch_into() now has a default value of null, consistent with
-    odbc_fetch_row(). Previously, the default values were -1, -1, and 0,
-    respectively.
-
-- OpenSSL:
-  . The extra_attributes parameter in openssl_csr_new sets CSR attributes
-    instead of subject DN which was incorrectly done previously.
-  . The dn parameter in openssl_csr_new allows setting array of values for
-    a single entry.
-  . New serial_hex parameter added to openssl_csr_sign to allow setting serial
-    number in the hexadecimal format.
-  . Parsing ASN.1 UTCTime by openssl_x509_parse fails if seconds are omitted
-    for OpenSSL version below 3.2 (-1 is returned for such fields). The
-    OpenSSL version 3.3+ does not load such certificates already.
-
-- Output:
-  . Output handler status flags passed to the flags parameter of ob_start
-    are now cleared.
-
-- PDO:
-  . getAttribute, enabled to get the value of ATTR_STRINGIFY_FETCHES.
-
-- PDO_FIREBIRD:
-  . getAttribute, enabled to get values of FB_ATTR_DATE_FORMAT, FB_ATTR_TIME_FORMAT,
-    FB_ATTR_TIMESTAMP_FORMAT.
-  . Added new attributes to specify transaction isolation level and access mode.
-    Along with these, five constants (Pdo\Firebird::TRANSACTION_ISOLATION_LEVEL,
-    Pdo\Firebird::READ_COMMITTED, Pdo\Firebird::REPEATABLE_READ,
-    Pdo\Firebird::SERIALIZABLE, Pdo\Firebird::WRITABLE_TRANSACTION) have been added.
-  . When using persistent connections, there is now a liveness check in the
-    constructor.
-  . The content that is built changes depending on the value of FB_API_VER in
-    ibase.h, so added static method Pdo\Firebird::getApiVersion() to obtain that
-    value. This value can also be referenced from phpinfo.
-  . Five new data types are now available: INT128, DEC16, DEC34, TIMESTAMP_TZ, TIME_TZ.
-    These are available starting with Firebird 4.0.
-
-- PDO_MYSQL:
-  . getAttribute, enabled to get the value of ATTR_FETCH_TABLE_NAMES.
+- Zlib:
+  . The "use_include_path" argument for the 
+    gzfile, gzopen and readgzfile functions had been changed
+    from int to boolean.
 
 - PDO_PGSQL:
-  . getAttribute() can now retrieve the memory usage of query results.
-    PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE was added for this feature.
+  . PDO::pgsqlCopyFromArray also supports inputs as Iterable.
+  . Pdo\Pgsql::setAttribute and Pdo\Pgsql::prepare supports
+    PDO::ATTR_PREFETCH sets to 0 which set to lazy fetch mode.
+    In this mode, statements cannot be run parallely.
 
 - PGSQL:
-  . pg_select, the conditions arguments accepts an empty array and is optional.
-
-- Phar:
-  . Phar::setAlias() and Phar::setDefaultStub() methods now have a tentative
-    return type of true instead of bool.
-
-- POSIX:
-  . posix_isatty now sets the error number when the file descriptor/stream argument
-    is invalid.
-
-- Reflection:
-  . ReflectionGenerator::getFunction() may now be called after the generator
-    finished executing.
-
-- Sockets:
-  . Parameter $backlog of socket_create_listen() now has a default value of SOMAXCONN.
-    Previously, it was 128.
-
-- SPL:
-  . SplPriorityQueue::insert() and SplPriorityQueue::recoverFromCorruption()
-    now has a tentative return type of true
-  . SplHeap::insert() and SplHeap::recoverFromCorruption()
-    now has a tentative return type of true instead of bool
-
-- Standard:
-  . The internal implementation for rounding to integers has been rewritten
-    to be easier to verify for correctness and to be easier to maintain.
-    Some rounding bugs have been fixed as a result of the rewrite. For
-    example previously rounding 0.49999999999999994 to the nearest integer
-    would have resulted in 1.0 instead of the correct result 0.0. Additional
-    inputs might also be affected and result in different outputs compared to
-    earlier PHP versions.
-  . The $mode parameter of the round() function has been widened to RoundingMode|int,
-    accepting instances of a new RoundingMode enum.
-    RFC: https://wiki.php.net/rfc/correctly_name_the_rounding_mode_and_make_it_an_enum
-  . Four new modes have been added to the round() function: RoundingMode::PositiveInfinity,
-    RoundingMode::NegativeInfinity, RoundingMode::TowardsZero, RoundingMode::AwayFromZero.
-    RFC: https://wiki.php.net/rfc/new_rounding_modes_to_round_function
-  . Fixed a bug caused by "pre-rounding" of the round() function. Previously, using
-    "pre-rounding" to treat a value like 0.285 (actually 0.28499999999999998) as a
-    decimal number and round it to 0.29. However, "pre-rounding" incorrectly rounds
-    certain numbers, so this fix removes "pre-rounding" and changes the way numbers
-    are compared, so that the values are correctly rounded as decimal numbers.
-  . The maximum precision that can be handled by round() has been extended by one
-    digit. For example, `round(4503599627370495.5)` returned in `4503599627370495.5`,
-    but now returns `4503599627370496`.
-  . The default value of the 'cost' option for PASSWORD_BCRYPT for password_hash()
-    has been increased from '10' to '12'.
-    RFC: https://wiki.php.net/rfc/bcrypt_cost_2023
-  . debug_zval_dump() now indicates whether an array is packed.
-  . long2ip() now returns string instead of string|false.
-  . output_add_rewrite_var() now uses url_rewriter.hosts instead of
-    session.trans_sid_hosts for selecting hosts that will be rewritten.
-  . highlight_string() now has a return type of string|true instead of string|bool.
-  . print_r() now has a return type of string|true instead of string|bool.
+  . pg_copy_from also supports inputs as Iterable.
 
 ========================================
 6. New Functions
 ========================================
 
-- BCMath:
-  . Added bcfloor(), bcceil(), bcround().
-    RFC: https://wiki.php.net/rfc/adding_bcround_bcfloor_bcceil_to_bcmath
-
-- DOM:
-  . Added DOMNode::compareDocumentPosition().
-  . Added DOMXPath::registerPhpFunctionNS().
-    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
-  . Added DOMXPath::quote() to quote a string for use in an XPath expression.
-    Example usage: "//span[contains(text()," . $xpath->quote($string) . ")]"
-
-- Intl:
-  . Added IntlDateFormatter::getIanaID()/intltz_get_iana_id() to
-    the IANA identifier from a given timezone.
-  . Added grapheme_str_split which allow to support emoji and Variation
-    Selectors.
-    RFC: https://wiki.php.net/rfc/grapheme_str_split
-  . Added IntlDateFormatter::parseToCalendar which behaves like
-    IntlDateFormatter::parse except the time zone is updated.
-  . Added SpoofChecker::setAllowedChars to limit the range of unicode
-    chars.
-
-- MBString:
-  . Added mb_trim, mb_ltrim and mb_rtrim functions.
-    RFC: https://wiki.php.net/rfc/mb_trim
-    Note: this was amended by GH-13820 to fix GH-13815.
-  . Added mb_ucfirst and mb_lcfirst functions.
-    RFC: https://wiki.php.net/rfc/mb_ucfirst
-
-- PCNTL:
-  . Added pcntl_setns allowing a process to be reassociated with a namespace in order
-    to share resources with other processes within this context.
-  . Added pcntl_getcpuaffinity to get the cpu(s) bound to a process and
-    pcntl_setcpuaffinity to bind 1 or more cpus to a process.
-  . Added pcntl_getcpu to get the cpu id from where the current process runs.
-  . Added pcntl_getqos_class to get the QoS level (aka performance and related
-    energy consumption) of the current process and pcntl_setqos_class to set it.
-  . Added pcntl_waitid to obtain status information pertaining to termination, stop,
-    and/or continue events in one of the caller's child processes.
-
-- PDO_PGSQL:
-  . Added Pdo\Pgsql::setNoticeCallback() to allow a callback to be triggered on
-    every notice sent (e.g. RAISE NOTICE).
+- Curl:
+  . curl_multi_get_handles() allows retrieving all CurlHandles current
+    attached to a CurlMultiHandle. This includes both handles added using
+    curl_multi_add_handle() and handles accepted by CURLMOPT_PUSHFUNCTION.
 
 - PGSQL:
-  . Added pg_change_password to alter a given user's password. It handles
-    transparently the password encryption from the database settings.
-  . Added pg_put_copy_data to send COPY commands and pg_put_copy_end to send
-    end-of-data to the server.
-  . Added pg_socket_poll to check if there is any read and/or write events
-    with an optional timeout.
-  . Added pg_jit to get informations on the server JIT support.
-  . Added pg_set_chunked_rows_size to allow to fetch results in chunk of
-    max N rows.
-
-- Reflection:
-  . Multiple methods related to lazy objects were introduced:
-    - ReflectionClass::newLazyGhost()
-    - ReflectionClass::newLazyProxy()
-    - ReflectionClass::resetAsLazyGhost()
-    - ReflectionClass::resetAsLazyProxy()
-    - ReflectionClass::isUninitializedLazyObject()
-    - ReflectionClass::initializeLazyObject()
-    - ReflectionClass::markLazyObjectAsInitialized()
-    - ReflectionClass::getLazyInitializer()
-    - ReflectionProperty::skipLazyInitialization()
-    - ReflectionProperty::setRawValueWithoutLazyInitialization()
-    RFC: https://wiki.php.net/rfc/lazy-objects
-
-- Sodium:
-  . Added the sodium_crypto_aead_aegis128l_*() and sodium_crypto_aead_aegis256l_*()
-    functions to support the AEGIS family of authenticated encryption algorithms,
-    that was introduced in libsodium 1.0.19.
-  . sodium_crypto_aead_aes256gcm_*() functions are now enabled on aarch64 CPUs
-    with the ARM cryptographic extensions.
-
-- SPL:
-  . Added seek() method to SplObjectStorage, now it implements
-    SeekableIterator.
-
-- Standard:
-  . Added the http_get_last_response_headers() and
-    http_clear_last_response_headers() that allows retrieving the same content
-    as the magic $http_response_header variable.
-    RFC: https://wiki.php.net/rfc/http-last-response-headers
-  . Added function fpow() following rules of IEEE 754.
-    RFC: https://wiki.php.net/rfc/raising_zero_to_power_of_negative_number
-  . Added functions array_find(), array_find_key(), array_all(), and
-    array_any().
-    RFC: https://wiki.php.net/rfc/array_find
-
-- Tidy:
-  . Added tidyNode::getNextSibling() and tidyNode::getPreviousSibling().
-
-- XMLReader:
-  . Added XMLReader::fromStream(), XMLReader::fromUri(), XMLReader::fromString().
-    RFC: https://wiki.php.net/rfc/xmlreader_writer_streams
-
-- XMLWriter:
-  . Added XMLWriter::toStream(), XMLWriter::toUri(), XMLWriter::toMemory().
-    RFC: https://wiki.php.net/rfc/xmlreader_writer_streams
-
-- XSL:
-  . Added XSLTProcessor::registerPhpFunctionNS().
-    RFC: https://wiki.php.net/rfc/improve_callbacks_dom_and_xsl
+  . pg_close_stmt offers an alternative way to close a prepared
+    statement from the DEALLOCATE sql command in that we can reuse
+    its name afterwards.
 
 ========================================
 7. New Classes and Interfaces
 ========================================
 
-- BCMath:
-  . Added BcMath\Number class. It is an immutable object, has methods that are
-    equivalent to existing BCMath calculation functions, and can also be calculated
-    using operators.
-    The existing BCMath function returned a string for each calculation, but this
-    class returns an object.
-    RFC: https://wiki.php.net/rfc/support_object_type_in_bcmath,
-    https://wiki.php.net/rfc/fix_up_bcmath_number_class
-
-- Core:
-  . New RequestParseBodyException.
-    RFC: https://wiki.php.net/rfc/rfc1867-non-post
-
-- DOM:
-  . Implemented DOM HTML5 parsing and serialization.
-    RFC: https://wiki.php.net/rfc/domdocument_html5_parser.
-    This RFC adds the new Dom namespace along with new classes and
-    constant aliases.
-    There are two new classes to handle HTML and XML documents:
-    Dom\HTMLDocument and Dom\XMLDocument.
-    These classes provide a cleaner API to handle HTML and XML documents.
-    Furthermore, the Dom\HTMLDocument class implements spec-compliant HTML5
-    parsing and serialization.
-  . Implemented opt-in ext/dom spec compliance RFC.
-    This adds new classes in the DOM namespace that correspond to modern
-    equivalents to the old DOM classes in the global namespaces.
-    The new classes follow the DOM living spec.
-    RFC: https://wiki.php.net/rfc/opt_in_dom_spec_compliance
-  . Implemented "New ext-dom features in PHP 8.4" RFC.
-    RFC: https://wiki.php.net/rfc/dom_additions_84
-
 ========================================
 8. Removed Extensions and SAPIs
 ========================================
 
-- IMAP:
-  . The IMAP extension has been unbundled and moved to PECL.
-    RFC: https://wiki.php.net/rfc/unbundle_imap_pspell_oci8
-
-- OCI8:
-  . The OCI8 extension has been unbundled and moved to PECL.
-    RFC: https://wiki.php.net/rfc/unbundle_imap_pspell_oci8
-
-- PDO_OCI:
-  . The PDO_OCI extension has been unbundled and moved to PECL.
-    RFC: https://wiki.php.net/rfc/unbundle_imap_pspell_oci8
-
-- PSpell:
-  . The pspell extension has been unbundled and moved to PECL.
-    RFC: https://wiki.php.net/rfc/unbundle_imap_pspell_oci8
-
 ========================================
 9. Other Changes to Extensions
 ========================================
 
-- Curl:
-  . The Curl extension now requires at least libcurl 7.61.0.
-  . The CURLOPT_DNS_USE_GLOBAL_CACHE Curl option no longer has any
-    effect, and is silently ignored. This underlying feature was
-    deprecated in libcurl 7.11.1 and removed in 7.62.0.
-
-- Date:
-  . The class constants are typed now.
-
-- DOM:
-  . Removed DOMImplementation::getFeature().
-    RFC: https://wiki.php.net/rfc/deprecations_php_8_4#remove_domimplementationgetfeature_feature_version
-
-- Intl:
-  . The class constants are typed now.
-  . The behaviour of Intl class has been normalized to always throw Error
-    exceptions when attempting to use a non-initialized object,
-    or when cloning fails.
-  . The idn_to_ascii() and idn_to_utf8() now always throw ValueErrors if the
-    $domain name is empty or too long, and if $variant is not
-    INTL_IDNA_VARIANT_UTS46.
-
-- LibXML:
-  . The libxml extension now requires at least libxml2 2.9.4.
-
-- MBString:
-  . Unicode data tables have been updated to Unicode 15.1.
-
-- Mysqli:
-  . The unused and undocumented constant MYSQLI_SET_CHARSET_DIR
-    has been removed.
-  . The MYSQLI_STMT_ATTR_PREFETCH_ROWS constant has been removed.
-    The feature is unavailable with mysqlnd.
-  . The MYSQLI_CURSOR_TYPE_FOR_UPDATE and MYSQLI_CURSOR_TYPE_SCROLLABLE
-    constants have been removed. This functionality was never implemented,
-    neither with mysqlnd nor with libmysql.
-  . The unused MYSQLI_TYPE_INTERVAL constant, which is currently a stub
-    and an alias for MYSQLI_TYPE_ENUM, has been removed. There are no
-    plans to add such data type to MySQL yet, so it's unclear what its value
-    would finally be.
-  . A new constant has been added: MYSQLI_TYPE_VECTOR.
-
-- Mysqlnd:
-  . Support for the new VECTOR data type from MySQL 9.
-
-- OpenSSL:
-  . The OpenSSL extension now requires at least OpenSSL 1.1.1.
-
-- PDO:
-  . The class constants are typed now.
-
-- PDO_PGSQL:
-  . The pdo_pgsql extension now requires at least libpq 10.0.
-
-- PgSQL:
-  . The pgsql extension now requires at least libpq 10.0.
-
-- Reflection:
-  . The class constants are typed now.
-
-- Spl:
-  . The class constants are typed now.
-
-- Sqlite:
-  . The class constants are typed now.
-
-- XMLReader:
-  . The class constants are typed now.
-
-- XSL:
-  . The typed properties XSLTProcessor::$cloneDocument and
-    XSLTProcessor::$doXInclude are now declared.
-
-- zlib:
-  . The zlib extension now requires at least zlib 1.2.11.
-
 ========================================
 10. New Global Constants
 ========================================
 
-- Core:
-  . PHP_OUTPUT_HANDLER_PROCESSED.
-  . PHP_SBINDIR.
-
-- Curl:
-  . CURL_HTTP_VERSION_3.
-  . CURL_HTTP_VERSION_3ONLY.
-  . CURL_TCP_KEEPCNT.
-  . CURLOPT_PREREQFUNCTION.
-  . CURL_PREREQFUNC_OK.
-  . CURL_PREREQFUNC_ABORT.
-  . CURLOPT_SERVER_RESPONSE_TIMEOUT.
-
-- Intl:
-  . The IntlDateFormatter class exposes now the new PATTERN constant
-    reflecting udat api's UDAT_PATTERN.
-  . The IntlChar class exposes now the new PROPERTY_IDS_UNARY_OPERATOR (new
-    IDS binary operator), PROPERTY_ID_COMPAT_MATH_START,
-    PROPERTY_ID_COMPAT_MATH_CONTINUE (both for mathematical
-    identifier profiling purpose) constants.
-
-- LDAP:
-  . LDAP_OPT_X_TLS_PROTOCOL_MAX.
-  . LDAP_OPT_X_TLS_PROTOCOL_TLS1_3.
-
-- LibXML:
-  . LIBXML_RECOVER.
-  . LIBXML_NO_XXE.
-    This is used together with LIBXML_NOENT for when you want to perform entity
-    substitution, but want to disallow external entity loading.
-    This constant is available as of libxml2 2.13.
-
-- Mysqli:
-  . MYSQLI_TYPE_VECTOR.
-
-- OpenSSL:
-  . X509_PURPOSE_OCSP_HELPER.
-  . X509_PURPOSE_TIMESTAMP_SIGN.
-
-- PCNTL:
-  . Pcntl\QosClass::Background (macOs only).
-  . Pcntl\QosClass::Default (macOs only).
-  . Pctnl\QosClass::UserInteractive (macOs only).
-  . Pcntl\QosClass::UserInitiated (macOs only).
-  . Pcntl\QosClass::Utility (macOs only).
-  . SIGCKPT (DragonFlyBSD only).
-  . SIGCKPTEXIT (DragonFlyBSD only).
-  . WEXITED.
-  . WSTOPPED.
-  . WNOWAIT.
-  . P_ALL.
-  . P_PID.
-  . P_PGID.
-  . P_PIDFD (Linux only).
-  . P_UID (NetBSD/FreeBSD only).
-  . P_GID (NetBSD/FreeBSD only).
-  . P_SID (NetBSD/FreeBSD only).
-  . P_JAILID (FreeBSD only).
-
-- PgSQL:
-  . PGSQL_TUPLES_CHUNK
-
-- Sockets:
-  . SO_EXCLUSIVEADDRUSE (Windows only).
-  . SOCK_CONN_DGRAM (NetBSD only).
-  . SOCK_DCCP (NetBSD only).
-  . TCP_SYNCNT (Linux only).
-  . SO_EXCLBIND (Solaris/Illumos only).
-  . SO_NOSIGPIPE (macOs and FreeBSD).
-  . SO_LINGER_SEC (macOs only).
-  . IP_PORTRANGE (FreeBSD/NetBSD/OpenBSD only).
-  . IP_PORTRANGE_DEFAULT (FreeBSD/NetBSD/OpenBSD only).
-  . IP_PORTRANGE_HIGH (FreeBSD/NetBSD/OpenBSD only).
-  . IP_PORTRANGE_LOW (FreeBSD/NetBSD/OpenBSD only).
-  . SOCK_NONBLOCK.
-  . SOCK_CLOEXEC.
-  . SO_BINDTOIFINDEX.
-
-- Sodium:
-  . SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES
-  . SODIUM_CRYPTO_AEAD_AEGIS128L_NSECBYTES
-  . SODIUM_CRYPTO_AEAD_AEGIS128L_NPUBBYTES
-  . SODIUM_CRYPTO_AEAD_AEGIS128L_ABYTES
-  . SODIUM_CRYPTO_AEAD_AEGIS256_KEYBYTES
-  . SODIUM_CRYPTO_AEAD_AEGIS256_NSECBYTES
-  . SODIUM_CRYPTO_AEAD_AEGIS256_NPUBBYTES
-  . SODIUM_CRYPTO_AEAD_AEGIS256_ABYTES
-
-- XML:
-  . Added XML_OPTION_PARSE_HUGE to allow large inputs in xml_parse and
-    xml_parse_into_struct.
-    RFC: https://wiki.php.net/rfc/xml_option_parse_huge.
-
 ========================================
 11. Changes to INI File Handling
 ========================================
@@ -1109,81 +112,17 @@ PHP 8.4 UPGRADE NOTES
 12. Windows Support
 ========================================
 
-* Building with Visual Studio now requires at least Visual Studio 2019 (Visual
-  Studio 2022 is recommended, though).
-
-* Native AVX-512 builds are now supported (--enable-native-intrinsics=avx512).
+* The configuration variables PHP_VERSION, PHP_MINOR_VERSION, and
+  PHP_RELEASE_VERSION are now always numbers.  Previously, they have been
+  strings for buildconf builds.
 
 ========================================
 13. Other Changes
 ========================================
 
-* Closure names have been adjusted to include the parent function's name
-  and the line of definition to make them easier to distinguish, for example
-  within stack traces.
-
-* run-tests.php now skips online tests by default. Set the SKIP_ONLINE_TESTS
-  environment variable to 0, or pass the --online flag to run-tests.php to
-  execute them.
-
-* Fiber switching during destructor execution is now allowed. It was previously
-  blocked due to conflicts with garbage collection.
-
-  Destructors may now be executed in a separate Fiber:
-
-  When garbage collection is triggered in a Fiber, destructors called by the GC
-  are executed in a separate Fiber: the gc_destructor_fiber. If this Fiber
-  suspends, a new one is created to execute the remaining destructors. The
-  previous gc_destructor_fiber is not referenced anymore by the GC and may be
-  collected if it's not referenced anywhere else. Objects whose destructor is
-  suspended will not be collected until the destructor returns or the Fiber is
-  collected.
-
 ========================================
 14. Performance Improvements
 ========================================
 
-- BCMath:
-  . Improved performance of number conversions and operations.
-
-- Core:
-  . Improved the performance of floating point number parsing and formatting in
-    ZTS builds under highly concurrent loads. This affects the `printf()` family
-    of functions as well as serialization functions such as `json_encode()`,
-    `serialize()`.
-
-- DOM:
-  . The performance of DOMNode::C14N() is greatly improved for the case without
-    an xpath query. This can give a time improvement of easily two order of
-    magnitude for documents with tens of thousands of nodes.
-  . Improved performance and reduce memory consumption of XML serialization.
-  . Reduced memory usage of node classes.
-
-- FTP:
-  . Improved the performance of FTP uploads up to a factor of 10x for large
-    uploads.
-
-- Hash:
-  . Added SSE2 and SHA-NI implementations of SHA-256. This improves the performance
-    on supported CPUs by ~1.3x (SSE2) and 3x - 5x (SHA-NI).
-
-- MBString:
-  . The performance of strspn() and strcspn() is greatly improved.
-    They now run in linear time instead of being bounded by quadratic time.
-  . mb_strcut() is much faster now for UTF-8 and UTF-16 strings.
-  . Looking up mbstring encoding names is much faster now.
-  . The performance of converting SJIS-win to unicode is greatly improved.
-
-- MySQLnd:
-  . Improved the performance of MySQLnd quoting.
-
-- PCRE:
-  . Improved the performance of named capture groups.
-
-- SimpleXML:
-  . Improved performance and reduce memory consumption of XML serialization.
-
-- Standard:
-  . Improved the performance of strpbrk().
-  . get_browser() is much faster now, up to 1.5x - 2.5x for some test cases.
-
+- XMLWriter:
+  . Improved performance and reduce memory consumption.
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index 55dcc9033e21e..5f1647f8e45f6 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -1,4 +1,4 @@
-PHP 8.4 INTERNALS UPGRADE NOTES
+PHP 8.5 INTERNALS UPGRADE NOTES
 
 1. Internal API changes
 
@@ -14,401 +14,18 @@ PHP 8.4 INTERNALS UPGRADE NOTES
 1. Internal API changes
 ========================
 
-* zend_register_module_ex() now takes an additional int module_type argument.
-  This function will also assign the module number and type, there is no need
-  to do this at the call site anymore. Writing the handle should happen after
-  successful registration.
-
-* ZPP now accepts a F or Z_PARAM_FUNC_NO_TRAMPOLINE_FREE type check.
-  This is identical to the 'f' or Z_PARAM_FUNC type check, except the FCC is
-  always initialized because it doesn't free trampolines.
-  Trampolines MUST be freed using zend_release_fcall_info_cache() or consumed.
-  Z_PARAM_FUNC_EX2 was added as well with the same arguments as Z_PARAM_FUNC_EX
-  plus an additional argument free_trampoline.
-
-* The zend_object_iterator_funcs valid member has changed its signature from
-  int(*)(zend_object_iterator *) to zend_result(*)(zend_object_iterator *) to
-  be more in line with what callbacks are returning.
-
-* The backwards compatibility headers ext/standard/{php_lcg.h,php_mt_rand.h,
-  php_rand.h,php_random.h} have been removed. Include ext/random/php_random.h
-  directly.
-
-* The zend_*printf family of functions now supports the "%S" modifier to print
-  out zend_string*. This won't cut off the string if it embeds a NUL byte.
-
-* The inet_aton() and win32/inet.h have been removed. Use platform-agnostic
-  inet_pton() from arpa/inet.h or ws2tcpip.h on Windows.
-
-* zend_mm_set_custom_debug_handlers() has been removed from ZendMM, use
-  zend_mm_set_custom_handlers() instead which now supports DEBUG builds
-
-* zend_mm_set_custom_handlers() has changed its signature from
-  void()(zend_mm_heap *heap,
-         void* (*_malloc)(size_t),
-         void  (*_free)(void*),
-         void* (*_realloc)(void*, size_t))
-  to
-  void()(zend_mm_heap *heap,
-         void* (*_malloc)(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
-         void  (*_free)(void* ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
-         void* (*_realloc)(void*, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC))
-
-* zend_mm_get_custom_handlers() has changed its signature from
-  void()(zend_mm_heap *heap,
-         void* (**_malloc)(size_t),
-         void  (**_free)(void*),
-         void* (**_realloc)(void*, size_t))
-  to
-  void()(zend_mm_heap *heap,
-         void* (**_malloc)(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
-         void  (**_free)(void* ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC),
-         void* (**_realloc)(void*, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC))
-
-* Added gc and shutdown custom handlers, settable via
-  zend_mm_set_custom_handlers_ex()
-
-* __zend_malloc() has changed their signature from
-  void(*)(size_t) to
-  void(*)(size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
-
-* __zend_calloc() has changed their signature from
-  void(*)(size_t, size_t) to
-  void(*)(size_t, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
-
-* __zend_realloc() has changed their signature from
-  void(*)(void *, size_t) to
-  void(*)(void *, size_t ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
-
-* zend_observer_remove_begin_handler() and zend_observer_remove_end_handler()
-  got each a new parameter returning an observer which must be called, if the
-  removal happened during observer execution.
-
-* zend_get_internal_function_extension_handle[s]() must now be used over
-  zend_get_op_array_extension_handle[s]() when registering run_time_cache slots
-  for internal functions. If you need a cache slot for both internal and user
-  functions, you may obtain a slot for each through the corresponding function.
-
-* zend_is_true now returns bool rather than int. Note that on PHP 8 this has
-  always returned 0 or 1, so conversion should be trivial.
-
-* Added zend_hash_get_current_pos_ex() variant of zend_hash_get_current_pos().
-
-* Renamed rebuild_object_properties() to rebuild_object_properties_internal().
-  This function should not be used outside of zend_std_get_properties_ex() and
-  zend_std_get_properties(). Use zend_std_get_properties_ex() or
-  zend_std_get_properties() instead.
-
-* zend_object.properties must not be accessed directly. Use
-  zend_std_get_properties_ex() instead.
-
-* Removed IS_STATIC_VAR_UNINITIALIZED constant. Check for IS_NULL in the
-  static_variables array instead.
-
-* Removed ZEND_DIM_ALTERNATIVE_SYNTAX constant. This syntax no longer has a
-  specialized error message.
-
 ========================
 2. Build system changes
 ========================
 
- a. Abstract
-   - The configure option --with-imap has been removed.
-   - The configure option --with-mhash emits deprecation warning.
-   - The configure option --with-pdo-oci has been removed.
-   - The configure option --with-pspell has been removed.
-   - Symbol SIZEOF_SHORT removed (size of 2 on 32-bit and 64-bit platforms).
-   - Symbol DBA_CDB_MAKE removed in ext/dba.
-   - Symbol HAVE_LIBM has been removed.
-   - Symbol HAVE_INET_ATON has been removed.
-   - Symbol HAVE_SIGSETJMP has been removed.
-   - The Zend/zend_istdiostream.h header has been removed.
-
- b. Unix build system changes
-   - The configure option --with-imap-ssl has been removed.
-   - The configure option --with-oci8 has been removed.
-   - The configure option --with-zlib-dir has been removed.
-   - The configure option --with-kerberos has been removed.
-   - The configure option --with-openssl-dir has been removed. SSL support in
-     ext/ftp and ext/mysqlnd is enabled implicitly, when building with
-     ext/openssl (--with-openssl), or explicitly by using new configure options
-     --with-ftp-ssl and --with-mysqlnd-ssl.
-   - New configure option --with-openssl-legacy-provider to enable OpenSSL
-     legacy provider.
-   - New configure option --with-openssl-argon2 to enable PASSWORD_ARGON2
-     from OpenSSL 3.2
-   - COOKIE_IO_FUNCTIONS_T symbol has been removed (use cookie_io_functions_t).
-   - HAVE_SOCKADDR_UN_SUN_LEN symbol renamed to HAVE_STRUCT_SOCKADDR_UN_SUN_LEN.
-   - HAVE_UTSNAME_DOMAINNAME symbol renamed to HAVE_STRUCT_UTSNAME_DOMAINNAME.
-   - PHP_CHECK_IN_ADDR_T Autoconf macro and 'in_addr_t' fallback definition to
-     'u_int' removed (use AC_CHECK_TYPES Autoconf macro instead).
-   - HAVE_ODBC2 symbol has been removed in ext/odbc.
-   - Removed linking with obsolete dnet_stub library in ext/pdo_dblib.
-   - Removed checking and linking with obsolete libbind for some functions.
-   - Symbol HAVE_JSON has been removed (ext/json is always available since PHP
-     8.0).
-   - Symbol DARWIN has been removed (use __APPLE__ to target Darwin systems).
-   - Symbol MISSING_FCLOSE_DECL and Autoconf macro PHP_MISSING_FCLOSE_DECL were
-     removed.
-   - Symbol HAVE_BSD_ICONV has been removed.
-   - Symbol ZEND_FIBER_ASM has been removed.
-   - Symbols HAVE_DLOPEN and HAVE_DLSYM have been removed.
-   - Symbol HAVE_MYSQL has been removed.
-   - Symbol HAVE_PDO_SQLITELIB has been removed.
-   - Symbol HAVE_WAITPID has been removed.
-   - Symbol HAVE_LIBPQ has been removed.
-   - Symbols HAVE_LIBRT and HAVE_TIMER_CREATE removed.
-   - Symbols PHP_FPM_SYSTEMD, PHP_FPM_USER, and PHP_FPM_GROUP removed.
-   - Symbol PTHREADS has been removed.
-   - Symbol HAVE_STRPTIME_DECL_FAILS has been removed (use HAVE_DECL_STRPTIME).
-   - Symbol HAVE_PHPDBG has been removed.
-   - Symbols PHP_HAVE_AVX512_SUPPORTS and PHP_HAVE_AVX512_VBMI_SUPPORTS are now
-     either defined to 1 or undefined.
-   - Symbol HAVE_LIBCRYPT has been removed.
-   - Autoconf macro PHP_DEFINE (atomic includes) removed (use AC_DEFINE and
-     config.h).
-   - Autoconf macro PHP_WITH_SHARED has been removed (use PHP_ARG_WITH).
-   - Autoconf macro PHP_STRUCT_FLOCK has been removed (use AC_CHECK_TYPES).
-   - Autoconf macro PHP_SOCKADDR_CHECKS has been removed (use AC_CHECK_TYPES and
-     AC_CHECK_MEMBERS).
-   - Autoconf macro PHP_CHECK_GCC_ARG has been removed since PHP 8.0 (use
-     AX_CHECK_COMPILE_FLAG).
-   - Autoconf macro PHP_PROG_RE2C got a new 2nd argument to define common
-     default re2c command-line options substituted to the Makefile RE2C_FLAGS
-     variable.
-   - Autoconf macros PHP_CHECK_BUILTIN_* have been removed in favor of
-     PHP_CHECK_BUILTIN and all PHP_HAVE_BUILTIN_* symbols changed to be either
-     undefined or defined to 1 whether compiler supports the builtin.
-   - Added php-config --lib-dir and --lib-embed options for PHP embed SAPI.
-   - PDO extensions in php-src don't have the include flag -I$pdo_cv_inc_path
-     directory anymore.
-   - Autoconf macro PHP_SETUP_OPENSSL doesn't accept the 3rd argument anymore.
-   - Autoconf macro PHP_EVAL_LIBLINE got a new 3rd argument to override the
-     ext_shared checks.
-   - Autoconf macro PHP_SETUP_LIBXML doesn't define the redundant HAVE_LIBXML
-     symbol anymore and requires at least libxml2 2.9.4.
-   - Autoconf macro PHP_SETUP_ICONV doesn't define the HAVE_ICONV symbol
-     anymore.
-   - Autoconf macro PHP_AP_EXTRACT_VERSION is obsolete (use the
-     'apxs -q HTTPD_VERSION').
-   - Autoconf macro PHP_OUTPUT is obsolete (use AC_CONFIG_FILES).
-   - Autoconf macro PHP_TEST_BUILD is obsolete (use AC_* macros).
-   - Autoconf macro PHP_BUILD_THREAD_SAFE is obsolete (set enable_zts manually).
-   - Autoconf macro PHP_DEF_HAVE is obsolete (use AC_DEFINE).
-   - Autoconf macro PHP_PROG_SETUP now accepts an argument to set the minimum
-     required PHP version during the build.
-   - Autoconf macro PHP_INSTALL_HEADERS arguments can now be also
-     blank-or-newline-separated lists instead of only separated with whitespace
-     or backslash-then-newline.
-   - Autoconf macro PHP_ADD_BUILD_DIR now also accepts 1st argument as a
-     blank-or-newline-separated separated list.
-   - Autoconf macros PHP_NEW_EXTENSION, PHP_ADD_SOURCES, PHP_ADD_SOURCES_X,
-     PHP_SELECT_SAPI now have the source files and flags arguments normalized so
-     the list of items can be passed as a blank-or-newline-separated list.
-   - Autoconf macro PHP_ADD_INCLUDE now takes also a blank-or-newline-separated
-     list of include directories instead of a single directory. The "prepend"
-     argument is validated at Autoconf compile time.
-   - TSRM/tsrm.m4 file and its TSRM_CHECK_PTHREADS macro have been removed.
-   - Added pkg-config support to find libpq for the pdo_pgsql and pgsql
-     extensions. The libpq paths can be customized with the PGSQL_CFLAGS and
-     PGSQL_LIBS environment variables. When a directory argument is provided to
-     configure options (--with-pgsql=DIR or --with-pdo-pgsql=DIR), it will be
-     used instead of the pkg-config search.
-   - Added pkg-config support to find unixODBC and iODBC for the pdo_odbc
-     extension.
-   - Added pkg-config support to find GNU MP library. As a fallback default
-     system paths are searched. When a directory argument is provided
-     (--with-gmp=DIR), it will be used instead of the pkg-config.
-   - Added optional pkg-config support to find NET-SNMP library. As a fallback
-     net-snmp-config utility is used like before.
-   - Removed BC enable_pear variable check due to --enable-pear configure option
-     once used (use with_pear variable name).
-   - Cache variables synced to php_cv_* naming scheme. If you use them for
-     advanced cross-compilation, these were renamed:
-       - ac_cv_copy_file_range             -> php_cv_func_copy_file_range
-       - ac_cv_flush_io                    -> php_cv_have_flush_io
-       - ac_cv_func_getaddrinfo            -> php_cv_func_getaddrinfo
-       - ac_cv_have_broken_gcc_strlen_opt  -> php_cv_have_broken_gcc_strlen_opt
-       - ac_cv_have_pcre2_jit              -> php_cv_have_pcre2_jit
-       - ac_cv_pread                       -> php_cv_func_pread
-       - ac_cv_pwrite                      -> php_cv_func_pwrite
-       - ac_cv_syscall_shadow_stack_exists -> php_cv_have_shadow_stack_syscall
-       - ac_cv_time_r_type                 -> php_cv_time_r_type
-       - ac_cv_write_stdout                -> php_cv_have_write_stdout
-     and all other checks wrapped with their belonging cache variables (see *.m4
-     source files for details).
-
- c. Windows build system changes
-   - The configure options --with-oci8-11g, --with-oci8-12c, --with-oci8-19,
-     --enable-apache2-2handler have been removed.
-   - The configure option --enable-apache2-4handler is now an alias for the
-     preferred --enable-apache2handler.
-   - Added Bison flag '-Wall' when generating lexer files as done in *nix build
-     system.
-   - HAVE_WIN32_NATIVE_THREAD, USE_WIN32_NATIVE_THREAD, ENABLE_THREADS symbols
-     in ext/mbstring/libmbfl removed.
-   - FIBER_ASSEMBLER and FIBER_ASM_ARCH Makefile variables removed in favor of
-     PHP_ASSEMBLER and FIBER_ASM_ABI.
-   - HAVE_PHP_SOAP symbol renamed to HAVE_SOAP.
-   - Unused symbols CONFIGURATION_FILE_PATH, DISCARD_PATH, HAVE_ERRMSG_H,
-     HAVE_REGCOMP, HAVE_RINT, NEED_ISBLANK, PHP_URL_FOPEN, REGEX, HSREGEX,
-     USE_CONFIG_FILE have been removed.
-   - The HAVE_OPENSSL symbol has been removed.
-   - The HAVE_OPENSSL_EXT symbol is now consistently defined to value 1 whether
-     the openssl extension is available either as shared or built statically.
-   - Added configure option --enable-phpdbg-debug to build phpdbg in debug mode.
-   - The win32/build/libs_version.txt file has been removed.
-   - MSVC builds now use the new preprocessor (/Zc:preprocessor).
-   - The CHECK_HEADER_ADD_INCLUDE function now consistently defines preprocessor
-     macros HAVE__H either to value 1 or leaves them undefined to match
-     the Autotools headers checks.
-
 ========================
 3. Module changes
 ========================
 
- a. ext/dom
-   - dom_read_t and dom_write_t now expect the function to return zend_result
-     instead of int.
-   - The macros DOM_NO_ARGS() and DOM_NOT_IMPLEMENTED() have been removed.
-   - New public APIs are available to handle callbacks from XPath, see
-     xpath_callbacks.h.
-   - Added public APIs to manipulate namespace data, see namespace_compat.h.
-   - php_dom_create_object() now no longer accepts a NULL obj argument.
-   - Removed the `ret` argument from the DOM_RET_OBJ macro, use the return
-     value instead.
-   - Removed DOM_XMLNS_NAMESPACE from xml_common.h. Use DOM_XMLNS_NS_URI
-     from namespace_compat.h instead.
-   - Added php_dom_get_ns_mapper(), php_dom_next_in_tree_order(),
-     php_dom_follow_spec_doc_ref(), and php_dom_follow_spec_doc_ref().
-
- b. ext/random
-   - The macro RAND_RANGE_BADSCALING() has been removed. The implementation
-     should either be inlined and undefined behavior fixed or it should be
-     replaced by a non-biased scaler.
-   - The php_srand() and php_rand() functions have been removed. These were
-     slim wrappers around the corresponding php_mt_srand() and php_mt_rand()
-     function since PHP 7.1, but using zend_long instead of uint32_t as their
-     input/output types. This made their behavior incompatible between 32-bit
-     and 64-bit builds of PHP. Users of these functions are encouraged to
-     migrate to one of the more modern engines provided since PHP 8.2. If that
-     is not possible, due to backwards compatibility requirements, then the
-     php_mt_srand() and php_mt_rand() functions should be called directly and
-     the values appropriately casted.
-   - The PHP_RAND_MAX and RAND_MAX constants corresponding to the removed
-     php_rand() have also been removed.
-   - The generate member of a php_random_algo is now expected to return
-     the new php_random_result struct, replacing the last_generated_size
-     member of the php_random_status struct and the generate_size member of
-     the php_random_algo struct.
-   - The php_random_status struct has been removed, since the previous change
-     reduced it to a single void* member containing the actual state, resulting
-     in needless indirection. Functions taking a php_random_algo struct pointer
-     and a php_random_status struct pointer as separate parameters now take a
-     single php_random_algo_with_state struct by value, making it easier to
-     pass around the state with its associated algorithm and thus reducing
-     the chance for mistakes.
-   - The seed member of a php_random_algo has been removed. As a replacement
-     engine-specific seeding functions are now exposed. This change allows
-     users to better take engine-specific behavior into account. As an example
-     Mt19937 ignored the upper half of the seed parameter of the generic
-     seeding function.
-   - The CSPRNG API (php_random_(bytes|int)_*) is now provided by the new
-     and much smaller php_random_csprng.h header. The new header is included
-     in php_random.h for compatibility with existing users.
-   - A new php_random_generate_fallback_seed() function has been added as a
-     replacement for the generically named GENERATE_SEED(). The internal
-     implementation has been improved to generate better seeds, however any
-     users should use the opportunity to verify that seeding is first
-     attempted using the CSPRNG for better output size flexibility.
-   - The standalone combined_lcg engine has been removed, as the lcg_value()
-     userland function is deprecated and as the engine is unable to return
-     unbiased integer values. The internal php_combined_lcg() function remains
-     available for now.
-
- c. ext/xsl
-   - The function php_xsl_create_object() was removed as it was not used
-     nor exported.
-
- d. ext/libxml
-   - Added php_libxml_pretend_ctx_error_ex() to emit errors as if they had come
-     from libxml.
-   - Added php_libxml_error_handler_va() to pass libxml errors, and
-     corresponding php_libxml_error_level enum.
-   - Removed the "properties" HashTable field from php_libxml_node_object.
-   - Added a way to attached private data to a php_libxml_ref_obj.
-   - Added a way to fix a class type onto php_libxml_ref_obj.
-   - Added a way to record quirks mode in php_libxml_ref_obj.
-   - Added php_libxml_uses_internal_errors().
-   - Added a way to override document handlers (e.g. serialization) with
-     php_libxml_document_handlers.
-   - Changed the refcount fields from int to unsigned int.
-
- e. ext/date
-   - Added the php_format_date_ex() API to format instances of php_date_obj.
-   - Added the php_date_initialize_from_ts_long() and
-     php_date_initialize_from_ts_double() to initialize a php_date_obj with
-     the given unix timestamp using GMT +00:00.
-
- f. ext/pcre
-   - php_pcre_match_impl() now no longer has a use_flags argument.
-     When flags should be ignored, pass 0 to the flags argument.
-   - php_pcre_match_impl() and pcre_get_compiled_regex_cache_ex() now use
-     proper boolean argument types instead of integer types.
-   - pcre_get_compiled_regex_cache_ex() now provides an option to collect extra
-     options (from modifiers used in the expression, for example), and calls
-     pcre2_set_compile_extra_options() with those options.
-
- g. ext/standard
-   - Added the php_base64_encode_ex() API with flag parameters, value can be
-     PHP_BASE64_NO_PADDING to encode without the padding character '='.
-   - The php_escape_shell_cmd() now takes a zend_string* instead of a char*
-     Moreover, providing it with a binary safe string is the responsibility of
-     the caller now.
-   - The php_escape_shell_arg() now takes a zend_string* instead of a char*
-     Moreover, providing it with a binary safe string is the responsibility of
-     the caller now.
-   - The php_info_html_esc() function has been removed, use
-     php_escape_html_entities() with ENT_QUOTES directly instead.
-   - The deprecated php_uint32 and php_int32 typedefs have been removed from
-     ext/standard/basic_functions.h. Use the standard uint32_t and int32_t
-     types instead.
-
- h. ext/session
-   - Added the php_get_session_status() API to get the session status, which is
-     equivalent to reading PS(session_status) but works with shared objects too.
-   - Added the php_get_session_var_str() API to set a session variable without
-     needing to create a zend_string.
-   - The ext/session/php_session.h doesn't transitively include the
-     ext/hash/php_hash.h header anymore.
-
- i. ext/xml
-   - Made the expat compatibility wrapper XML_GetCurrentByteIndex return a long
-     instead of an int. This corresponds to the XML_Index type when
-     XML_LARGE_SIZE is not used in expat.
-
 ========================
 4. OpCode changes
 ========================
 
-* DO_ICALL, DO_FCALL, and DO_FCALL_BY_NAME now call zend_interrupt_function
-  while the internal frame is still on the stack. This means interrupt handlers
-  will now see the internal call. If your interrupt handler does something like
-  switching EG(current_execute_data), it should not do so if an internal func
-  is on top.
-* New FRAMELESS_ICALL_[0,3] opcodes for faster internal function calls have been
-  added. These opcodes don't create a stack frame, but pass arguments via opcode
-  operands. They only work for functions that are known at compile-time, and
-  that provide a frameless handler (search for usages of the
-  ZEND_FRAMELESS_FUNCTION macro).
-
-* CREATE_GENERATOR now initializes the generator with opline pointing to the
-  CREATE_GENERATOR op (before, opline was set to the next op).
-
-* YIELD and YIELD_FROM do not increment the opline anymore.
-
-* The EXIT opcode has been removed as exit is now implemented as a function.
-
 ========================
 5. SAPI changes
 ========================
diff --git a/Zend/Optimizer/pass1.c b/Zend/Optimizer/pass1.c
index 7c9f1c99a2820..fe92db583fcd9 100644
--- a/Zend/Optimizer/pass1.c
+++ b/Zend/Optimizer/pass1.c
@@ -34,6 +34,12 @@
 #include "zend_execute.h"
 #include "zend_vm.h"
 
+#define TO_STRING_NOWARN(val) do { \
+	if (Z_TYPE_P(val) < IS_ARRAY) { \
+		convert_to_string(val); \
+	} \
+} while (0)
+
 static void replace_by_const_or_qm_assign(zend_op_array *op_array, zend_op *opline, zval *result) {
 	if (opline->op1_type == IS_CONST) {
 		literal_dtor(&ZEND_OP1_LITERAL(opline));
@@ -64,10 +70,10 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
 		case ZEND_CONCAT:
 		case ZEND_FAST_CONCAT:
 			if (opline->op1_type == IS_CONST && Z_TYPE(ZEND_OP1_LITERAL(opline)) != IS_STRING) {
-				convert_to_string(&ZEND_OP1_LITERAL(opline));
+				TO_STRING_NOWARN(&ZEND_OP1_LITERAL(opline));
 			}
 			if (opline->op2_type == IS_CONST && Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_STRING) {
-				convert_to_string(&ZEND_OP2_LITERAL(opline));
+				TO_STRING_NOWARN(&ZEND_OP2_LITERAL(opline));
 			}
 			ZEND_FALLTHROUGH;
 		case ZEND_ADD:
@@ -100,7 +106,7 @@ void zend_optimizer_pass1(zend_op_array *op_array, zend_optimizer_ctx *ctx)
 		case ZEND_ASSIGN_OP:
 			if (opline->extended_value == ZEND_CONCAT && opline->op2_type == IS_CONST
 					&& Z_TYPE(ZEND_OP2_LITERAL(opline)) != IS_STRING) {
-				convert_to_string(&ZEND_OP2_LITERAL(opline));
+				TO_STRING_NOWARN(&ZEND_OP2_LITERAL(opline));
 			}
 			break;
 
diff --git a/Zend/Optimizer/zend_func_infos.h b/Zend/Optimizer/zend_func_infos.h
index 5db20f79de0dd..8751ff30c6950 100644
--- a/Zend/Optimizer/zend_func_infos.h
+++ b/Zend/Optimizer/zend_func_infos.h
@@ -24,6 +24,7 @@ static const func_info_t func_infos[] = {
 	F1("bcmul", MAY_BE_STRING),
 	F1("bcdiv", MAY_BE_STRING),
 	F1("bcmod", MAY_BE_STRING),
+	F1("bcdivmod", MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_LONG|MAY_BE_ARRAY_OF_STRING),
 	F1("bcpowmod", MAY_BE_STRING),
 	F1("bcpow", MAY_BE_STRING),
 	F1("bcsqrt", MAY_BE_STRING),
diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c
index b7fa1e837d096..e457c24b18aa2 100644
--- a/Zend/Optimizer/zend_inference.c
+++ b/Zend/Optimizer/zend_inference.c
@@ -4056,11 +4056,11 @@ static zend_always_inline zend_result _zend_update_type_info(
 				fprintf(stderr, "Missing op2 type inference for opcode %s, line %d\n", zend_get_opcode_name(opline->opcode), opline->lineno);
 			}
 #endif
-unknown_opcode:
 			if (ssa_op->op1_def >= 0) {
 				tmp = MAY_BE_ANY | MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
 				UPDATE_SSA_TYPE(tmp, ssa_op->op1_def);
 			}
+unknown_opcode:
 			if (ssa_op->result_def >= 0) {
 				tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
 				if (opline->result_type == IS_TMP_VAR) {
@@ -5040,7 +5040,7 @@ ZEND_API bool zend_may_throw_ex(const zend_op *opline, const zend_ssa_op *ssa_op
 			return 0;
 		case ZEND_BIND_GLOBAL:
 			if ((opline+1)->opcode == ZEND_BIND_GLOBAL) {
-				return zend_may_throw(opline + 1, ssa_op + 1, op_array, ssa);
+				return zend_may_throw(opline + 1, ssa_op ? ssa_op + 1 : NULL, op_array, ssa);
 			}
 			return 0;
 		case ZEND_ADD:
diff --git a/Zend/tests/019.phpt b/Zend/tests/019.phpt
index bab02dd565d50..4bc9d6be530cd 100644
--- a/Zend/tests/019.phpt
+++ b/Zend/tests/019.phpt
@@ -50,7 +50,7 @@ foreach ($scalar_variables as $scalar_var) {
 
   // destroy the variable using unset
   unset( $scalar_var );
-  // dump and see if its destroyed, expcted: NULL
+  // dump and see if its destroyed, expected: NULL
   var_dump( $scalar_var );
 
   // check using isset to see if unset, expected: bool(false)
@@ -165,11 +165,11 @@ foreach ($resources as $resource) {
   // unset the resource
   unset($resource);
   // check using isset() and empty()
-  var_dump( isset($resource) );  // expected: bool(flase)
+  var_dump( isset($resource) );  // expected: bool(false)
   var_dump( empty($resource) );  // expected: bool(true)
   // call isset() with two args, but one set
   var_dump( isset($resource, $temp_var) ); // expected: bool(false)
-  // uset the temp_var
+  // unset the temp_var
   unset($temp_var);
   // now the isset() with both the args as unset
   var_dump( isset($resource, $temp_var) ); // expected: bool(false);
@@ -211,7 +211,7 @@ var_dump($point1); // dump the object
 // check the object and member that is not set
 var_dump( isset($point1) );  // expected: bool(true)
 var_dump( empty($point1) );  // expected: bool(false)
-var_dump( isset($point1->$lable) );  //expected: bool(flase)
+var_dump( isset($point1->$lable) );  //expected: bool(false)
 var_dump( empty($point1->$lable) );  //expected: bool(true)
 
 //set the member variable lable and check
@@ -291,7 +291,7 @@ function test_unset1() {
   $static_var = 20;
   echo "value of static_var after new assignment: $static_var\n";
 }
-// call the functiont
+// call the function
 test_unset1();
 test_unset1();
 test_unset1();
diff --git a/Zend/tests/ErrorException_getSeverity.phpt b/Zend/tests/ErrorException_getSeverity.phpt
index 2673065a8753a..ba900ce19e8e1 100644
--- a/Zend/tests/ErrorException_getSeverity.phpt
+++ b/Zend/tests/ErrorException_getSeverity.phpt
@@ -192,18 +192,6 @@ try {
     var_dump($e->getTraceAsString() === EXCEPTION_TRACE_AS_STRING_MSG);
 }
 
-try {
-    throw new ErrorException(EXCEPTION_PARAM_MSG, EXCEPTION_CODE_ERROR, E_STRICT);
-} catch(ErrorException $e) {
-    echo EXCEPTION_SEVERITY_ERROR_MSG . $e->getSeverity();
-    var_dump($e->getSeverity() === E_STRICT);
-    var_dump($e->getMessage() === EXCEPTION_PARAM_MSG);
-    var_dump($e->getCode() === 0);
-    var_dump($e->getPrevious() === NULL);
-    var_dump($e->getFile() === __FILE__);
-    var_dump($e->getTraceAsString() === EXCEPTION_TRACE_AS_STRING_MSG);
-}
-
 try {
     throw new ErrorException(EXCEPTION_PARAM_MSG, EXCEPTION_CODE_ERROR, E_RECOVERABLE_ERROR);
 } catch(ErrorException $e) {
@@ -384,18 +372,6 @@ try {
     var_dump($e->getTraceAsString() === EXCEPTION_TRACE_AS_STRING_MSG);
 }
 
-try {
-    throw new ErrorException(EXCEPTION_PARAM_MSG, EXCEPTION_CODE_ERROR, E_STRICT, __FILE__);
-} catch(ErrorException $e) {
-    echo EXCEPTION_SEVERITY_ERROR_MSG . $e->getSeverity();
-    var_dump($e->getSeverity() === E_STRICT);
-    var_dump($e->getMessage() === EXCEPTION_PARAM_MSG);
-    var_dump($e->getCode() === 0);
-    var_dump($e->getPrevious() === NULL);
-    var_dump($e->getFile() === __FILE__);
-    var_dump($e->getTraceAsString() === EXCEPTION_TRACE_AS_STRING_MSG);
-}
-
 try {
     throw new ErrorException(EXCEPTION_PARAM_MSG, EXCEPTION_CODE_ERROR, E_RECOVERABLE_ERROR, __FILE__);
 } catch(ErrorException $e) {
@@ -576,18 +552,6 @@ try {
     var_dump($e->getTraceAsString() === EXCEPTION_TRACE_AS_STRING_MSG);
 }
 
-try {
-    throw new ErrorException(EXCEPTION_PARAM_MSG, EXCEPTION_CODE_ERROR, E_STRICT, __FILE__, __LINE__);
-} catch(ErrorException $e) {
-    echo EXCEPTION_SEVERITY_ERROR_MSG . $e->getSeverity();
-    var_dump($e->getSeverity() === E_STRICT);
-    var_dump($e->getMessage() === EXCEPTION_PARAM_MSG);
-    var_dump($e->getCode() === 0);
-    var_dump($e->getPrevious() === NULL);
-    var_dump($e->getFile() === __FILE__);
-    var_dump($e->getTraceAsString() === EXCEPTION_TRACE_AS_STRING_MSG);
-}
-
 try {
     throw new ErrorException(EXCEPTION_PARAM_MSG, EXCEPTION_CODE_ERROR, E_RECOVERABLE_ERROR, __FILE__, __LINE__);
 } catch(ErrorException $e) {
@@ -813,22 +777,6 @@ try {
     }
 }
 
-try {
-    throw new ErrorException(EXCEPTION_PARAM_MSG, EXCEPTION_CODE_ERROR, E_STRICT, __FILE__, __LINE__, NULL);
-} catch(Exception $exceptionErr) {
-    try {
-        throw new ErrorException(EXCEPTION_PARAM_MSG, EXCEPTION_CODE_ERROR, E_STRICT, __FILE__, __LINE__, $exceptionErr->getPrevious());
-    } catch(ErrorException $e) {
-        echo EXCEPTION_SEVERITY_ERROR_MSG . $e->getSeverity();
-        var_dump($e->getSeverity() === E_STRICT);
-        var_dump($e->getMessage() === EXCEPTION_PARAM_MSG);
-        var_dump($e->getCode() === 0);
-        var_dump($e->getPrevious() === NULL);
-        var_dump($e->getFile() === __FILE__);
-        var_dump($e->getTraceAsString() === EXCEPTION_TRACE_AS_STRING_MSG);
-    }
-}
-
 try {
     throw new ErrorException(EXCEPTION_PARAM_MSG, EXCEPTION_CODE_ERROR, E_RECOVERABLE_ERROR, __FILE__, __LINE__, NULL);
 } catch(Exception $exceptionErr) {
@@ -953,12 +901,6 @@ bool(true)
 bool(true)
 bool(true)
 bool(true)
-This exception severity is: 2048bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
 This exception severity is: 4096bool(true)
 bool(true)
 bool(true)
@@ -1049,12 +991,6 @@ bool(true)
 bool(true)
 bool(true)
 bool(true)
-This exception severity is: 2048bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
 This exception severity is: 4096bool(true)
 bool(true)
 bool(true)
@@ -1145,12 +1081,6 @@ bool(true)
 bool(true)
 bool(true)
 bool(true)
-This exception severity is: 2048bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
 This exception severity is: 4096bool(true)
 bool(true)
 bool(true)
@@ -1241,12 +1171,6 @@ bool(true)
 bool(true)
 bool(true)
 bool(true)
-This exception severity is: 2048bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
-bool(true)
 This exception severity is: 4096bool(true)
 bool(true)
 bool(true)
diff --git a/Zend/tests/access_modifiers_001.phpt b/Zend/tests/access_modifiers/access_modifiers_001.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_001.phpt
rename to Zend/tests/access_modifiers/access_modifiers_001.phpt
diff --git a/Zend/tests/access_modifiers_002.phpt b/Zend/tests/access_modifiers/access_modifiers_002.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_002.phpt
rename to Zend/tests/access_modifiers/access_modifiers_002.phpt
diff --git a/Zend/tests/access_modifiers_003.phpt b/Zend/tests/access_modifiers/access_modifiers_003.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_003.phpt
rename to Zend/tests/access_modifiers/access_modifiers_003.phpt
diff --git a/Zend/tests/access_modifiers_004.phpt b/Zend/tests/access_modifiers/access_modifiers_004.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_004.phpt
rename to Zend/tests/access_modifiers/access_modifiers_004.phpt
diff --git a/Zend/tests/access_modifiers_005.phpt b/Zend/tests/access_modifiers/access_modifiers_005.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_005.phpt
rename to Zend/tests/access_modifiers/access_modifiers_005.phpt
diff --git a/Zend/tests/access_modifiers_006.phpt b/Zend/tests/access_modifiers/access_modifiers_006.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_006.phpt
rename to Zend/tests/access_modifiers/access_modifiers_006.phpt
diff --git a/Zend/tests/access_modifiers_007.phpt b/Zend/tests/access_modifiers/access_modifiers_007.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_007.phpt
rename to Zend/tests/access_modifiers/access_modifiers_007.phpt
diff --git a/Zend/tests/access_modifiers_008.phpt b/Zend/tests/access_modifiers/access_modifiers_008.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_008.phpt
rename to Zend/tests/access_modifiers/access_modifiers_008.phpt
diff --git a/Zend/tests/access_modifiers_009.phpt b/Zend/tests/access_modifiers/access_modifiers_009.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_009.phpt
rename to Zend/tests/access_modifiers/access_modifiers_009.phpt
diff --git a/Zend/tests/access_modifiers_010.phpt b/Zend/tests/access_modifiers/access_modifiers_010.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_010.phpt
rename to Zend/tests/access_modifiers/access_modifiers_010.phpt
diff --git a/Zend/tests/access_modifiers_011.phpt b/Zend/tests/access_modifiers/access_modifiers_011.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_011.phpt
rename to Zend/tests/access_modifiers/access_modifiers_011.phpt
diff --git a/Zend/tests/access_modifiers_012.phpt b/Zend/tests/access_modifiers/access_modifiers_012.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_012.phpt
rename to Zend/tests/access_modifiers/access_modifiers_012.phpt
diff --git a/Zend/tests/access_modifiers_013.phpt b/Zend/tests/access_modifiers/access_modifiers_013.phpt
similarity index 100%
rename from Zend/tests/access_modifiers_013.phpt
rename to Zend/tests/access_modifiers/access_modifiers_013.phpt
diff --git a/Zend/tests/anon/gh15994.phpt b/Zend/tests/anon/gh15994.phpt
new file mode 100644
index 0000000000000..815b392ada432
--- /dev/null
+++ b/Zend/tests/anon/gh15994.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Abstract function must be implemented
+--FILE--
+
+--EXPECTF--
+Fatal error: Class ParentClass@anonymous must implement 1 abstract method (ParentClass::f) in %sgh15994.php on line 7
diff --git a/Zend/tests/asymmetric_visibility/static_props.phpt b/Zend/tests/asymmetric_visibility/static_props.phpt
new file mode 100644
index 0000000000000..65fd3aa1923d2
--- /dev/null
+++ b/Zend/tests/asymmetric_visibility/static_props.phpt
@@ -0,0 +1,12 @@
+--TEST--
+Asymmetric visibility on static props
+--FILE--
+
+--EXPECTF--
+Fatal error: Static property may not have asymmetric visibility in %s on line %d
diff --git a/Zend/tests/attributes/ossfuzz371445205.phpt b/Zend/tests/attributes/ossfuzz371445205.phpt
new file mode 100644
index 0000000000000..17e4f529a2a0a
--- /dev/null
+++ b/Zend/tests/attributes/ossfuzz371445205.phpt
@@ -0,0 +1,17 @@
+--TEST--
+OSS-Fuzz #371445205 (Heap-use-after-free in attr_free)
+--FILE--
+getAttributes()[0];
+try {
+    $attr->newInstance();
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+Unknown named parameter $notinterned
diff --git a/Zend/tests/bug27731.phpt b/Zend/tests/bug27731.phpt
index 655fffd51582e..db2af29312955 100644
--- a/Zend/tests/bug27731.phpt
+++ b/Zend/tests/bug27731.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #27731 (error_reporing() call inside @ block does not work correctly)
+Bug #27731 (error_reporting() call inside @ block does not work correctly)
 --FILE--
 
 --EXPECTF--
-Fatal error: Uncaught Error: Interface "RecurisiveFooFar" not found in %s:%d
+Fatal error: Uncaught Error: Interface "RecursiveFooFar" not found in %s:%d
 Stack trace:
 #0 {main}
   thrown in %s on line %d
diff --git a/Zend/tests/bug32322.phpt b/Zend/tests/bug32322.phpt
index 6d444ac2b3b9d..1b8f7f5c1f4ce 100644
--- a/Zend/tests/bug32322.phpt
+++ b/Zend/tests/bug32322.phpt
@@ -44,7 +44,7 @@ class test
         {
             echo "Class " . $this -> myname . " destroyed at script end\n";
         } else {
-            echo "Class " . $this -> myname . " destroyed beforce script end\n";
+            echo "Class " . $this -> myname . " destroyed before script end\n";
         }
     }
 }
diff --git a/Zend/tests/bug33771.phpt b/Zend/tests/bug33771.phpt
index 368a1662a8f6e..b74b5be5fb6f2 100644
--- a/Zend/tests/bug33771.phpt
+++ b/Zend/tests/bug33771.phpt
@@ -34,7 +34,7 @@ var_dump(error_reporting());
 echo "Done\n";
 ?>
 --EXPECT--
-int(32767)
-int(32767)
-int(32759)
+int(30719)
+int(30719)
+int(30711)
 Done
diff --git a/Zend/tests/bug34467.phpt b/Zend/tests/bug34467.phpt
index e301291e3c498..141097bb63820 100644
--- a/Zend/tests/bug34467.phpt
+++ b/Zend/tests/bug34467.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #34467 (foreach + __get + __set incosistency)
+Bug #34467 (foreach + __get + __set inconsistency)
 --FILE--
 
 --EXPECT--
-clonned
+cloned
 NO LEAK
diff --git a/Zend/tests/bug39003.phpt b/Zend/tests/bug39003.phpt
index 5f7c7849762dc..751802882645b 100644
--- a/Zend/tests/bug39003.phpt
+++ b/Zend/tests/bug39003.phpt
@@ -11,7 +11,7 @@ class ClassName
 function test (OtherClassName $object) { }
 
 spl_autoload_register(function ($class) {
-    var_dump("__autload($class)");
+    var_dump("__autoload($class)");
 });
 
 $obj = new ClassName;
diff --git a/Zend/tests/bug39297.phpt b/Zend/tests/bug39297.phpt
index 4c6cf02c3a14e..77f32e4291c62 100644
--- a/Zend/tests/bug39297.phpt
+++ b/Zend/tests/bug39297.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #39297 (Memory corryption because of indirect modification of overloaded array)
+Bug #39297 (Memory corruption because of indirect modification of overloaded array)
 --FILE--
 children[$cannonicalName] = $value;
+        $canonicalName = strtolower($offset);
+        $this->children[$canonicalName] = $value;
         $value->parent = $this;
     }
 
     public function offsetGet($offset): mixed {
         echo "offsetGet()\n";
-        $cannonicalName = strtolower($offset);
-        return $this->children[$cannonicalName];
+        $canonicalName = strtolower($offset);
+        return $this->children[$canonicalName];
     }
 
 }
diff --git a/Zend/tests/bug43851.phpt b/Zend/tests/bug43851.phpt
index 7b0de5b1179fe..da0e8b7dcebc5 100644
--- a/Zend/tests/bug43851.phpt
+++ b/Zend/tests/bug43851.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #43851 (Memory corrution on reuse of assigned value)
+Bug #43851 (Memory corruption on reuse of assigned value)
 --FILE--
 
 --EXPECT--
diff --git a/Zend/tests/bug60536_005.phpt b/Zend/tests/bug60536_005.phpt
index 8ba0e57456b54..90547e3bc4de7 100644
--- a/Zend/tests/bug60536_005.phpt
+++ b/Zend/tests/bug60536_005.phpt
@@ -12,7 +12,7 @@ trait THello1 {
 }
 
 // Protected and public are handle more strict with a warning then what is
-// expected from normal inheritance since they can have easier coliding semantics
+// expected from normal inheritance since they can have easier colliding semantics
 echo "PRE-CLASS-GUARD\n";
 class SameNameInSubClassProducesNotice extends Base {
     use THello1;
diff --git a/Zend/tests/bug63219.phpt b/Zend/tests/bug63219.phpt
index 999be4a8534a7..0c262de4d7d00 100644
--- a/Zend/tests/bug63219.phpt
+++ b/Zend/tests/bug63219.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #63219 (Segfault when aliasing trait method when autoloader throws excpetion)
+Bug #63219 (Segfault when aliasing trait method when autoloader throws exception)
 --FILE--
 main();
 
 ?>
 --EXPECTF--
-Fatal error: Class Bar contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Bar::doOtherStuff) in %s on line %d
+Fatal error: Class Bar contains 1 abstract method and must therefore be declared abstract or implement the remaining method (Bar::doOtherStuff) in %s on line %d
diff --git a/Zend/tests/bug70805.phpt b/Zend/tests/bug70805.phpt
index 65ecd90d0b1e6..c62fe1fe84b4f 100644
--- a/Zend/tests/bug70805.phpt
+++ b/Zend/tests/bug70805.phpt
@@ -14,7 +14,7 @@ class C {
     public function __destruct() {
         if (isset($GLOBALS["a"])) {
             unset($GLOBALS["array"]);
-            unset($GLOBALS["a"]); // this will be called in gc_colloct_roots and put $a into gc roots buf
+            unset($GLOBALS["a"]); // this will be called in gc_collect_roots and put $a into gc roots buf
         }
     }
 }
@@ -36,11 +36,11 @@ while ($i++ < 9998) {
 }
 $t = [new C];
 $t[] = &$t;
-unset($t); // This is used to trigger C::__destruct while doing gc_colloct_roots
+unset($t); // This is used to trigger C::__destruct while doing gc_collect_roots
 
 $e = $a;
-unset($a); // This one cannot be put into roots buf because it's full, thus gc_colloct_roots will be called,
-           // but C::__destructor which is called in gc_colloct_roots will put $a into buf
+unset($a); // This one cannot be put into roots buf because it's full, thus gc_collect_roots will be called,
+           // but C::__destructor which is called in gc_collect_roots will put $a into buf
            // which will make $a be put into gc roots buf twice
 var_dump(gc_collect_cycles());
 ?>
diff --git a/Zend/tests/bug73987_2.phpt b/Zend/tests/bug73987_2.phpt
index f6861fa4da8ad..a8c83a79fe7a8 100644
--- a/Zend/tests/bug73987_2.phpt
+++ b/Zend/tests/bug73987_2.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #73987 (Method compatibility check looks to original definition and not parent - nullabilty abstract)
+Bug #73987 (Method compatibility check looks to original definition and not parent - nullability abstract)
 --FILE--
 
 --EXPECT--
-int(32767)
-int(32767)
+int(30719)
+int(30719)
diff --git a/Zend/tests/class_alias_001.phpt b/Zend/tests/class_alias/class_alias_001.phpt
similarity index 100%
rename from Zend/tests/class_alias_001.phpt
rename to Zend/tests/class_alias/class_alias_001.phpt
diff --git a/Zend/tests/class_alias_002.phpt b/Zend/tests/class_alias/class_alias_002.phpt
similarity index 100%
rename from Zend/tests/class_alias_002.phpt
rename to Zend/tests/class_alias/class_alias_002.phpt
diff --git a/Zend/tests/class_alias_004.phpt b/Zend/tests/class_alias/class_alias_004.phpt
similarity index 100%
rename from Zend/tests/class_alias_004.phpt
rename to Zend/tests/class_alias/class_alias_004.phpt
diff --git a/Zend/tests/class_alias_005.phpt b/Zend/tests/class_alias/class_alias_005.phpt
similarity index 100%
rename from Zend/tests/class_alias_005.phpt
rename to Zend/tests/class_alias/class_alias_005.phpt
diff --git a/Zend/tests/class_alias_006.phpt b/Zend/tests/class_alias/class_alias_006.phpt
similarity index 100%
rename from Zend/tests/class_alias_006.phpt
rename to Zend/tests/class_alias/class_alias_006.phpt
diff --git a/Zend/tests/class_alias_007.phpt b/Zend/tests/class_alias/class_alias_007.phpt
similarity index 100%
rename from Zend/tests/class_alias_007.phpt
rename to Zend/tests/class_alias/class_alias_007.phpt
diff --git a/Zend/tests/class_alias_008.phpt b/Zend/tests/class_alias/class_alias_008.phpt
similarity index 100%
rename from Zend/tests/class_alias_008.phpt
rename to Zend/tests/class_alias/class_alias_008.phpt
diff --git a/Zend/tests/class_alias_009.phpt b/Zend/tests/class_alias/class_alias_009.phpt
similarity index 100%
rename from Zend/tests/class_alias_009.phpt
rename to Zend/tests/class_alias/class_alias_009.phpt
diff --git a/Zend/tests/class_alias_010.phpt b/Zend/tests/class_alias/class_alias_010.phpt
similarity index 100%
rename from Zend/tests/class_alias_010.phpt
rename to Zend/tests/class_alias/class_alias_010.phpt
diff --git a/Zend/tests/class_alias_011.phpt b/Zend/tests/class_alias/class_alias_011.phpt
similarity index 100%
rename from Zend/tests/class_alias_011.phpt
rename to Zend/tests/class_alias/class_alias_011.phpt
diff --git a/Zend/tests/class_alias_012.phpt b/Zend/tests/class_alias/class_alias_012.phpt
similarity index 100%
rename from Zend/tests/class_alias_012.phpt
rename to Zend/tests/class_alias/class_alias_012.phpt
diff --git a/Zend/tests/class_alias_013.phpt b/Zend/tests/class_alias/class_alias_013.phpt
similarity index 100%
rename from Zend/tests/class_alias_013.phpt
rename to Zend/tests/class_alias/class_alias_013.phpt
diff --git a/Zend/tests/class_alias_014.phpt b/Zend/tests/class_alias/class_alias_014.phpt
similarity index 100%
rename from Zend/tests/class_alias_014.phpt
rename to Zend/tests/class_alias/class_alias_014.phpt
diff --git a/Zend/tests/class_alias_016.phpt b/Zend/tests/class_alias/class_alias_016.phpt
similarity index 100%
rename from Zend/tests/class_alias_016.phpt
rename to Zend/tests/class_alias/class_alias_016.phpt
diff --git a/Zend/tests/class_alias_017.phpt b/Zend/tests/class_alias/class_alias_017.phpt
similarity index 100%
rename from Zend/tests/class_alias_017.phpt
rename to Zend/tests/class_alias/class_alias_017.phpt
diff --git a/Zend/tests/class_alias_018.phpt b/Zend/tests/class_alias/class_alias_018.phpt
similarity index 100%
rename from Zend/tests/class_alias_018.phpt
rename to Zend/tests/class_alias/class_alias_018.phpt
diff --git a/Zend/tests/class_alias_019.phpt b/Zend/tests/class_alias/class_alias_019.phpt
similarity index 100%
rename from Zend/tests/class_alias_019.phpt
rename to Zend/tests/class_alias/class_alias_019.phpt
diff --git a/Zend/tests/class_alias_020.phpt b/Zend/tests/class_alias/class_alias_020.phpt
similarity index 100%
rename from Zend/tests/class_alias_020.phpt
rename to Zend/tests/class_alias/class_alias_020.phpt
diff --git a/Zend/tests/class_alias_021.phpt b/Zend/tests/class_alias/class_alias_021.phpt
similarity index 100%
rename from Zend/tests/class_alias_021.phpt
rename to Zend/tests/class_alias/class_alias_021.phpt
diff --git a/Zend/tests/class_constants_006.phpt b/Zend/tests/class_constants_006.phpt
index aed8d831b7016..a591cd6209277 100644
--- a/Zend/tests/class_constants_006.phpt
+++ b/Zend/tests/class_constants_006.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Ownership of constant expression inhereted from interface should be transfered to class
+Ownership of constant expression inherited from interface should be tranferred to class
 --FILE--
 
 --EXPECTF--
-Fatal error: Cannot use 'static' as trait name, as it is reserved in %s on line %d
+Fatal error: Cannot use "static" as trait name, as it is reserved in %s on line %d
diff --git a/Zend/tests/closure_067.phpt b/Zend/tests/closure_067.phpt
deleted file mode 100644
index 2738959509d7a..0000000000000
--- a/Zend/tests/closure_067.phpt
+++ /dev/null
@@ -1,20 +0,0 @@
---TEST--
-ReflectionFunction::getShortName() returns the full name for closures defined in namespaces.
---FILE--
-baz();
-$r = new \ReflectionFunction($c);
-var_dump($r->getShortName());
-?>
---EXPECT--
-string(26) "{closure:Foo\Bar::baz():6}"
diff --git a/Zend/tests/closure_068.phpt b/Zend/tests/closure_068.phpt
deleted file mode 100644
index 977d3946770ab..0000000000000
--- a/Zend/tests/closure_068.phpt
+++ /dev/null
@@ -1,13 +0,0 @@
---TEST--
-ReflectionFunction::getShortName() returns the short name for first class callables defined in namespaces.
---FILE--
-getShortName());
-?>
---EXPECT--
-string(3) "foo"
diff --git a/Zend/tests/closure_001.phpt b/Zend/tests/closures/closure_001.phpt
similarity index 100%
rename from Zend/tests/closure_001.phpt
rename to Zend/tests/closures/closure_001.phpt
diff --git a/Zend/tests/closure_002.phpt b/Zend/tests/closures/closure_002.phpt
similarity index 100%
rename from Zend/tests/closure_002.phpt
rename to Zend/tests/closures/closure_002.phpt
diff --git a/Zend/tests/closure_003.phpt b/Zend/tests/closures/closure_003.phpt
similarity index 100%
rename from Zend/tests/closure_003.phpt
rename to Zend/tests/closures/closure_003.phpt
diff --git a/Zend/tests/closure_004.phpt b/Zend/tests/closures/closure_004.phpt
similarity index 100%
rename from Zend/tests/closure_004.phpt
rename to Zend/tests/closures/closure_004.phpt
diff --git a/Zend/tests/closure_005.phpt b/Zend/tests/closures/closure_005.phpt
similarity index 100%
rename from Zend/tests/closure_005.phpt
rename to Zend/tests/closures/closure_005.phpt
diff --git a/Zend/tests/closure_006.phpt b/Zend/tests/closures/closure_006.phpt
similarity index 100%
rename from Zend/tests/closure_006.phpt
rename to Zend/tests/closures/closure_006.phpt
diff --git a/Zend/tests/closure_007.phpt b/Zend/tests/closures/closure_007.phpt
similarity index 100%
rename from Zend/tests/closure_007.phpt
rename to Zend/tests/closures/closure_007.phpt
diff --git a/Zend/tests/closure_008.phpt b/Zend/tests/closures/closure_008.phpt
similarity index 100%
rename from Zend/tests/closure_008.phpt
rename to Zend/tests/closures/closure_008.phpt
diff --git a/Zend/tests/closure_009.phpt b/Zend/tests/closures/closure_009.phpt
similarity index 100%
rename from Zend/tests/closure_009.phpt
rename to Zend/tests/closures/closure_009.phpt
diff --git a/Zend/tests/closure_010.phpt b/Zend/tests/closures/closure_010.phpt
similarity index 100%
rename from Zend/tests/closure_010.phpt
rename to Zend/tests/closures/closure_010.phpt
diff --git a/Zend/tests/closure_011.phpt b/Zend/tests/closures/closure_011.phpt
similarity index 100%
rename from Zend/tests/closure_011.phpt
rename to Zend/tests/closures/closure_011.phpt
diff --git a/Zend/tests/closure_012.phpt b/Zend/tests/closures/closure_012.phpt
similarity index 100%
rename from Zend/tests/closure_012.phpt
rename to Zend/tests/closures/closure_012.phpt
diff --git a/Zend/tests/closure_013.phpt b/Zend/tests/closures/closure_013.phpt
similarity index 100%
rename from Zend/tests/closure_013.phpt
rename to Zend/tests/closures/closure_013.phpt
diff --git a/Zend/tests/closure_014.phpt b/Zend/tests/closures/closure_014.phpt
similarity index 100%
rename from Zend/tests/closure_014.phpt
rename to Zend/tests/closures/closure_014.phpt
diff --git a/Zend/tests/closure_015.phpt b/Zend/tests/closures/closure_015.phpt
similarity index 100%
rename from Zend/tests/closure_015.phpt
rename to Zend/tests/closures/closure_015.phpt
diff --git a/Zend/tests/closure_016.phpt b/Zend/tests/closures/closure_016.phpt
similarity index 100%
rename from Zend/tests/closure_016.phpt
rename to Zend/tests/closures/closure_016.phpt
diff --git a/Zend/tests/closure_017.phpt b/Zend/tests/closures/closure_017.phpt
similarity index 100%
rename from Zend/tests/closure_017.phpt
rename to Zend/tests/closures/closure_017.phpt
diff --git a/Zend/tests/closure_018.phpt b/Zend/tests/closures/closure_018.phpt
similarity index 100%
rename from Zend/tests/closure_018.phpt
rename to Zend/tests/closures/closure_018.phpt
diff --git a/Zend/tests/closure_019.phpt b/Zend/tests/closures/closure_019.phpt
similarity index 100%
rename from Zend/tests/closure_019.phpt
rename to Zend/tests/closures/closure_019.phpt
diff --git a/Zend/tests/closure_020.phpt b/Zend/tests/closures/closure_020.phpt
similarity index 100%
rename from Zend/tests/closure_020.phpt
rename to Zend/tests/closures/closure_020.phpt
diff --git a/Zend/tests/closure_021.phpt b/Zend/tests/closures/closure_021.phpt
similarity index 100%
rename from Zend/tests/closure_021.phpt
rename to Zend/tests/closures/closure_021.phpt
diff --git a/Zend/tests/closure_022.phpt b/Zend/tests/closures/closure_022.phpt
similarity index 100%
rename from Zend/tests/closure_022.phpt
rename to Zend/tests/closures/closure_022.phpt
diff --git a/Zend/tests/closure_023.phpt b/Zend/tests/closures/closure_023.phpt
similarity index 100%
rename from Zend/tests/closure_023.phpt
rename to Zend/tests/closures/closure_023.phpt
diff --git a/Zend/tests/closure_024.phpt b/Zend/tests/closures/closure_024.phpt
similarity index 100%
rename from Zend/tests/closure_024.phpt
rename to Zend/tests/closures/closure_024.phpt
diff --git a/Zend/tests/closure_026.phpt b/Zend/tests/closures/closure_026.phpt
similarity index 100%
rename from Zend/tests/closure_026.phpt
rename to Zend/tests/closures/closure_026.phpt
diff --git a/Zend/tests/closure_027.phpt b/Zend/tests/closures/closure_027.phpt
similarity index 100%
rename from Zend/tests/closure_027.phpt
rename to Zend/tests/closures/closure_027.phpt
diff --git a/Zend/tests/closure_028.phpt b/Zend/tests/closures/closure_028.phpt
similarity index 100%
rename from Zend/tests/closure_028.phpt
rename to Zend/tests/closures/closure_028.phpt
diff --git a/Zend/tests/closure_029.phpt b/Zend/tests/closures/closure_029.phpt
similarity index 100%
rename from Zend/tests/closure_029.phpt
rename to Zend/tests/closures/closure_029.phpt
diff --git a/Zend/tests/closure_030.phpt b/Zend/tests/closures/closure_030.phpt
similarity index 100%
rename from Zend/tests/closure_030.phpt
rename to Zend/tests/closures/closure_030.phpt
diff --git a/Zend/tests/closure_031.phpt b/Zend/tests/closures/closure_031.phpt
similarity index 100%
rename from Zend/tests/closure_031.phpt
rename to Zend/tests/closures/closure_031.phpt
diff --git a/Zend/tests/closure_032.phpt b/Zend/tests/closures/closure_032.phpt
similarity index 100%
rename from Zend/tests/closure_032.phpt
rename to Zend/tests/closures/closure_032.phpt
diff --git a/Zend/tests/closure_033.phpt b/Zend/tests/closures/closure_033.phpt
similarity index 100%
rename from Zend/tests/closure_033.phpt
rename to Zend/tests/closures/closure_033.phpt
diff --git a/Zend/tests/closure_034.phpt b/Zend/tests/closures/closure_034.phpt
similarity index 100%
rename from Zend/tests/closure_034.phpt
rename to Zend/tests/closures/closure_034.phpt
diff --git a/Zend/tests/closure_035.phpt b/Zend/tests/closures/closure_035.phpt
similarity index 100%
rename from Zend/tests/closure_035.phpt
rename to Zend/tests/closures/closure_035.phpt
diff --git a/Zend/tests/closure_036.phpt b/Zend/tests/closures/closure_036.phpt
similarity index 100%
rename from Zend/tests/closure_036.phpt
rename to Zend/tests/closures/closure_036.phpt
diff --git a/Zend/tests/closure_037.phpt b/Zend/tests/closures/closure_037.phpt
similarity index 100%
rename from Zend/tests/closure_037.phpt
rename to Zend/tests/closures/closure_037.phpt
diff --git a/Zend/tests/closure_038.phpt b/Zend/tests/closures/closure_038.phpt
similarity index 100%
rename from Zend/tests/closure_038.phpt
rename to Zend/tests/closures/closure_038.phpt
diff --git a/Zend/tests/closure_039.phpt b/Zend/tests/closures/closure_039.phpt
similarity index 100%
rename from Zend/tests/closure_039.phpt
rename to Zend/tests/closures/closure_039.phpt
diff --git a/Zend/tests/closure_040.phpt b/Zend/tests/closures/closure_040.phpt
similarity index 100%
rename from Zend/tests/closure_040.phpt
rename to Zend/tests/closures/closure_040.phpt
diff --git a/Zend/tests/closure_041.phpt b/Zend/tests/closures/closure_041.phpt
similarity index 100%
rename from Zend/tests/closure_041.phpt
rename to Zend/tests/closures/closure_041.phpt
diff --git a/Zend/tests/closure_042.phpt b/Zend/tests/closures/closure_042.phpt
similarity index 76%
rename from Zend/tests/closure_042.phpt
rename to Zend/tests/closures/closure_042.phpt
index dc849a528211b..8bd3c7e4e37f0 100644
--- a/Zend/tests/closure_042.phpt
+++ b/Zend/tests/closures/closure_042.phpt
@@ -7,13 +7,13 @@ $c = function() { var_dump($this); };
 $d = $c->bindTo(new stdClass);
 $d();
 $rm = new ReflectionFunction($d);
-var_dump($rm->getClosureScopeClass()->name); //dummy sope is Closure
+var_dump($rm->getClosureScopeClass()->name); //dummy scope is Closure
 
 //should have the same effect
 $d = $c->bindTo(new stdClass, NULL);
 $d();
 $rm = new ReflectionFunction($d);
-var_dump($rm->getClosureScopeClass()->name); //dummy sope is Closure
+var_dump($rm->getClosureScopeClass()->name); //dummy scope is Closure
 
 echo "Done.\n";
 ?>
diff --git a/Zend/tests/closure_043.phpt b/Zend/tests/closures/closure_043.phpt
similarity index 100%
rename from Zend/tests/closure_043.phpt
rename to Zend/tests/closures/closure_043.phpt
diff --git a/Zend/tests/closure_044.phpt b/Zend/tests/closures/closure_044.phpt
similarity index 100%
rename from Zend/tests/closure_044.phpt
rename to Zend/tests/closures/closure_044.phpt
diff --git a/Zend/tests/closure_045.phpt b/Zend/tests/closures/closure_045.phpt
similarity index 100%
rename from Zend/tests/closure_045.phpt
rename to Zend/tests/closures/closure_045.phpt
diff --git a/Zend/tests/closure_046.phpt b/Zend/tests/closures/closure_046.phpt
similarity index 100%
rename from Zend/tests/closure_046.phpt
rename to Zend/tests/closures/closure_046.phpt
diff --git a/Zend/tests/closure_047.phpt b/Zend/tests/closures/closure_047.phpt
similarity index 100%
rename from Zend/tests/closure_047.phpt
rename to Zend/tests/closures/closure_047.phpt
diff --git a/Zend/tests/closure_048.phpt b/Zend/tests/closures/closure_048.phpt
similarity index 100%
rename from Zend/tests/closure_048.phpt
rename to Zend/tests/closures/closure_048.phpt
diff --git a/Zend/tests/closure_049.phpt b/Zend/tests/closures/closure_049.phpt
similarity index 100%
rename from Zend/tests/closure_049.phpt
rename to Zend/tests/closures/closure_049.phpt
diff --git a/Zend/tests/closure_050.phpt b/Zend/tests/closures/closure_050.phpt
similarity index 100%
rename from Zend/tests/closure_050.phpt
rename to Zend/tests/closures/closure_050.phpt
diff --git a/Zend/tests/closure_051.phpt b/Zend/tests/closures/closure_051.phpt
similarity index 100%
rename from Zend/tests/closure_051.phpt
rename to Zend/tests/closures/closure_051.phpt
diff --git a/Zend/tests/closure_052.phpt b/Zend/tests/closures/closure_052.phpt
similarity index 100%
rename from Zend/tests/closure_052.phpt
rename to Zend/tests/closures/closure_052.phpt
diff --git a/Zend/tests/closure_053.phpt b/Zend/tests/closures/closure_053.phpt
similarity index 100%
rename from Zend/tests/closure_053.phpt
rename to Zend/tests/closures/closure_053.phpt
diff --git a/Zend/tests/closure_054.phpt b/Zend/tests/closures/closure_054.phpt
similarity index 100%
rename from Zend/tests/closure_054.phpt
rename to Zend/tests/closures/closure_054.phpt
diff --git a/Zend/tests/closure_055.phpt b/Zend/tests/closures/closure_055.phpt
similarity index 100%
rename from Zend/tests/closure_055.phpt
rename to Zend/tests/closures/closure_055.phpt
diff --git a/Zend/tests/closure_056.phpt b/Zend/tests/closures/closure_056.phpt
similarity index 100%
rename from Zend/tests/closure_056.phpt
rename to Zend/tests/closures/closure_056.phpt
diff --git a/Zend/tests/closure_057.phpt b/Zend/tests/closures/closure_057.phpt
similarity index 100%
rename from Zend/tests/closure_057.phpt
rename to Zend/tests/closures/closure_057.phpt
diff --git a/Zend/tests/closure_058.phpt b/Zend/tests/closures/closure_058.phpt
similarity index 100%
rename from Zend/tests/closure_058.phpt
rename to Zend/tests/closures/closure_058.phpt
diff --git a/Zend/tests/closure_059.phpt b/Zend/tests/closures/closure_059.phpt
similarity index 100%
rename from Zend/tests/closure_059.phpt
rename to Zend/tests/closures/closure_059.phpt
diff --git a/Zend/tests/closure_060.phpt b/Zend/tests/closures/closure_060.phpt
similarity index 100%
rename from Zend/tests/closure_060.phpt
rename to Zend/tests/closures/closure_060.phpt
diff --git a/Zend/tests/closure_061.phpt b/Zend/tests/closures/closure_061.phpt
similarity index 100%
rename from Zend/tests/closure_061.phpt
rename to Zend/tests/closures/closure_061.phpt
diff --git a/Zend/tests/closure_062.phpt b/Zend/tests/closures/closure_062.phpt
similarity index 100%
rename from Zend/tests/closure_062.phpt
rename to Zend/tests/closures/closure_062.phpt
diff --git a/Zend/tests/closure_063.phpt b/Zend/tests/closures/closure_063.phpt
similarity index 100%
rename from Zend/tests/closure_063.phpt
rename to Zend/tests/closures/closure_063.phpt
diff --git a/Zend/tests/closure_064.phpt b/Zend/tests/closures/closure_064.phpt
similarity index 100%
rename from Zend/tests/closure_064.phpt
rename to Zend/tests/closures/closure_064.phpt
diff --git a/Zend/tests/closure_065.phpt b/Zend/tests/closures/closure_065.phpt
similarity index 100%
rename from Zend/tests/closure_065.phpt
rename to Zend/tests/closures/closure_065.phpt
diff --git a/Zend/tests/closure_066.phpt b/Zend/tests/closures/closure_066.phpt
similarity index 100%
rename from Zend/tests/closure_066.phpt
rename to Zend/tests/closures/closure_066.phpt
diff --git a/Zend/tests/closures/closure_067.phpt b/Zend/tests/closures/closure_067.phpt
new file mode 100644
index 0000000000000..b535f009bf89d
--- /dev/null
+++ b/Zend/tests/closures/closure_067.phpt
@@ -0,0 +1,30 @@
+--TEST--
+ReflectionFunction::get{Short,Namespace}Name() and inNamespace() return the correct data for closures defined in namespaces.
+--FILE--
+baz();
+$r = new \ReflectionFunction($c);
+// Closures are not inside of a namespace, thus the short name is the full name.
+var_dump($r->getShortName());
+// The namespace is empty.
+var_dump($r->getNamespaceName());
+// The function is not inside of a namespace.
+var_dump($r->inNamespace());
+// And the namespace name + the short name together must be the full name.
+var_dump($r->getNamespaceName() . ($r->inNamespace() ? '\\' : '') . $r->getShortName() === $r->getName());
+?>
+--EXPECT--
+string(26) "{closure:Foo\Bar::baz():6}"
+string(0) ""
+bool(false)
+bool(true)
diff --git a/Zend/tests/closures/closure_068.phpt b/Zend/tests/closures/closure_068.phpt
new file mode 100644
index 0000000000000..8ef50e0914b61
--- /dev/null
+++ b/Zend/tests/closures/closure_068.phpt
@@ -0,0 +1,27 @@
+--TEST--
+ReflectionFunction::get{Short,Namespace}Name() and inNamespace() return the correct data for first class callables defined in namespaces.
+--FILE--
+getShortName());
+var_dump($r->getNamespaceName());
+var_dump($r->inNamespace());
+var_dump($r->getNamespaceName() . ($r->inNamespace() ? '\\' : '') . $r->getShortName() === $r->getName());
+
+var_dump($r->getShortName() === $r2->getShortName());
+var_dump($r->getNamespaceName() === $r2->getNamespaceName());
+var_dump($r->inNamespace() === $r2->inNamespace());
+?>
+--EXPECT--
+string(3) "foo"
+string(3) "Foo"
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
diff --git a/Zend/tests/closures/closure_from_callable_error.phpt b/Zend/tests/closures/closure_from_callable_error.phpt
index d30e4fcfa2810..c6fd1ff831f52 100644
--- a/Zend/tests/closures/closure_from_callable_error.phpt
+++ b/Zend/tests/closures/closure_from_callable_error.phpt
@@ -140,7 +140,7 @@ catch (\Throwable $t) {
     echo "Wrong exception type thrown: ".get_class($t)." : ".$t->getMessage()."\n";
 }
 
-echo 'Subclass cannot closure over parant private static method'."\n";
+echo 'Subclass cannot closure over parent private static method'."\n";
 try {
     $subFoo = new SubFoo;
     $fn = $subFoo->closePrivateStaticInvalid();
@@ -205,7 +205,7 @@ Non-existent method should fail
 Non-existent class should fail
 Non-existent function should fail
 Subclass cannot closure over parent private instance method
-Subclass cannot closure over parant private static method
+Subclass cannot closure over parent private static method
 Function scope cannot closure over protected instance method
 Function scope cannot closure over private instance method
 Access private instance method of parent object through "self::" to parent method
diff --git a/Zend/tests/compare_001.phpt b/Zend/tests/comparison/compare_001.phpt
similarity index 100%
rename from Zend/tests/compare_001.phpt
rename to Zend/tests/comparison/compare_001.phpt
diff --git a/Zend/tests/compare_001_64bit.phpt b/Zend/tests/comparison/compare_001_64bit.phpt
similarity index 100%
rename from Zend/tests/compare_001_64bit.phpt
rename to Zend/tests/comparison/compare_001_64bit.phpt
diff --git a/Zend/tests/compare_002.phpt b/Zend/tests/comparison/compare_002.phpt
similarity index 100%
rename from Zend/tests/compare_002.phpt
rename to Zend/tests/comparison/compare_002.phpt
diff --git a/Zend/tests/compare_002_64bit.phpt b/Zend/tests/comparison/compare_002_64bit.phpt
similarity index 100%
rename from Zend/tests/compare_002_64bit.phpt
rename to Zend/tests/comparison/compare_002_64bit.phpt
diff --git a/Zend/tests/compare_003.phpt b/Zend/tests/comparison/compare_003.phpt
similarity index 100%
rename from Zend/tests/compare_003.phpt
rename to Zend/tests/comparison/compare_003.phpt
diff --git a/Zend/tests/compare_003_64bit.phpt b/Zend/tests/comparison/compare_003_64bit.phpt
similarity index 100%
rename from Zend/tests/compare_003_64bit.phpt
rename to Zend/tests/comparison/compare_003_64bit.phpt
diff --git a/Zend/tests/compare_004.phpt b/Zend/tests/comparison/compare_004.phpt
similarity index 100%
rename from Zend/tests/compare_004.phpt
rename to Zend/tests/comparison/compare_004.phpt
diff --git a/Zend/tests/compare_004_64bit.phpt b/Zend/tests/comparison/compare_004_64bit.phpt
similarity index 100%
rename from Zend/tests/compare_004_64bit.phpt
rename to Zend/tests/comparison/compare_004_64bit.phpt
diff --git a/Zend/tests/compare_005.phpt b/Zend/tests/comparison/compare_005.phpt
similarity index 100%
rename from Zend/tests/compare_005.phpt
rename to Zend/tests/comparison/compare_005.phpt
diff --git a/Zend/tests/compare_005_64bit.phpt b/Zend/tests/comparison/compare_005_64bit.phpt
similarity index 100%
rename from Zend/tests/compare_005_64bit.phpt
rename to Zend/tests/comparison/compare_005_64bit.phpt
diff --git a/Zend/tests/compare_006.phpt b/Zend/tests/comparison/compare_006.phpt
similarity index 100%
rename from Zend/tests/compare_006.phpt
rename to Zend/tests/comparison/compare_006.phpt
diff --git a/Zend/tests/compare_006_64bit.phpt b/Zend/tests/comparison/compare_006_64bit.phpt
similarity index 100%
rename from Zend/tests/compare_006_64bit.phpt
rename to Zend/tests/comparison/compare_006_64bit.phpt
diff --git a/Zend/tests/constant_expressions.phpt b/Zend/tests/constant_expressions/constant_expressions.phpt
similarity index 100%
rename from Zend/tests/constant_expressions.phpt
rename to Zend/tests/constant_expressions/constant_expressions.phpt
diff --git a/Zend/tests/constant_expressions_arrays.phpt b/Zend/tests/constant_expressions/constant_expressions_arrays.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_arrays.phpt
rename to Zend/tests/constant_expressions/constant_expressions_arrays.phpt
diff --git a/Zend/tests/constant_expressions_classes.phpt b/Zend/tests/constant_expressions/constant_expressions_classes.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_classes.phpt
rename to Zend/tests/constant_expressions/constant_expressions_classes.phpt
diff --git a/Zend/tests/constant_expressions_coalesce.phpt b/Zend/tests/constant_expressions/constant_expressions_coalesce.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_coalesce.phpt
rename to Zend/tests/constant_expressions/constant_expressions_coalesce.phpt
diff --git a/Zend/tests/constant_expressions_coalesce_empty_dim.phpt b/Zend/tests/constant_expressions/constant_expressions_coalesce_empty_dim.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_coalesce_empty_dim.phpt
rename to Zend/tests/constant_expressions/constant_expressions_coalesce_empty_dim.phpt
diff --git a/Zend/tests/constant_expressions_dynamic.phpt b/Zend/tests/constant_expressions/constant_expressions_dynamic.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_dynamic.phpt
rename to Zend/tests/constant_expressions/constant_expressions_dynamic.phpt
diff --git a/Zend/tests/constant_expressions_dynamic_class_name_error.phpt b/Zend/tests/constant_expressions/constant_expressions_dynamic_class_name_error.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_dynamic_class_name_error.phpt
rename to Zend/tests/constant_expressions/constant_expressions_dynamic_class_name_error.phpt
diff --git a/Zend/tests/constant_expressions_exceptions.inc b/Zend/tests/constant_expressions/constant_expressions_exceptions.inc
similarity index 100%
rename from Zend/tests/constant_expressions_exceptions.inc
rename to Zend/tests/constant_expressions/constant_expressions_exceptions.inc
diff --git a/Zend/tests/constant_expressions_exceptions_001.phpt b/Zend/tests/constant_expressions/constant_expressions_exceptions_001.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_exceptions_001.phpt
rename to Zend/tests/constant_expressions/constant_expressions_exceptions_001.phpt
diff --git a/Zend/tests/constant_expressions_exceptions_002.phpt b/Zend/tests/constant_expressions/constant_expressions_exceptions_002.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_exceptions_002.phpt
rename to Zend/tests/constant_expressions/constant_expressions_exceptions_002.phpt
diff --git a/Zend/tests/constant_expressions_invalid_offset_type_error.phpt b/Zend/tests/constant_expressions/constant_expressions_invalid_offset_type_error.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_invalid_offset_type_error.phpt
rename to Zend/tests/constant_expressions/constant_expressions_invalid_offset_type_error.phpt
diff --git a/Zend/tests/constant_expressions_self_referencing_array.phpt b/Zend/tests/constant_expressions/constant_expressions_self_referencing_array.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_self_referencing_array.phpt
rename to Zend/tests/constant_expressions/constant_expressions_self_referencing_array.phpt
diff --git a/Zend/tests/constant_expressions_static_class_name_error.phpt b/Zend/tests/constant_expressions/constant_expressions_static_class_name_error.phpt
similarity index 100%
rename from Zend/tests/constant_expressions_static_class_name_error.phpt
rename to Zend/tests/constant_expressions/constant_expressions_static_class_name_error.phpt
diff --git a/Zend/tests/ctor_promotion_abstract.phpt b/Zend/tests/ctor_promotion/ctor_promotion_abstract.phpt
similarity index 100%
rename from Zend/tests/ctor_promotion_abstract.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_abstract.phpt
diff --git a/Zend/tests/ctor_promotion_additional_modifiers.phpt b/Zend/tests/ctor_promotion/ctor_promotion_additional_modifiers.phpt
similarity index 100%
rename from Zend/tests/ctor_promotion_additional_modifiers.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_additional_modifiers.phpt
diff --git a/Zend/tests/ctor_promotion_attributes.phpt b/Zend/tests/ctor_promotion/ctor_promotion_attributes.phpt
similarity index 100%
rename from Zend/tests/ctor_promotion_attributes.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_attributes.phpt
diff --git a/Zend/tests/ctor_promotion_basic.phpt b/Zend/tests/ctor_promotion/ctor_promotion_basic.phpt
similarity index 100%
rename from Zend/tests/ctor_promotion_basic.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_basic.phpt
diff --git a/Zend/tests/ctor_promotion_by_ref.phpt b/Zend/tests/ctor_promotion/ctor_promotion_by_ref.phpt
similarity index 100%
rename from Zend/tests/ctor_promotion_by_ref.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_by_ref.phpt
diff --git a/Zend/tests/ctor_promotion_callable_type.phpt b/Zend/tests/ctor_promotion/ctor_promotion_callable_type.phpt
similarity index 100%
rename from Zend/tests/ctor_promotion_callable_type.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_callable_type.phpt
diff --git a/Zend/tests/ctor_promotion_defaults.phpt b/Zend/tests/ctor_promotion/ctor_promotion_defaults.phpt
similarity index 100%
rename from Zend/tests/ctor_promotion_defaults.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_defaults.phpt
diff --git a/Zend/tests/ctor_promotion_free_function.phpt b/Zend/tests/ctor_promotion/ctor_promotion_free_function.phpt
similarity index 100%
rename from Zend/tests/ctor_promotion_free_function.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_free_function.phpt
diff --git a/Zend/tests/ctor_promotion_interface.phpt b/Zend/tests/ctor_promotion/ctor_promotion_interface.phpt
similarity index 100%
rename from Zend/tests/ctor_promotion_interface.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_interface.phpt
diff --git a/Zend/tests/ctor_promotion_mixing.phpt b/Zend/tests/ctor_promotion/ctor_promotion_mixing.phpt
similarity index 92%
rename from Zend/tests/ctor_promotion_mixing.phpt
rename to Zend/tests/ctor_promotion/ctor_promotion_mixing.phpt
index a527654e793f5..403df7d03b4cc 100644
--- a/Zend/tests/ctor_promotion_mixing.phpt
+++ b/Zend/tests/ctor_promotion/ctor_promotion_mixing.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Constructor promotiong mixed with other properties, parameters and code
+Constructor promotion mixed with other properties, parameters and code
 --FILE--
 
 --EXPECTF--
-Fatal error: __debuginfo() must return an array in %s%eZend%etests%edebug_info-error-0.0.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info-error-0.phpt b/Zend/tests/debug_info/debug_info-error-0.phpt
similarity index 73%
rename from Zend/tests/debug_info-error-0.phpt
rename to Zend/tests/debug_info/debug_info-error-0.phpt
index 7dbac320a1754..37289c6468fff 100644
--- a/Zend/tests/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%eZend%etests%edebug_info-error-0.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info-error-1.0.phpt b/Zend/tests/debug_info/debug_info-error-1.0.phpt
similarity index 73%
rename from Zend/tests/debug_info-error-1.0.phpt
rename to Zend/tests/debug_info/debug_info-error-1.0.phpt
index 0213e9daad250..9b168621b5efe 100644
--- a/Zend/tests/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%eZend%etests%edebug_info-error-1.0.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info-error-1.phpt b/Zend/tests/debug_info/debug_info-error-1.phpt
similarity index 73%
rename from Zend/tests/debug_info-error-1.phpt
rename to Zend/tests/debug_info/debug_info-error-1.phpt
index a8e4644b49083..ae01a6055c004 100644
--- a/Zend/tests/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%eZend%etests%edebug_info-error-1.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info-error-empty_str.phpt b/Zend/tests/debug_info/debug_info-error-empty_str.phpt
similarity index 72%
rename from Zend/tests/debug_info-error-empty_str.phpt
rename to Zend/tests/debug_info/debug_info-error-empty_str.phpt
index 39f227cb96750..bbab78cd82021 100644
--- a/Zend/tests/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%eZend%etests%edebug_info-error-empty_str.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info-error-false.phpt b/Zend/tests/debug_info/debug_info-error-false.phpt
similarity index 72%
rename from Zend/tests/debug_info-error-false.phpt
rename to Zend/tests/debug_info/debug_info-error-false.phpt
index bf18ed4d038d8..3e48372c420c2 100644
--- a/Zend/tests/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%eZend%etests%edebug_info-error-false.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info-error-object.phpt b/Zend/tests/debug_info/debug_info-error-object.phpt
similarity index 73%
rename from Zend/tests/debug_info-error-object.phpt
rename to Zend/tests/debug_info/debug_info-error-object.phpt
index e94c2dfb36ccb..42e073999908c 100644
--- a/Zend/tests/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%eZend%etests%edebug_info-error-object.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info-error-resource.phpt b/Zend/tests/debug_info/debug_info-error-resource.phpt
similarity index 75%
rename from Zend/tests/debug_info-error-resource.phpt
rename to Zend/tests/debug_info/debug_info-error-resource.phpt
index 285ed72e33072..ccacce7a74b45 100644
--- a/Zend/tests/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%eZend%etests%edebug_info-error-resource.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info-error-str.phpt b/Zend/tests/debug_info/debug_info-error-str.phpt
similarity index 73%
rename from Zend/tests/debug_info-error-str.phpt
rename to Zend/tests/debug_info/debug_info-error-str.phpt
index daf0ad3b588ea..85d3f63b97e05 100644
--- a/Zend/tests/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%eZend%etests%edebug_info-error-str.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info-error-true.phpt b/Zend/tests/debug_info/debug_info-error-true.phpt
similarity index 72%
rename from Zend/tests/debug_info-error-true.phpt
rename to Zend/tests/debug_info/debug_info-error-true.phpt
index 41a68c5c3965f..3843c6a7a14a5 100644
--- a/Zend/tests/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%eZend%etests%edebug_info-error-true.php on line %d
+Fatal error: __debuginfo() must return an array in %s on line %d
diff --git a/Zend/tests/debug_info.phpt b/Zend/tests/debug_info/debug_info.phpt
similarity index 100%
rename from Zend/tests/debug_info.phpt
rename to Zend/tests/debug_info/debug_info.phpt
diff --git a/Zend/tests/dereference_001.phpt b/Zend/tests/dereference/dereference_001.phpt
similarity index 100%
rename from Zend/tests/dereference_001.phpt
rename to Zend/tests/dereference/dereference_001.phpt
diff --git a/Zend/tests/dereference_002.phpt b/Zend/tests/dereference/dereference_002.phpt
similarity index 100%
rename from Zend/tests/dereference_002.phpt
rename to Zend/tests/dereference/dereference_002.phpt
diff --git a/Zend/tests/dereference_003.phpt b/Zend/tests/dereference/dereference_003.phpt
similarity index 100%
rename from Zend/tests/dereference_003.phpt
rename to Zend/tests/dereference/dereference_003.phpt
diff --git a/Zend/tests/dereference_004.phpt b/Zend/tests/dereference/dereference_004.phpt
similarity index 100%
rename from Zend/tests/dereference_004.phpt
rename to Zend/tests/dereference/dereference_004.phpt
diff --git a/Zend/tests/dereference_005.phpt b/Zend/tests/dereference/dereference_005.phpt
similarity index 100%
rename from Zend/tests/dereference_005.phpt
rename to Zend/tests/dereference/dereference_005.phpt
diff --git a/Zend/tests/dereference_006.phpt b/Zend/tests/dereference/dereference_006.phpt
similarity index 100%
rename from Zend/tests/dereference_006.phpt
rename to Zend/tests/dereference/dereference_006.phpt
diff --git a/Zend/tests/dereference_007.phpt b/Zend/tests/dereference/dereference_007.phpt
similarity index 100%
rename from Zend/tests/dereference_007.phpt
rename to Zend/tests/dereference/dereference_007.phpt
diff --git a/Zend/tests/dereference_008.phpt b/Zend/tests/dereference/dereference_008.phpt
similarity index 100%
rename from Zend/tests/dereference_008.phpt
rename to Zend/tests/dereference/dereference_008.phpt
diff --git a/Zend/tests/dereference_009.phpt b/Zend/tests/dereference/dereference_009.phpt
similarity index 100%
rename from Zend/tests/dereference_009.phpt
rename to Zend/tests/dereference/dereference_009.phpt
diff --git a/Zend/tests/dereference_010.phpt b/Zend/tests/dereference/dereference_010.phpt
similarity index 100%
rename from Zend/tests/dereference_010.phpt
rename to Zend/tests/dereference/dereference_010.phpt
diff --git a/Zend/tests/dereference_011.phpt b/Zend/tests/dereference/dereference_011.phpt
similarity index 100%
rename from Zend/tests/dereference_011.phpt
rename to Zend/tests/dereference/dereference_011.phpt
diff --git a/Zend/tests/dereference_012.phpt b/Zend/tests/dereference/dereference_012.phpt
similarity index 100%
rename from Zend/tests/dereference_012.phpt
rename to Zend/tests/dereference/dereference_012.phpt
diff --git a/Zend/tests/dereference_013.phpt b/Zend/tests/dereference/dereference_013.phpt
similarity index 100%
rename from Zend/tests/dereference_013.phpt
rename to Zend/tests/dereference/dereference_013.phpt
diff --git a/Zend/tests/dereference_014.phpt b/Zend/tests/dereference/dereference_014.phpt
similarity index 100%
rename from Zend/tests/dereference_014.phpt
rename to Zend/tests/dereference/dereference_014.phpt
diff --git a/Zend/tests/dynamic_call_002.phpt b/Zend/tests/dynamic_call/dynamic_call_002.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_002.phpt
rename to Zend/tests/dynamic_call/dynamic_call_002.phpt
diff --git a/Zend/tests/dynamic_call_003.phpt b/Zend/tests/dynamic_call/dynamic_call_003.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_003.phpt
rename to Zend/tests/dynamic_call/dynamic_call_003.phpt
diff --git a/Zend/tests/dynamic_call_004.phpt b/Zend/tests/dynamic_call/dynamic_call_004.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_004.phpt
rename to Zend/tests/dynamic_call/dynamic_call_004.phpt
diff --git a/Zend/tests/dynamic_call_005.phpt b/Zend/tests/dynamic_call/dynamic_call_005.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_005.phpt
rename to Zend/tests/dynamic_call/dynamic_call_005.phpt
diff --git a/Zend/tests/dynamic_call_006.phpt b/Zend/tests/dynamic_call/dynamic_call_006.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_006.phpt
rename to Zend/tests/dynamic_call/dynamic_call_006.phpt
diff --git a/Zend/tests/dynamic_call_007.phpt b/Zend/tests/dynamic_call/dynamic_call_007.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_007.phpt
rename to Zend/tests/dynamic_call/dynamic_call_007.phpt
diff --git a/Zend/tests/dynamic_call_008.phpt b/Zend/tests/dynamic_call/dynamic_call_008.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_008.phpt
rename to Zend/tests/dynamic_call/dynamic_call_008.phpt
diff --git a/Zend/tests/dynamic_call_freeing.phpt b/Zend/tests/dynamic_call/dynamic_call_freeing.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_freeing.phpt
rename to Zend/tests/dynamic_call/dynamic_call_freeing.phpt
diff --git a/Zend/tests/dynamic_call_non_static.phpt b/Zend/tests/dynamic_call/dynamic_call_non_static.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_non_static.phpt
rename to Zend/tests/dynamic_call/dynamic_call_non_static.phpt
diff --git a/Zend/tests/dynamic_call_to_ref_returning_function.phpt b/Zend/tests/dynamic_call/dynamic_call_to_ref_returning_function.phpt
similarity index 100%
rename from Zend/tests/dynamic_call_to_ref_returning_function.phpt
rename to Zend/tests/dynamic_call/dynamic_call_to_ref_returning_function.phpt
diff --git a/Zend/tests/dynamic_fully_qualified_call.phpt b/Zend/tests/dynamic_call/dynamic_fully_qualified_call.phpt
similarity index 100%
rename from Zend/tests/dynamic_fully_qualified_call.phpt
rename to Zend/tests/dynamic_call/dynamic_fully_qualified_call.phpt
diff --git a/Zend/tests/e_strict-deprecated.phpt b/Zend/tests/e_strict-deprecated.phpt
new file mode 100644
index 0000000000000..71666e75c22f4
--- /dev/null
+++ b/Zend/tests/e_strict-deprecated.phpt
@@ -0,0 +1,14 @@
+--TEST--
+The E_STRICT constant is deprecated
+--FILE--
+
+--EXPECTF--
+int(30719)
+
+Deprecated: Constant E_STRICT is deprecated in %s on line %d
+int(2048)
diff --git a/Zend/tests/enum/empty-from.phpt b/Zend/tests/enum/empty-from.phpt
index db42c78ed31c7..f61b3b89ae410 100644
--- a/Zend/tests/enum/empty-from.phpt
+++ b/Zend/tests/enum/empty-from.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Empty enum with from/tryFrom doens't segfault
+Empty enum with from/tryFrom doesn't segfault
 --FILE--
 
 --EXPECTF--
-Deprecated: Using "_" as a class name is deprecated since 8.4 in %s on line %d
+Deprecated: Using "_" as an enum name is deprecated since 8.4 in %s on line %d
 
-Deprecated: Using "_" as a class name is deprecated since 8.4 in %s on line %d
+Deprecated: Using "_" as an enum name is deprecated since 8.4 in %s on line %d
diff --git a/Zend/tests/enum/extending-builtin-error.phpt b/Zend/tests/enum/extending-builtin-error.phpt
new file mode 100644
index 0000000000000..a796c65a617fe
--- /dev/null
+++ b/Zend/tests/enum/extending-builtin-error.phpt
@@ -0,0 +1,10 @@
+--TEST--
+GH-16315: Extending built-in enum
+--FILE--
+
+--EXPECTF--
+Fatal error: Class Demo cannot extend enum RoundingMode in %s on line %d
diff --git a/Zend/tests/enum/extending-user-error.phpt b/Zend/tests/enum/extending-user-error.phpt
new file mode 100644
index 0000000000000..c68db491f3515
--- /dev/null
+++ b/Zend/tests/enum/extending-user-error.phpt
@@ -0,0 +1,12 @@
+--TEST--
+GH-16315: Extending userland enum
+--FILE--
+
+--EXPECTF--
+Fatal error: Class Demo cannot extend enum MyEnum in %s on line 5
diff --git a/Zend/tests/enum/final.phpt b/Zend/tests/enum/final.phpt
index 353e1868d2fa8..a373b28ddece0 100644
--- a/Zend/tests/enum/final.phpt
+++ b/Zend/tests/enum/final.phpt
@@ -5,8 +5,9 @@ Enum is final
 
 enum Foo {}
 
-class Bar extends Foo {}
+$final = new ReflectionClass(Foo::class)->isFinal();
+var_dump($final);
 
 ?>
---EXPECTF--
-Fatal error: Class Bar cannot extend final class Foo in %s on line %d
+--EXPECT--
+bool(true)
diff --git a/Zend/tests/errmsg_001.phpt b/Zend/tests/errmsg/errmsg_001.phpt
similarity index 100%
rename from Zend/tests/errmsg_001.phpt
rename to Zend/tests/errmsg/errmsg_001.phpt
diff --git a/Zend/tests/errmsg_002.phpt b/Zend/tests/errmsg/errmsg_002.phpt
similarity index 100%
rename from Zend/tests/errmsg_002.phpt
rename to Zend/tests/errmsg/errmsg_002.phpt
diff --git a/Zend/tests/errmsg_003.phpt b/Zend/tests/errmsg/errmsg_003.phpt
similarity index 100%
rename from Zend/tests/errmsg_003.phpt
rename to Zend/tests/errmsg/errmsg_003.phpt
diff --git a/Zend/tests/errmsg_004.phpt b/Zend/tests/errmsg/errmsg_004.phpt
similarity index 100%
rename from Zend/tests/errmsg_004.phpt
rename to Zend/tests/errmsg/errmsg_004.phpt
diff --git a/Zend/tests/errmsg_005.phpt b/Zend/tests/errmsg/errmsg_005.phpt
similarity index 100%
rename from Zend/tests/errmsg_005.phpt
rename to Zend/tests/errmsg/errmsg_005.phpt
diff --git a/Zend/tests/errmsg_006.phpt b/Zend/tests/errmsg/errmsg_006.phpt
similarity index 100%
rename from Zend/tests/errmsg_006.phpt
rename to Zend/tests/errmsg/errmsg_006.phpt
diff --git a/Zend/tests/errmsg_007.phpt b/Zend/tests/errmsg/errmsg_007.phpt
similarity index 100%
rename from Zend/tests/errmsg_007.phpt
rename to Zend/tests/errmsg/errmsg_007.phpt
diff --git a/Zend/tests/errmsg_008.phpt b/Zend/tests/errmsg/errmsg_008.phpt
similarity index 100%
rename from Zend/tests/errmsg_008.phpt
rename to Zend/tests/errmsg/errmsg_008.phpt
diff --git a/Zend/tests/errmsg_009.phpt b/Zend/tests/errmsg/errmsg_009.phpt
similarity index 100%
rename from Zend/tests/errmsg_009.phpt
rename to Zend/tests/errmsg/errmsg_009.phpt
diff --git a/Zend/tests/errmsg_010.phpt b/Zend/tests/errmsg/errmsg_010.phpt
similarity index 100%
rename from Zend/tests/errmsg_010.phpt
rename to Zend/tests/errmsg/errmsg_010.phpt
diff --git a/Zend/tests/errmsg_011.phpt b/Zend/tests/errmsg/errmsg_011.phpt
similarity index 100%
rename from Zend/tests/errmsg_011.phpt
rename to Zend/tests/errmsg/errmsg_011.phpt
diff --git a/Zend/tests/errmsg_013.phpt b/Zend/tests/errmsg/errmsg_013.phpt
similarity index 100%
rename from Zend/tests/errmsg_013.phpt
rename to Zend/tests/errmsg/errmsg_013.phpt
diff --git a/Zend/tests/errmsg_015.phpt b/Zend/tests/errmsg/errmsg_015.phpt
similarity index 100%
rename from Zend/tests/errmsg_015.phpt
rename to Zend/tests/errmsg/errmsg_015.phpt
diff --git a/Zend/tests/errmsg_016.phpt b/Zend/tests/errmsg/errmsg_016.phpt
similarity index 100%
rename from Zend/tests/errmsg_016.phpt
rename to Zend/tests/errmsg/errmsg_016.phpt
diff --git a/Zend/tests/errmsg_017.phpt b/Zend/tests/errmsg/errmsg_017.phpt
similarity index 100%
rename from Zend/tests/errmsg_017.phpt
rename to Zend/tests/errmsg/errmsg_017.phpt
diff --git a/Zend/tests/errmsg_018.phpt b/Zend/tests/errmsg/errmsg_018.phpt
similarity index 69%
rename from Zend/tests/errmsg_018.phpt
rename to Zend/tests/errmsg/errmsg_018.phpt
index 13a0cf451114a..070247e4d419c 100644
--- a/Zend/tests/errmsg_018.phpt
+++ b/Zend/tests/errmsg/errmsg_018.phpt
@@ -10,4 +10,4 @@ class test {
 echo "Done\n";
 ?>
 --EXPECTF--
-Fatal error: Class test contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (test::foo) in %s on line %d
+Fatal error: Class test contains 1 abstract method and must therefore be declared abstract or implement the remaining method (test::foo) in %s on line %d
diff --git a/Zend/tests/errmsg_019.phpt b/Zend/tests/errmsg/errmsg_019.phpt
similarity index 100%
rename from Zend/tests/errmsg_019.phpt
rename to Zend/tests/errmsg/errmsg_019.phpt
diff --git a/Zend/tests/errmsg_020.phpt b/Zend/tests/errmsg/errmsg_020.phpt
similarity index 100%
rename from Zend/tests/errmsg_020.phpt
rename to Zend/tests/errmsg/errmsg_020.phpt
diff --git a/Zend/tests/errmsg_021.phpt b/Zend/tests/errmsg/errmsg_021.phpt
similarity index 100%
rename from Zend/tests/errmsg_021.phpt
rename to Zend/tests/errmsg/errmsg_021.phpt
diff --git a/Zend/tests/errmsg_022.phpt b/Zend/tests/errmsg/errmsg_022.phpt
similarity index 100%
rename from Zend/tests/errmsg_022.phpt
rename to Zend/tests/errmsg/errmsg_022.phpt
diff --git a/Zend/tests/errmsg_023.phpt b/Zend/tests/errmsg/errmsg_023.phpt
similarity index 100%
rename from Zend/tests/errmsg_023.phpt
rename to Zend/tests/errmsg/errmsg_023.phpt
diff --git a/Zend/tests/errmsg_024.phpt b/Zend/tests/errmsg/errmsg_024.phpt
similarity index 100%
rename from Zend/tests/errmsg_024.phpt
rename to Zend/tests/errmsg/errmsg_024.phpt
diff --git a/Zend/tests/errmsg_025.phpt b/Zend/tests/errmsg/errmsg_025.phpt
similarity index 100%
rename from Zend/tests/errmsg_025.phpt
rename to Zend/tests/errmsg/errmsg_025.phpt
diff --git a/Zend/tests/errmsg_026.phpt b/Zend/tests/errmsg/errmsg_026.phpt
similarity index 100%
rename from Zend/tests/errmsg_026.phpt
rename to Zend/tests/errmsg/errmsg_026.phpt
diff --git a/Zend/tests/errmsg_027.phpt b/Zend/tests/errmsg/errmsg_027.phpt
similarity index 100%
rename from Zend/tests/errmsg_027.phpt
rename to Zend/tests/errmsg/errmsg_027.phpt
diff --git a/Zend/tests/errmsg/errmsg_028.phpt b/Zend/tests/errmsg/errmsg_028.phpt
new file mode 100644
index 0000000000000..e6da8b47fe1c0
--- /dev/null
+++ b/Zend/tests/errmsg/errmsg_028.phpt
@@ -0,0 +1,12 @@
+--TEST--
+errmsg: cannot use "self" as class name
+--FILE--
+
+--EXPECTF--
+Fatal error: Cannot use "self" as a class name as it is reserved in %s on line %d
diff --git a/Zend/tests/errmsg/errmsg_029.phpt b/Zend/tests/errmsg/errmsg_029.phpt
new file mode 100644
index 0000000000000..fdcb4318f7918
--- /dev/null
+++ b/Zend/tests/errmsg/errmsg_029.phpt
@@ -0,0 +1,12 @@
+--TEST--
+errmsg: cannot use "parent" as class name
+--FILE--
+
+--EXPECTF--
+Fatal error: Cannot use "parent" as a class name as it is reserved in %s on line %d
diff --git a/Zend/tests/errmsg/errmsg_030.phpt b/Zend/tests/errmsg/errmsg_030.phpt
new file mode 100644
index 0000000000000..8ab45455fadfa
--- /dev/null
+++ b/Zend/tests/errmsg/errmsg_030.phpt
@@ -0,0 +1,12 @@
+--TEST--
+errmsg: cannot use "self" as parent class name
+--FILE--
+
+--EXPECTF--
+Fatal error: Cannot use "self" as class name, as it is reserved in %s on line %d
diff --git a/Zend/tests/errmsg/errmsg_031.phpt b/Zend/tests/errmsg/errmsg_031.phpt
new file mode 100644
index 0000000000000..83df35c033ad8
--- /dev/null
+++ b/Zend/tests/errmsg/errmsg_031.phpt
@@ -0,0 +1,12 @@
+--TEST--
+errmsg: cannot use "parent" as parent class name
+--FILE--
+
+--EXPECTF--
+Fatal error: Cannot use "parent" as class name, as it is reserved in %s on line %d
diff --git a/Zend/tests/errmsg_032.phpt b/Zend/tests/errmsg/errmsg_032.phpt
similarity index 100%
rename from Zend/tests/errmsg_032.phpt
rename to Zend/tests/errmsg/errmsg_032.phpt
diff --git a/Zend/tests/errmsg_033.phpt b/Zend/tests/errmsg/errmsg_033.phpt
similarity index 100%
rename from Zend/tests/errmsg_033.phpt
rename to Zend/tests/errmsg/errmsg_033.phpt
diff --git a/Zend/tests/errmsg_034.phpt b/Zend/tests/errmsg/errmsg_034.phpt
similarity index 100%
rename from Zend/tests/errmsg_034.phpt
rename to Zend/tests/errmsg/errmsg_034.phpt
diff --git a/Zend/tests/errmsg_035.phpt b/Zend/tests/errmsg/errmsg_035.phpt
similarity index 50%
rename from Zend/tests/errmsg_035.phpt
rename to Zend/tests/errmsg/errmsg_035.phpt
index 140e3e9cf47f9..a6ab5d1d553c1 100644
--- a/Zend/tests/errmsg_035.phpt
+++ b/Zend/tests/errmsg/errmsg_035.phpt
@@ -1,5 +1,5 @@
 --TEST--
-errmsg: cannot use 'self' as interface name
+errmsg: cannot use "self" as interface name
 --FILE--
 
 --EXPECTF--
-Fatal error: Cannot use 'self' as interface name, as it is reserved in %s on line %d
+Fatal error: Cannot use "self" as interface name, as it is reserved in %s on line %d
diff --git a/Zend/tests/errmsg_036.phpt b/Zend/tests/errmsg/errmsg_036.phpt
similarity index 50%
rename from Zend/tests/errmsg_036.phpt
rename to Zend/tests/errmsg/errmsg_036.phpt
index 33c6bca1d6a74..43255aae983de 100644
--- a/Zend/tests/errmsg_036.phpt
+++ b/Zend/tests/errmsg/errmsg_036.phpt
@@ -1,5 +1,5 @@
 --TEST--
-errmsg: cannot use 'parent' as interface name
+errmsg: cannot use "parent" as interface name
 --FILE--
 
 --EXPECTF--
-Fatal error: Cannot use 'parent' as interface name, as it is reserved in %s on line %d
+Fatal error: Cannot use "parent" as interface name, as it is reserved in %s on line %d
diff --git a/Zend/tests/errmsg_037.phpt b/Zend/tests/errmsg/errmsg_037.phpt
similarity index 100%
rename from Zend/tests/errmsg_037.phpt
rename to Zend/tests/errmsg/errmsg_037.phpt
diff --git a/Zend/tests/errmsg_039.phpt b/Zend/tests/errmsg/errmsg_039.phpt
similarity index 100%
rename from Zend/tests/errmsg_039.phpt
rename to Zend/tests/errmsg/errmsg_039.phpt
diff --git a/Zend/tests/errmsg_040.phpt b/Zend/tests/errmsg/errmsg_040.phpt
similarity index 100%
rename from Zend/tests/errmsg_040.phpt
rename to Zend/tests/errmsg/errmsg_040.phpt
diff --git a/Zend/tests/errmsg_042.phpt b/Zend/tests/errmsg/errmsg_042.phpt
similarity index 100%
rename from Zend/tests/errmsg_042.phpt
rename to Zend/tests/errmsg/errmsg_042.phpt
diff --git a/Zend/tests/errmsg_044.phpt b/Zend/tests/errmsg/errmsg_044.phpt
similarity index 100%
rename from Zend/tests/errmsg_044.phpt
rename to Zend/tests/errmsg/errmsg_044.phpt
diff --git a/Zend/tests/errmsg_045.phpt b/Zend/tests/errmsg/errmsg_045.phpt
similarity index 100%
rename from Zend/tests/errmsg_045.phpt
rename to Zend/tests/errmsg/errmsg_045.phpt
diff --git a/Zend/tests/errmsg_028.phpt b/Zend/tests/errmsg_028.phpt
deleted file mode 100644
index 12fd36384fb2f..0000000000000
--- a/Zend/tests/errmsg_028.phpt
+++ /dev/null
@@ -1,12 +0,0 @@
---TEST--
-errmsg: cannot use 'self' as class name
---FILE--
-
---EXPECTF--
-Fatal error: Cannot use 'self' as class name as it is reserved in %s on line %d
diff --git a/Zend/tests/errmsg_029.phpt b/Zend/tests/errmsg_029.phpt
deleted file mode 100644
index e40cb2dc68240..0000000000000
--- a/Zend/tests/errmsg_029.phpt
+++ /dev/null
@@ -1,12 +0,0 @@
---TEST--
-errmsg: cannot use 'parent' as class name
---FILE--
-
---EXPECTF--
-Fatal error: Cannot use 'parent' as class name as it is reserved in %s on line %d
diff --git a/Zend/tests/errmsg_030.phpt b/Zend/tests/errmsg_030.phpt
deleted file mode 100644
index 589965cf08c03..0000000000000
--- a/Zend/tests/errmsg_030.phpt
+++ /dev/null
@@ -1,12 +0,0 @@
---TEST--
-errmsg: cannot use 'self' as parent class name
---FILE--
-
---EXPECTF--
-Fatal error: Cannot use 'self' as class name, as it is reserved in %s on line %d
diff --git a/Zend/tests/errmsg_031.phpt b/Zend/tests/errmsg_031.phpt
deleted file mode 100644
index ed1d0bec2d763..0000000000000
--- a/Zend/tests/errmsg_031.phpt
+++ /dev/null
@@ -1,12 +0,0 @@
---TEST--
-errmsg: cannot use 'parent' as parent class name
---FILE--
-
---EXPECTF--
-Fatal error: Cannot use 'parent' as class name, as it is reserved in %s on line %d
diff --git a/Zend/tests/error_reporting01.phpt b/Zend/tests/error_reporting/error_reporting01.phpt
similarity index 96%
rename from Zend/tests/error_reporting01.phpt
rename to Zend/tests/error_reporting/error_reporting01.phpt
index 97524b43fd2b1..276cb08b75f04 100644
--- a/Zend/tests/error_reporting01.phpt
+++ b/Zend/tests/error_reporting/error_reporting01.phpt
@@ -22,5 +22,5 @@ var_dump(error_reporting());
 echo "Done\n";
 ?>
 --EXPECT--
-int(32767)
+int(30719)
 Done
diff --git a/Zend/tests/error_reporting02.phpt b/Zend/tests/error_reporting/error_reporting02.phpt
similarity index 96%
rename from Zend/tests/error_reporting02.phpt
rename to Zend/tests/error_reporting/error_reporting02.phpt
index 5caf265d76da0..6750d6b0913c9 100644
--- a/Zend/tests/error_reporting02.phpt
+++ b/Zend/tests/error_reporting/error_reporting02.phpt
@@ -23,5 +23,5 @@ var_dump(error_reporting());
 echo "Done\n";
 ?>
 --EXPECT--
-int(32767)
+int(30719)
 Done
diff --git a/Zend/tests/error_reporting03.phpt b/Zend/tests/error_reporting/error_reporting03.phpt
similarity index 97%
rename from Zend/tests/error_reporting03.phpt
rename to Zend/tests/error_reporting/error_reporting03.phpt
index d6c442bebb053..9f00a2dab8bd1 100644
--- a/Zend/tests/error_reporting03.phpt
+++ b/Zend/tests/error_reporting/error_reporting03.phpt
@@ -31,5 +31,5 @@ echo "Done\n";
 ?>
 --EXPECTF--
 Warning: Undefined variable $undef2 in %s on line %d
-int(32767)
+int(30719)
 Done
diff --git a/Zend/tests/error_reporting04.phpt b/Zend/tests/error_reporting/error_reporting04.phpt
similarity index 96%
rename from Zend/tests/error_reporting04.phpt
rename to Zend/tests/error_reporting/error_reporting04.phpt
index f53565de9e274..8818215941cca 100644
--- a/Zend/tests/error_reporting04.phpt
+++ b/Zend/tests/error_reporting/error_reporting04.phpt
@@ -19,5 +19,5 @@ echo "Done\n";
 ?>
 --EXPECTF--
 Warning: Undefined variable $undef in %s on line %d
-int(32767)
+int(30719)
 Done
diff --git a/Zend/tests/error_reporting05.phpt b/Zend/tests/error_reporting/error_reporting05.phpt
similarity index 97%
rename from Zend/tests/error_reporting05.phpt
rename to Zend/tests/error_reporting/error_reporting05.phpt
index 9ffd3971a1217..e989982fe0077 100644
--- a/Zend/tests/error_reporting05.phpt
+++ b/Zend/tests/error_reporting/error_reporting05.phpt
@@ -30,5 +30,5 @@ echo "Done\n";
 Warning: Undefined variable $undef_value in %s on line %d
 
 Warning: Undefined variable $undef_name in %s on line %d
-int(32767)
+int(30719)
 Done
diff --git a/Zend/tests/error_reporting06.phpt b/Zend/tests/error_reporting/error_reporting06.phpt
similarity index 96%
rename from Zend/tests/error_reporting06.phpt
rename to Zend/tests/error_reporting/error_reporting06.phpt
index 809c1d614bbb2..004a93f5b6b67 100644
--- a/Zend/tests/error_reporting06.phpt
+++ b/Zend/tests/error_reporting/error_reporting06.phpt
@@ -26,5 +26,5 @@ var_dump(error_reporting());
 echo "Done\n";
 ?>
 --EXPECT--
-int(32767)
+int(30719)
 Done
diff --git a/Zend/tests/error_reporting07.phpt b/Zend/tests/error_reporting/error_reporting07.phpt
similarity index 96%
rename from Zend/tests/error_reporting07.phpt
rename to Zend/tests/error_reporting/error_reporting07.phpt
index 8b57847b0b015..99cf55230aafe 100644
--- a/Zend/tests/error_reporting07.phpt
+++ b/Zend/tests/error_reporting/error_reporting07.phpt
@@ -26,5 +26,5 @@ var_dump(error_reporting());
 echo "Done\n";
 ?>
 --EXPECT--
-int(32767)
+int(30719)
 Done
diff --git a/Zend/tests/error_reporting08.phpt b/Zend/tests/error_reporting/error_reporting08.phpt
similarity index 97%
rename from Zend/tests/error_reporting08.phpt
rename to Zend/tests/error_reporting/error_reporting08.phpt
index 2450abfc679df..3e26965a8093a 100644
--- a/Zend/tests/error_reporting08.phpt
+++ b/Zend/tests/error_reporting/error_reporting08.phpt
@@ -28,5 +28,5 @@ echo "Done\n";
 ?>
 --EXPECTF--
 Warning: Undefined variable $undef3 in %s on line %d
-int(32767)
+int(30719)
 Done
diff --git a/Zend/tests/error_reporting09.phpt b/Zend/tests/error_reporting/error_reporting09.phpt
similarity index 97%
rename from Zend/tests/error_reporting09.phpt
rename to Zend/tests/error_reporting/error_reporting09.phpt
index 39e52adbf5476..2636652278f1c 100644
--- a/Zend/tests/error_reporting09.phpt
+++ b/Zend/tests/error_reporting/error_reporting09.phpt
@@ -27,5 +27,5 @@ echo "Done\n";
 Warning: Undefined variable $blah in %s on line %d
 
 Warning: Undefined variable $undef2 in %s on line %d
-int(32767)
+int(30719)
 Done
diff --git a/Zend/tests/error_reporting10.phpt b/Zend/tests/error_reporting/error_reporting10.phpt
similarity index 95%
rename from Zend/tests/error_reporting10.phpt
rename to Zend/tests/error_reporting/error_reporting10.phpt
index c3ad2668cdc1b..398784ac37efc 100644
--- a/Zend/tests/error_reporting10.phpt
+++ b/Zend/tests/error_reporting/error_reporting10.phpt
@@ -29,6 +29,6 @@ var_dump(error_reporting());
 echo "Done\n";
 ?>
 --EXPECT--
-int(32767)
-int(32759)
+int(30719)
+int(30711)
 Done
diff --git a/Zend/tests/exception_001.phpt b/Zend/tests/exceptions/exception_001.phpt
similarity index 100%
rename from Zend/tests/exception_001.phpt
rename to Zend/tests/exceptions/exception_001.phpt
diff --git a/Zend/tests/exception_002.phpt b/Zend/tests/exceptions/exception_002.phpt
similarity index 100%
rename from Zend/tests/exception_002.phpt
rename to Zend/tests/exceptions/exception_002.phpt
diff --git a/Zend/tests/exception_003.phpt b/Zend/tests/exceptions/exception_003.phpt
similarity index 100%
rename from Zend/tests/exception_003.phpt
rename to Zend/tests/exceptions/exception_003.phpt
diff --git a/Zend/tests/exception_004.phpt b/Zend/tests/exceptions/exception_004.phpt
similarity index 100%
rename from Zend/tests/exception_004.phpt
rename to Zend/tests/exceptions/exception_004.phpt
diff --git a/Zend/tests/exception_005.phpt b/Zend/tests/exceptions/exception_005.phpt
similarity index 100%
rename from Zend/tests/exception_005.phpt
rename to Zend/tests/exceptions/exception_005.phpt
diff --git a/Zend/tests/exception_006.phpt b/Zend/tests/exceptions/exception_006.phpt
similarity index 100%
rename from Zend/tests/exception_006.phpt
rename to Zend/tests/exceptions/exception_006.phpt
diff --git a/Zend/tests/exception_007.phpt b/Zend/tests/exceptions/exception_007.phpt
similarity index 100%
rename from Zend/tests/exception_007.phpt
rename to Zend/tests/exceptions/exception_007.phpt
diff --git a/Zend/tests/exception_008.phpt b/Zend/tests/exceptions/exception_008.phpt
similarity index 100%
rename from Zend/tests/exception_008.phpt
rename to Zend/tests/exceptions/exception_008.phpt
diff --git a/Zend/tests/exception_009.phpt b/Zend/tests/exceptions/exception_009.phpt
similarity index 100%
rename from Zend/tests/exception_009.phpt
rename to Zend/tests/exceptions/exception_009.phpt
diff --git a/Zend/tests/exception_011.phpt b/Zend/tests/exceptions/exception_011.phpt
similarity index 100%
rename from Zend/tests/exception_011.phpt
rename to Zend/tests/exceptions/exception_011.phpt
diff --git a/Zend/tests/exception_013.phpt b/Zend/tests/exceptions/exception_013.phpt
similarity index 100%
rename from Zend/tests/exception_013.phpt
rename to Zend/tests/exceptions/exception_013.phpt
diff --git a/Zend/tests/exception_014.phpt b/Zend/tests/exceptions/exception_014.phpt
similarity index 100%
rename from Zend/tests/exception_014.phpt
rename to Zend/tests/exceptions/exception_014.phpt
diff --git a/Zend/tests/exception_015.phpt b/Zend/tests/exceptions/exception_015.phpt
similarity index 100%
rename from Zend/tests/exception_015.phpt
rename to Zend/tests/exceptions/exception_015.phpt
diff --git a/Zend/tests/exception_016.phpt b/Zend/tests/exceptions/exception_016.phpt
similarity index 100%
rename from Zend/tests/exception_016.phpt
rename to Zend/tests/exceptions/exception_016.phpt
diff --git a/Zend/tests/exception_017.phpt b/Zend/tests/exceptions/exception_017.phpt
similarity index 100%
rename from Zend/tests/exception_017.phpt
rename to Zend/tests/exceptions/exception_017.phpt
diff --git a/Zend/tests/exception_018.phpt b/Zend/tests/exceptions/exception_018.phpt
similarity index 100%
rename from Zend/tests/exception_018.phpt
rename to Zend/tests/exceptions/exception_018.phpt
diff --git a/Zend/tests/exception_019.phpt b/Zend/tests/exceptions/exception_019.phpt
similarity index 100%
rename from Zend/tests/exception_019.phpt
rename to Zend/tests/exceptions/exception_019.phpt
diff --git a/Zend/tests/exception_020.phpt b/Zend/tests/exceptions/exception_020.phpt
similarity index 100%
rename from Zend/tests/exception_020.phpt
rename to Zend/tests/exceptions/exception_020.phpt
diff --git a/Zend/tests/exception_021.phpt b/Zend/tests/exceptions/exception_021.phpt
similarity index 100%
rename from Zend/tests/exception_021.phpt
rename to Zend/tests/exceptions/exception_021.phpt
diff --git a/Zend/tests/exception_022.phpt b/Zend/tests/exceptions/exception_022.phpt
similarity index 100%
rename from Zend/tests/exception_022.phpt
rename to Zend/tests/exceptions/exception_022.phpt
diff --git a/Zend/tests/exception_023.phpt b/Zend/tests/exceptions/exception_023.phpt
similarity index 100%
rename from Zend/tests/exception_023.phpt
rename to Zend/tests/exceptions/exception_023.phpt
diff --git a/Zend/tests/exception_024.phpt b/Zend/tests/exceptions/exception_024.phpt
similarity index 100%
rename from Zend/tests/exception_024.phpt
rename to Zend/tests/exceptions/exception_024.phpt
diff --git a/Zend/tests/exception_025.phpt b/Zend/tests/exceptions/exception_025.phpt
similarity index 100%
rename from Zend/tests/exception_025.phpt
rename to Zend/tests/exceptions/exception_025.phpt
diff --git a/Zend/tests/exception_026.phpt b/Zend/tests/exceptions/exception_026.phpt
similarity index 100%
rename from Zend/tests/exception_026.phpt
rename to Zend/tests/exceptions/exception_026.phpt
diff --git a/Zend/tests/exception_before_fatal.phpt b/Zend/tests/exceptions/exception_before_fatal.phpt
similarity index 100%
rename from Zend/tests/exception_before_fatal.phpt
rename to Zend/tests/exceptions/exception_before_fatal.phpt
diff --git a/Zend/tests/exception_delayed_message.phpt b/Zend/tests/exceptions/exception_delayed_message.phpt
similarity index 100%
rename from Zend/tests/exception_delayed_message.phpt
rename to Zend/tests/exceptions/exception_delayed_message.phpt
diff --git a/Zend/tests/exception_during_by_reference_magic_get.phpt b/Zend/tests/exceptions/exception_during_by_reference_magic_get.phpt
similarity index 100%
rename from Zend/tests/exception_during_by_reference_magic_get.phpt
rename to Zend/tests/exceptions/exception_during_by_reference_magic_get.phpt
diff --git a/Zend/tests/exception_during_include_stat.phpt b/Zend/tests/exceptions/exception_during_include_stat.phpt
similarity index 100%
rename from Zend/tests/exception_during_include_stat.phpt
rename to Zend/tests/exceptions/exception_during_include_stat.phpt
diff --git a/Zend/tests/exception_during_property_assign_op.phpt b/Zend/tests/exceptions/exception_during_property_assign_op.phpt
similarity index 100%
rename from Zend/tests/exception_during_property_assign_op.phpt
rename to Zend/tests/exceptions/exception_during_property_assign_op.phpt
diff --git a/Zend/tests/exception_during_variance_autoload.phpt b/Zend/tests/exceptions/exception_during_variance_autoload.phpt
similarity index 100%
rename from Zend/tests/exception_during_variance_autoload.phpt
rename to Zend/tests/exceptions/exception_during_variance_autoload.phpt
diff --git a/Zend/tests/exception_during_variance_autoload_2.phpt b/Zend/tests/exceptions/exception_during_variance_autoload_2.phpt
similarity index 100%
rename from Zend/tests/exception_during_variance_autoload_2.phpt
rename to Zend/tests/exceptions/exception_during_variance_autoload_2.phpt
diff --git a/Zend/tests/exception_from_toString.phpt b/Zend/tests/exceptions/exception_from_toString.phpt
similarity index 100%
rename from Zend/tests/exception_from_toString.phpt
rename to Zend/tests/exceptions/exception_from_toString.phpt
diff --git a/Zend/tests/exception_getters_with_ref_props.phpt b/Zend/tests/exceptions/exception_getters_with_ref_props.phpt
similarity index 100%
rename from Zend/tests/exception_getters_with_ref_props.phpt
rename to Zend/tests/exceptions/exception_getters_with_ref_props.phpt
diff --git a/Zend/tests/fe_fetch_dtor_exception.phpt b/Zend/tests/fe_fetch_dtor_exception.phpt
index 840544b8ec1e9..99378e739a8b3 100644
--- a/Zend/tests/fe_fetch_dtor_exception.phpt
+++ b/Zend/tests/fe_fetch_dtor_exception.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Dtor may throw exception furing FE_FETCH assignment
+Dtor may throw exception during FE_FETCH assignment
 --FILE--
 self = $this;
+    }
+    public function __destruct() {
+        printf("%s\n", __METHOD__);
+    }
+}
+
+class CreateGarbageInDtor {
+    public $self;
+    public function __construct() {
+        $this->self = $this;
+    }
+    public function __destruct() {
+        printf("%s\n", __METHOD__);
+        // Create an object whose dtor will be called after the dtor fiber's
+        new CollectCyclesInFiberInDtor();
+    }
+}
+
+class CollectCyclesInFiberInDtor {
+    public $self;
+    public function __construct() {
+        $this->self = $this;
+    }
+    public function __destruct() {
+        printf("%s\n", __METHOD__);
+        new SimpleCycle();
+        print "Collecting cycles\n";
+        $f = new Fiber(function () {
+            gc_collect_cycles();
+        });
+        $f->start();
+        print "Done collecting cycles\n";
+    }
+}
+
+register_shutdown_function(function () {
+    print "Shutdown\n";
+});
+
+// Create a cycle
+new SimpleCycle();
+
+// Collect cycles to create the dtor fiber
+$f = new Fiber(function () {
+    gc_collect_cycles();
+});
+$f->start();
+
+// Create an object whose dtor will be called during shutdown
+// (by zend_objects_store_call_destructors)
+new CreateGarbageInDtor();
+
+?>
+--EXPECT--
+SimpleCycle::__destruct
+Shutdown
+CreateGarbageInDtor::__destruct
+CollectCyclesInFiberInDtor::__destruct
+Collecting cycles
+SimpleCycle::__destruct
+Done collecting cycles
diff --git a/Zend/tests/first_class_callable_001.phpt b/Zend/tests/first_class_callable/first_class_callable_001.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_001.phpt
rename to Zend/tests/first_class_callable/first_class_callable_001.phpt
diff --git a/Zend/tests/first_class_callable_002.phpt b/Zend/tests/first_class_callable/first_class_callable_002.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_002.phpt
rename to Zend/tests/first_class_callable/first_class_callable_002.phpt
diff --git a/Zend/tests/first_class_callable_003.phpt b/Zend/tests/first_class_callable/first_class_callable_003.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_003.phpt
rename to Zend/tests/first_class_callable/first_class_callable_003.phpt
diff --git a/Zend/tests/first_class_callable_004.phpt b/Zend/tests/first_class_callable/first_class_callable_004.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_004.phpt
rename to Zend/tests/first_class_callable/first_class_callable_004.phpt
diff --git a/Zend/tests/first_class_callable_005.phpt b/Zend/tests/first_class_callable/first_class_callable_005.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_005.phpt
rename to Zend/tests/first_class_callable/first_class_callable_005.phpt
diff --git a/Zend/tests/first_class_callable_006.phpt b/Zend/tests/first_class_callable/first_class_callable_006.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_006.phpt
rename to Zend/tests/first_class_callable/first_class_callable_006.phpt
diff --git a/Zend/tests/first_class_callable_007.phpt b/Zend/tests/first_class_callable/first_class_callable_007.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_007.phpt
rename to Zend/tests/first_class_callable/first_class_callable_007.phpt
diff --git a/Zend/tests/first_class_callable_008.phpt b/Zend/tests/first_class_callable/first_class_callable_008.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_008.phpt
rename to Zend/tests/first_class_callable/first_class_callable_008.phpt
diff --git a/Zend/tests/first_class_callable_009.phpt b/Zend/tests/first_class_callable/first_class_callable_009.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_009.phpt
rename to Zend/tests/first_class_callable/first_class_callable_009.phpt
diff --git a/Zend/tests/first_class_callable_010.phpt b/Zend/tests/first_class_callable/first_class_callable_010.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_010.phpt
rename to Zend/tests/first_class_callable/first_class_callable_010.phpt
diff --git a/Zend/tests/first_class_callable_011.phpt b/Zend/tests/first_class_callable/first_class_callable_011.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_011.phpt
rename to Zend/tests/first_class_callable/first_class_callable_011.phpt
diff --git a/Zend/tests/first_class_callable_012.phpt b/Zend/tests/first_class_callable/first_class_callable_012.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_012.phpt
rename to Zend/tests/first_class_callable/first_class_callable_012.phpt
diff --git a/Zend/tests/first_class_callable_013.phpt b/Zend/tests/first_class_callable/first_class_callable_013.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_013.phpt
rename to Zend/tests/first_class_callable/first_class_callable_013.phpt
diff --git a/Zend/tests/first_class_callable_014.phpt b/Zend/tests/first_class_callable/first_class_callable_014.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_014.phpt
rename to Zend/tests/first_class_callable/first_class_callable_014.phpt
diff --git a/Zend/tests/first_class_callable_015.phpt b/Zend/tests/first_class_callable/first_class_callable_015.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_015.phpt
rename to Zend/tests/first_class_callable/first_class_callable_015.phpt
diff --git a/Zend/tests/first_class_callable_015_strict.inc b/Zend/tests/first_class_callable/first_class_callable_015_strict.inc
similarity index 100%
rename from Zend/tests/first_class_callable_015_strict.inc
rename to Zend/tests/first_class_callable/first_class_callable_015_strict.inc
diff --git a/Zend/tests/first_class_callable_015_weak.inc b/Zend/tests/first_class_callable/first_class_callable_015_weak.inc
similarity index 100%
rename from Zend/tests/first_class_callable_015_weak.inc
rename to Zend/tests/first_class_callable/first_class_callable_015_weak.inc
diff --git a/Zend/tests/first_class_callable_016.phpt b/Zend/tests/first_class_callable/first_class_callable_016.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_016.phpt
rename to Zend/tests/first_class_callable/first_class_callable_016.phpt
diff --git a/Zend/tests/first_class_callable_assert.phpt b/Zend/tests/first_class_callable/first_class_callable_assert.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_assert.phpt
rename to Zend/tests/first_class_callable/first_class_callable_assert.phpt
diff --git a/Zend/tests/first_class_callable_assert2.phpt b/Zend/tests/first_class_callable/first_class_callable_assert2.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_assert2.phpt
rename to Zend/tests/first_class_callable/first_class_callable_assert2.phpt
diff --git a/Zend/tests/first_class_callable_assert3.phpt b/Zend/tests/first_class_callable/first_class_callable_assert3.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_assert3.phpt
rename to Zend/tests/first_class_callable/first_class_callable_assert3.phpt
diff --git a/Zend/tests/first_class_callable_dynamic.phpt b/Zend/tests/first_class_callable/first_class_callable_dynamic.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_dynamic.phpt
rename to Zend/tests/first_class_callable/first_class_callable_dynamic.phpt
diff --git a/Zend/tests/first_class_callable_errors.phpt b/Zend/tests/first_class_callable/first_class_callable_errors.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_errors.phpt
rename to Zend/tests/first_class_callable/first_class_callable_errors.phpt
diff --git a/Zend/tests/first_class_callable_optimization.phpt b/Zend/tests/first_class_callable/first_class_callable_optimization.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_optimization.phpt
rename to Zend/tests/first_class_callable/first_class_callable_optimization.phpt
diff --git a/Zend/tests/first_class_callable_refs.phpt b/Zend/tests/first_class_callable/first_class_callable_refs.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_refs.phpt
rename to Zend/tests/first_class_callable/first_class_callable_refs.phpt
diff --git a/Zend/tests/first_class_callable_signature.phpt b/Zend/tests/first_class_callable/first_class_callable_signature.phpt
similarity index 100%
rename from Zend/tests/first_class_callable_signature.phpt
rename to Zend/tests/first_class_callable/first_class_callable_signature.phpt
diff --git a/Zend/tests/float_to_int/no_warnings_compatible_float_literals_assignment_ops.phpt b/Zend/tests/float_to_int/no_warnings_compatible_float_literals_assignment_ops.phpt
index 82f8c381f15d2..333f84af527b7 100644
--- a/Zend/tests/float_to_int/no_warnings_compatible_float_literals_assignment_ops.phpt
+++ b/Zend/tests/float_to_int/no_warnings_compatible_float_literals_assignment_ops.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Implicit float to int conversions should not warn for literals in combined assingment operetor if float has a fractional part equal to 0
+Implicit float to int conversions should not warn for literals in combined assignment operator if float has a fractional part equal to 0
 --FILE--
 
+--EXPECTF--
+#0 %s(%d): Foo->__destruct()
+#1 %s(%d): bar()
diff --git a/Zend/tests/gh15712.phpt b/Zend/tests/gh15712.phpt
new file mode 100644
index 0000000000000..7c4bd0b22ac11
--- /dev/null
+++ b/Zend/tests/gh15712.phpt
@@ -0,0 +1,9 @@
+--TEST--
+GH-15712: overflow on real number printing
+--FILE--
+
+--EXPECTF--
+%s
diff --git a/Zend/tests/gh15866.phpt b/Zend/tests/gh15866.phpt
new file mode 100644
index 0000000000000..99a3a6e6a9524
--- /dev/null
+++ b/Zend/tests/gh15866.phpt
@@ -0,0 +1,53 @@
+--TEST--
+GH-15866: Core dumped in Zend/zend_generators.c
+--FILE--
+next();
+    } finally {
+        print "Fiber finally\n";
+    }
+});
+$canary->value = $fiber;
+$fiber->start();
+
+// Reset roots
+gc_collect_cycles();
+
+// Add to roots, create garbage cycles
+$fiber = $iterable = $canary = null;
+
+print "Collect cycles\n";
+gc_collect_cycles();
+
+?>
+==DONE==
+--EXPECT--
+Collect cycles
+Canary::__destruct
+Generator finally
+Fiber finally
+==DONE==
diff --git a/Zend/tests/gh15907.phpt b/Zend/tests/gh15907.phpt
new file mode 100644
index 0000000000000..8d6dada36ad08
--- /dev/null
+++ b/Zend/tests/gh15907.phpt
@@ -0,0 +1,18 @@
+--TEST--
+GH-15907: Failed assertion when promoting inheritance error to exception
+--FILE--
+
+--EXPECTF--
+Fatal error: During inheritance of C, while implementing Serializable: Uncaught Exception: C implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary) in %s:%d
+%a
diff --git a/Zend/tests/gh15976/alias-names.phpt b/Zend/tests/gh15976/alias-names.phpt
new file mode 100644
index 0000000000000..7656c1b71c57f
--- /dev/null
+++ b/Zend/tests/gh15976/alias-names.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-15976: Bad class alias names
+--FILE--
+
+--EXPECTF--
+Deprecated: Using "_" as a class alias is deprecated since 8.4 in %salias-names.php on line 3
+
+Fatal error: Cannot use "bool" as a class alias as it is reserved in %salias-names.php on line 4
diff --git a/Zend/tests/gh15976/class-names.phpt b/Zend/tests/gh15976/class-names.phpt
new file mode 100644
index 0000000000000..a84071e21b2f0
--- /dev/null
+++ b/Zend/tests/gh15976/class-names.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-15976: Bad class names
+--FILE--
+
+--EXPECTF--
+Deprecated: Using "_" as a class name is deprecated since 8.4 in %sclass-names.php on line 3
+
+Fatal error: Cannot use "bool" as a class name as it is reserved in %sclass-names.php on line 4
diff --git a/Zend/tests/gh15976/enum-names.phpt b/Zend/tests/gh15976/enum-names.phpt
new file mode 100644
index 0000000000000..4bcb8a876608d
--- /dev/null
+++ b/Zend/tests/gh15976/enum-names.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-15976: Bad enum names
+--FILE--
+
+--EXPECTF--
+Deprecated: Using "_" as an enum name is deprecated since 8.4 in %senum-names.php on line 3
+
+Fatal error: Cannot use "bool" as an enum name as it is reserved in %senum-names.php on line 4
diff --git a/Zend/tests/gh15976/interface-names.phpt b/Zend/tests/gh15976/interface-names.phpt
new file mode 100644
index 0000000000000..1595ff1964b9d
--- /dev/null
+++ b/Zend/tests/gh15976/interface-names.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-15976: Bad interface names
+--FILE--
+
+--EXPECTF--
+Deprecated: Using "_" as an interface name is deprecated since 8.4 in %sinterface-names.php on line 3
+
+Fatal error: Cannot use "bool" as an interface name as it is reserved in %sinterface-names.php on line 4
diff --git a/Zend/tests/gh15976/trait-names.phpt b/Zend/tests/gh15976/trait-names.phpt
new file mode 100644
index 0000000000000..59bc8abfdd855
--- /dev/null
+++ b/Zend/tests/gh15976/trait-names.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-15976: Bad trait names
+--FILE--
+
+--EXPECTF--
+Deprecated: Using "_" as a trait name is deprecated since 8.4 in %strait-names.php on line 3
+
+Fatal error: Cannot use "bool" as a trait name as it is reserved in %strait-names.php on line 4
diff --git a/Zend/tests/gh16188.phpt b/Zend/tests/gh16188.phpt
new file mode 100644
index 0000000000000..4516f7cade90b
--- /dev/null
+++ b/Zend/tests/gh16188.phpt
@@ -0,0 +1,34 @@
+--TEST--
+GH-16188 (Assertion failure in Zend/zend_exceptions.c)
+--FILE--
+getTraceAsString());
+printf("getPrevious:\n%s\n\n", get_class($re->getPrevious()));
+printf("__toString:\n%s\n\n", $re);
+
+?>
+==DONE==
+--EXPECTF--
+getTraceAsString:
+#0 {main}
+
+getPrevious:
+Exception
+
+__toString:
+Exception in %s:%d
+Stack trace:%A
+#%d {main}
+
+Next TypeError in %s:%d
+Stack trace:%A
+#%d {main}
+
+==DONE==
diff --git a/Zend/tests/gh16293_001.phpt b/Zend/tests/gh16293_001.phpt
new file mode 100644
index 0000000000000..4a5314cafbe7f
--- /dev/null
+++ b/Zend/tests/gh16293_001.phpt
@@ -0,0 +1,19 @@
+--TEST--
+GH-16293: Exception in assert() callback with bail enabled
+--FILE--
+
+--EXPECTF--
+Warning: assert(): assert(false) failed in %s on line %d
+
+Warning: Uncaught Error: Invalid callback f1, function "f1" not found or invalid function name in %s:%d
+Stack trace:
+#0 %s(%d): assert(false, 'assert(false)')
+#1 {main}
+  thrown in %s on line %d
diff --git a/Zend/tests/gh16293_002.phpt b/Zend/tests/gh16293_002.phpt
new file mode 100644
index 0000000000000..2d8af704d9ea1
--- /dev/null
+++ b/Zend/tests/gh16293_002.phpt
@@ -0,0 +1,19 @@
+--TEST--
+GH-16293: Exception in assert() callback with bail enabled
+--FILE--
+
+--EXPECTF--
+Warning: assert(): assert(false) failed in %s on line %d
+
+Warning: Uncaught Exception: Boo in %s:%d
+Stack trace:
+%a
diff --git a/Zend/tests/gh16371.phpt b/Zend/tests/gh16371.phpt
new file mode 100644
index 0000000000000..568bb8faf12f9
--- /dev/null
+++ b/Zend/tests/gh16371.phpt
@@ -0,0 +1,47 @@
+--TEST--
+GH-16371: Assertion failure in zend_weakmap_iterator_get_current_key() for invalid iterator
+--FILE--
+getIterator();
+
+print "# Empty WeakMap\n";
+
+var_dump($it->key());
+var_dump($it->current());
+var_dump($it->valid());
+
+$map = new WeakMap();
+$obj = new stdClass;
+$map[$obj] = 0;
+
+print "# Valid iterator\n";
+
+$it = $map->getIterator();
+var_dump($it->key());
+var_dump($it->current());
+var_dump($it->valid());
+
+print "# End of iterator\n";
+
+$it->next();
+var_dump($it->key());
+var_dump($it->current());
+var_dump($it->valid());
+
+?>
+--EXPECTF--
+# Empty WeakMap
+NULL
+NULL
+bool(false)
+# Valid iterator
+object(stdClass)#%d (0) {
+}
+int(0)
+bool(true)
+# End of iterator
+NULL
+NULL
+bool(false)
diff --git a/Zend/tests/gh16408.phpt b/Zend/tests/gh16408.phpt
new file mode 100644
index 0000000000000..f28c6435bfe73
--- /dev/null
+++ b/Zend/tests/gh16408.phpt
@@ -0,0 +1,16 @@
+--TEST--
+GH-16408: Array to string conversion warning emitted in optimizer
+--FILE--
+
+--EXPECT--
+3
diff --git a/Zend/tests/gh7792_1.phpt b/Zend/tests/gh7792_1.phpt
index a342f169d937c..e8c90e20d65ce 100644
--- a/Zend/tests/gh7792_1.phpt
+++ b/Zend/tests/gh7792_1.phpt
@@ -11,4 +11,4 @@ enum B implements A {}
 
 ?>
 --EXPECTF--
-Fatal error: Enum B must implement 1 abstract private method (A::a) in %s on line %d
+Fatal error: Enum B must implement 1 abstract method (A::a) in %s on line %d
diff --git a/Zend/tests/ns_trailing_comma_01.phpt b/Zend/tests/group_use/ns_trailing_comma_01.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_01.phpt
rename to Zend/tests/group_use/ns_trailing_comma_01.phpt
diff --git a/Zend/tests/ns_trailing_comma_02.phpt b/Zend/tests/group_use/ns_trailing_comma_02.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_02.phpt
rename to Zend/tests/group_use/ns_trailing_comma_02.phpt
diff --git a/Zend/tests/ns_trailing_comma_error_01.phpt b/Zend/tests/group_use/ns_trailing_comma_error_01.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_error_01.phpt
rename to Zend/tests/group_use/ns_trailing_comma_error_01.phpt
diff --git a/Zend/tests/ns_trailing_comma_error_02.phpt b/Zend/tests/group_use/ns_trailing_comma_error_02.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_error_02.phpt
rename to Zend/tests/group_use/ns_trailing_comma_error_02.phpt
diff --git a/Zend/tests/ns_trailing_comma_error_03.phpt b/Zend/tests/group_use/ns_trailing_comma_error_03.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_error_03.phpt
rename to Zend/tests/group_use/ns_trailing_comma_error_03.phpt
diff --git a/Zend/tests/ns_trailing_comma_error_04.phpt b/Zend/tests/group_use/ns_trailing_comma_error_04.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_error_04.phpt
rename to Zend/tests/group_use/ns_trailing_comma_error_04.phpt
diff --git a/Zend/tests/ns_trailing_comma_error_05.phpt b/Zend/tests/group_use/ns_trailing_comma_error_05.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_error_05.phpt
rename to Zend/tests/group_use/ns_trailing_comma_error_05.phpt
diff --git a/Zend/tests/ns_trailing_comma_error_06.phpt b/Zend/tests/group_use/ns_trailing_comma_error_06.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_error_06.phpt
rename to Zend/tests/group_use/ns_trailing_comma_error_06.phpt
diff --git a/Zend/tests/ns_trailing_comma_error_07.phpt b/Zend/tests/group_use/ns_trailing_comma_error_07.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_error_07.phpt
rename to Zend/tests/group_use/ns_trailing_comma_error_07.phpt
diff --git a/Zend/tests/ns_trailing_comma_error_08.phpt b/Zend/tests/group_use/ns_trailing_comma_error_08.phpt
similarity index 100%
rename from Zend/tests/ns_trailing_comma_error_08.phpt
rename to Zend/tests/group_use/ns_trailing_comma_error_08.phpt
diff --git a/Zend/tests/flexible-heredoc-complex-test1.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-complex-test1.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-complex-test1.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-complex-test1.phpt
diff --git a/Zend/tests/flexible-heredoc-complex-test2.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-complex-test2.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-complex-test2.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-complex-test2.phpt
diff --git a/Zend/tests/flexible-heredoc-complex-test3.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-complex-test3.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-complex-test3.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-complex-test3.phpt
diff --git a/Zend/tests/flexible-heredoc-complex-test4.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-complex-test4.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-complex-test4.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-complex-test4.phpt
diff --git a/Zend/tests/flexible-heredoc-error1.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error1.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error1.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error1.phpt
diff --git a/Zend/tests/flexible-heredoc-error10.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error10.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error10.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error10.phpt
diff --git a/Zend/tests/flexible-heredoc-error11.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error11.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error11.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error11.phpt
diff --git a/Zend/tests/flexible-heredoc-error12.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error12.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error12.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error12.phpt
diff --git a/Zend/tests/flexible-heredoc-error13.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error13.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error13.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error13.phpt
diff --git a/Zend/tests/flexible-heredoc-error2.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error2.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error2.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error2.phpt
diff --git a/Zend/tests/flexible-heredoc-error3.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error3.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error3.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error3.phpt
diff --git a/Zend/tests/flexible-heredoc-error4.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error4.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error4.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error4.phpt
diff --git a/Zend/tests/flexible-heredoc-error5.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error5.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error5.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error5.phpt
diff --git a/Zend/tests/flexible-heredoc-error6.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error6.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error6.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error6.phpt
diff --git a/Zend/tests/flexible-heredoc-error7.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error7.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error7.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error7.phpt
diff --git a/Zend/tests/flexible-heredoc-error8.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error8.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error8.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error8.phpt
diff --git a/Zend/tests/flexible-heredoc-error9.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-error9.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-error9.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-error9.phpt
diff --git a/Zend/tests/flexible-heredoc-nowdoc-lineno.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-nowdoc-lineno.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-nowdoc-lineno.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-nowdoc-lineno.phpt
diff --git a/Zend/tests/flexible-heredoc-nowdoc.phpt b/Zend/tests/heredoc_nowdoc/flexible-heredoc-nowdoc.phpt
similarity index 100%
rename from Zend/tests/flexible-heredoc-nowdoc.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-heredoc-nowdoc.phpt
diff --git a/Zend/tests/flexible-nowdoc-error1.phpt b/Zend/tests/heredoc_nowdoc/flexible-nowdoc-error1.phpt
similarity index 100%
rename from Zend/tests/flexible-nowdoc-error1.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-nowdoc-error1.phpt
diff --git a/Zend/tests/flexible-nowdoc-error2.phpt b/Zend/tests/heredoc_nowdoc/flexible-nowdoc-error2.phpt
similarity index 100%
rename from Zend/tests/flexible-nowdoc-error2.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-nowdoc-error2.phpt
diff --git a/Zend/tests/flexible-nowdoc-error3.phpt b/Zend/tests/heredoc_nowdoc/flexible-nowdoc-error3.phpt
similarity index 100%
rename from Zend/tests/flexible-nowdoc-error3.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-nowdoc-error3.phpt
diff --git a/Zend/tests/flexible-nowdoc-error4.phpt b/Zend/tests/heredoc_nowdoc/flexible-nowdoc-error4.phpt
similarity index 100%
rename from Zend/tests/flexible-nowdoc-error4.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-nowdoc-error4.phpt
diff --git a/Zend/tests/flexible-nowdoc-error5.phpt b/Zend/tests/heredoc_nowdoc/flexible-nowdoc-error5.phpt
similarity index 100%
rename from Zend/tests/flexible-nowdoc-error5.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-nowdoc-error5.phpt
diff --git a/Zend/tests/flexible-nowdoc-error6.phpt b/Zend/tests/heredoc_nowdoc/flexible-nowdoc-error6.phpt
similarity index 100%
rename from Zend/tests/flexible-nowdoc-error6.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-nowdoc-error6.phpt
diff --git a/Zend/tests/flexible-nowdoc-error7.phpt b/Zend/tests/heredoc_nowdoc/flexible-nowdoc-error7.phpt
similarity index 100%
rename from Zend/tests/flexible-nowdoc-error7.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-nowdoc-error7.phpt
diff --git a/Zend/tests/flexible-nowdoc-error8.phpt b/Zend/tests/heredoc_nowdoc/flexible-nowdoc-error8.phpt
similarity index 100%
rename from Zend/tests/flexible-nowdoc-error8.phpt
rename to Zend/tests/heredoc_nowdoc/flexible-nowdoc-error8.phpt
diff --git a/Zend/tests/heredoc_001.phpt b/Zend/tests/heredoc_nowdoc/heredoc_001.phpt
similarity index 100%
rename from Zend/tests/heredoc_001.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_001.phpt
diff --git a/Zend/tests/heredoc_002.phpt b/Zend/tests/heredoc_nowdoc/heredoc_002.phpt
similarity index 100%
rename from Zend/tests/heredoc_002.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_002.phpt
diff --git a/Zend/tests/heredoc_003.phpt b/Zend/tests/heredoc_nowdoc/heredoc_003.phpt
similarity index 100%
rename from Zend/tests/heredoc_003.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_003.phpt
diff --git a/Zend/tests/heredoc_004.phpt b/Zend/tests/heredoc_nowdoc/heredoc_004.phpt
similarity index 100%
rename from Zend/tests/heredoc_004.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_004.phpt
diff --git a/Zend/tests/heredoc_005.phpt b/Zend/tests/heredoc_nowdoc/heredoc_005.phpt
similarity index 100%
rename from Zend/tests/heredoc_005.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_005.phpt
diff --git a/Zend/tests/heredoc_006.phpt b/Zend/tests/heredoc_nowdoc/heredoc_006.phpt
similarity index 100%
rename from Zend/tests/heredoc_006.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_006.phpt
diff --git a/Zend/tests/heredoc_007.phpt b/Zend/tests/heredoc_nowdoc/heredoc_007.phpt
similarity index 100%
rename from Zend/tests/heredoc_007.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_007.phpt
diff --git a/Zend/tests/heredoc_008.phpt b/Zend/tests/heredoc_nowdoc/heredoc_008.phpt
similarity index 100%
rename from Zend/tests/heredoc_008.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_008.phpt
diff --git a/Zend/tests/heredoc_011.phpt b/Zend/tests/heredoc_nowdoc/heredoc_011.phpt
similarity index 100%
rename from Zend/tests/heredoc_011.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_011.phpt
diff --git a/Zend/tests/heredoc_012.phpt b/Zend/tests/heredoc_nowdoc/heredoc_012.phpt
similarity index 100%
rename from Zend/tests/heredoc_012.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_012.phpt
diff --git a/Zend/tests/heredoc_013.phpt b/Zend/tests/heredoc_nowdoc/heredoc_013.phpt
similarity index 100%
rename from Zend/tests/heredoc_013.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_013.phpt
diff --git a/Zend/tests/heredoc_014.phpt b/Zend/tests/heredoc_nowdoc/heredoc_014.phpt
similarity index 100%
rename from Zend/tests/heredoc_014.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_014.phpt
diff --git a/Zend/tests/heredoc_015.phpt b/Zend/tests/heredoc_nowdoc/heredoc_015.phpt
similarity index 100%
rename from Zend/tests/heredoc_015.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_015.phpt
diff --git a/Zend/tests/heredoc_016.phpt b/Zend/tests/heredoc_nowdoc/heredoc_016.phpt
similarity index 100%
rename from Zend/tests/heredoc_016.phpt
rename to Zend/tests/heredoc_nowdoc/heredoc_016.phpt
diff --git a/Zend/tests/nowdoc.inc b/Zend/tests/heredoc_nowdoc/nowdoc.inc
similarity index 100%
rename from Zend/tests/nowdoc.inc
rename to Zend/tests/heredoc_nowdoc/nowdoc.inc
diff --git a/Zend/tests/nowdoc_001.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_001.phpt
similarity index 100%
rename from Zend/tests/nowdoc_001.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_001.phpt
diff --git a/Zend/tests/nowdoc_002.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_002.phpt
similarity index 100%
rename from Zend/tests/nowdoc_002.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_002.phpt
diff --git a/Zend/tests/nowdoc_003.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_003.phpt
similarity index 100%
rename from Zend/tests/nowdoc_003.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_003.phpt
diff --git a/Zend/tests/nowdoc_004.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_004.phpt
similarity index 100%
rename from Zend/tests/nowdoc_004.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_004.phpt
diff --git a/Zend/tests/nowdoc_005.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_005.phpt
similarity index 100%
rename from Zend/tests/nowdoc_005.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_005.phpt
diff --git a/Zend/tests/nowdoc_006.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_006.phpt
similarity index 100%
rename from Zend/tests/nowdoc_006.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_006.phpt
diff --git a/Zend/tests/nowdoc_007.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_007.phpt
similarity index 100%
rename from Zend/tests/nowdoc_007.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_007.phpt
diff --git a/Zend/tests/nowdoc_008.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_008.phpt
similarity index 100%
rename from Zend/tests/nowdoc_008.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_008.phpt
diff --git a/Zend/tests/nowdoc_011.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_011.phpt
similarity index 100%
rename from Zend/tests/nowdoc_011.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_011.phpt
diff --git a/Zend/tests/nowdoc_012.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_012.phpt
similarity index 100%
rename from Zend/tests/nowdoc_012.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_012.phpt
diff --git a/Zend/tests/nowdoc_013.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_013.phpt
similarity index 100%
rename from Zend/tests/nowdoc_013.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_013.phpt
diff --git a/Zend/tests/nowdoc_014.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_014.phpt
similarity index 100%
rename from Zend/tests/nowdoc_014.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_014.phpt
diff --git a/Zend/tests/nowdoc_015.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_015.phpt
similarity index 100%
rename from Zend/tests/nowdoc_015.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_015.phpt
diff --git a/Zend/tests/nowdoc_016.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_016.phpt
similarity index 100%
rename from Zend/tests/nowdoc_016.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_016.phpt
diff --git a/Zend/tests/nowdoc_017.phpt b/Zend/tests/heredoc_nowdoc/nowdoc_017.phpt
similarity index 100%
rename from Zend/tests/nowdoc_017.phpt
rename to Zend/tests/heredoc_nowdoc/nowdoc_017.phpt
diff --git a/Zend/tests/instanceof_002.phpt b/Zend/tests/instanceof_002.phpt
index 0d373042624b2..1457f2b1e175f 100644
--- a/Zend/tests/instanceof_002.phpt
+++ b/Zend/tests/instanceof_002.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Testing instanceof operator with class and interface inheriteds
+Testing instanceof operator with class and interface inheritance
 --FILE--
 
 --EXPECTF--
-Fatal error: Cannot use 'static' as interface name, as it is reserved in %s on line %d
+Fatal error: Cannot use "static" as interface name, as it is reserved in %s on line %d
diff --git a/Zend/tests/interface_underscore_as_name.phpt b/Zend/tests/interface_underscore_as_name.phpt
index 5746dbf95223e..148564a6cf279 100644
--- a/Zend/tests/interface_underscore_as_name.phpt
+++ b/Zend/tests/interface_underscore_as_name.phpt
@@ -13,6 +13,6 @@ namespace {
 
 ?>
 --EXPECTF--
-Deprecated: Using "_" as a class name is deprecated since 8.4 in %s on line %d
+Deprecated: Using "_" as an interface name is deprecated since 8.4 in %s on line %d
 
-Deprecated: Using "_" as a class name is deprecated since 8.4 in %s on line %d
+Deprecated: Using "_" as an interface name is deprecated since 8.4 in %s on line %d
diff --git a/Zend/tests/jump01.phpt b/Zend/tests/jump/jump01.phpt
similarity index 100%
rename from Zend/tests/jump01.phpt
rename to Zend/tests/jump/jump01.phpt
diff --git a/Zend/tests/jump02.phpt b/Zend/tests/jump/jump02.phpt
similarity index 100%
rename from Zend/tests/jump02.phpt
rename to Zend/tests/jump/jump02.phpt
diff --git a/Zend/tests/jump03.phpt b/Zend/tests/jump/jump03.phpt
similarity index 100%
rename from Zend/tests/jump03.phpt
rename to Zend/tests/jump/jump03.phpt
diff --git a/Zend/tests/jump04.phpt b/Zend/tests/jump/jump04.phpt
similarity index 100%
rename from Zend/tests/jump04.phpt
rename to Zend/tests/jump/jump04.phpt
diff --git a/Zend/tests/jump05.phpt b/Zend/tests/jump/jump05.phpt
similarity index 100%
rename from Zend/tests/jump05.phpt
rename to Zend/tests/jump/jump05.phpt
diff --git a/Zend/tests/jump06.phpt b/Zend/tests/jump/jump06.phpt
similarity index 100%
rename from Zend/tests/jump06.phpt
rename to Zend/tests/jump/jump06.phpt
diff --git a/Zend/tests/jump07.phpt b/Zend/tests/jump/jump07.phpt
similarity index 100%
rename from Zend/tests/jump07.phpt
rename to Zend/tests/jump/jump07.phpt
diff --git a/Zend/tests/jump08.phpt b/Zend/tests/jump/jump08.phpt
similarity index 100%
rename from Zend/tests/jump08.phpt
rename to Zend/tests/jump/jump08.phpt
diff --git a/Zend/tests/jump09.phpt b/Zend/tests/jump/jump09.phpt
similarity index 100%
rename from Zend/tests/jump09.phpt
rename to Zend/tests/jump/jump09.phpt
diff --git a/Zend/tests/jump10.phpt b/Zend/tests/jump/jump10.phpt
similarity index 100%
rename from Zend/tests/jump10.phpt
rename to Zend/tests/jump/jump10.phpt
diff --git a/Zend/tests/jump11.phpt b/Zend/tests/jump/jump11.phpt
similarity index 89%
rename from Zend/tests/jump11.phpt
rename to Zend/tests/jump/jump11.phpt
index 4c4c4f30a20f3..7b6b9170c72e9 100644
--- a/Zend/tests/jump11.phpt
+++ b/Zend/tests/jump/jump11.phpt
@@ -1,5 +1,5 @@
 --TEST--
-jump 08: goto inside switch in constructor
+jump 11: goto inside switch in constructor
 --FILE--
 newLazyProxy(function () {
+    return new C();
+});
+
+array_walk($obj, function (&$value, $key) {
+    try {
+        $value = 'string';
+    } catch (Error $e) {
+        printf("%s: %s\n", $e::class, $e->getMessage());
+    }
+    $value = 2;
+});
+
+var_dump($obj);
+
+?>
+--EXPECTF--
+TypeError: Cannot assign string to reference held by property C::$a of type int
+lazy proxy object(C)#%d (1) {
+  ["instance"]=>
+  object(C)#%d (1) {
+    ["a"]=>
+    int(2)
+  }
+}
diff --git a/Zend/tests/lazy_objects/clone_creates_object_with_independent_state_001.phpt b/Zend/tests/lazy_objects/clone_creates_object_with_independent_state_001.phpt
index 10aab3da023b3..f708054d1383d 100644
--- a/Zend/tests/lazy_objects/clone_creates_object_with_independent_state_001.phpt
+++ b/Zend/tests/lazy_objects/clone_creates_object_with_independent_state_001.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Lazy objects: clone is independant of the original object
+Lazy objects: clone is independent of the original object
 --FILE--
 newLazyGhost(function ($obj) use (&$calls) {
+    if ($calls++ === 0) {
+        throw new Error("initializer");
+    }
+    $obj->a = 2;
+});
+
+// Builds properties ht without lazy initialization
+var_dump($obj);
+try {
+    // Lazy initialization fails during fetching of properties ht
+    json_encode($obj);
+} catch (Error $e) {
+    printf("%s: %s\n", $e::class, $e->getMessage());
+}
+
+var_dump(json_encode($obj));
+
+?>
+--EXPECTF--
+lazy ghost object(C)#%d (0) {
+  ["a"]=>
+  uninitialized(int)
+}
+Error: initializer
+string(7) "{"a":2}"
diff --git a/Zend/tests/lazy_objects/gh15999_001.phpt b/Zend/tests/lazy_objects/gh15999_001.phpt
new file mode 100644
index 0000000000000..9fa70752d6b4c
--- /dev/null
+++ b/Zend/tests/lazy_objects/gh15999_001.phpt
@@ -0,0 +1,112 @@
+--TEST--
+Lazy Objects: GH-15999 001: Object is released during initialization
+--FILE--
+newLazyGhost(function ($obj) {
+    global $o;
+    $o = null;
+});
+$p = new stdClass;
+
+try {
+    $o->s = $p;
+} catch (Error $e) {
+    printf("%s: %s\n", $e::class, $e->getMessage());
+}
+
+print "# Proxy:\n";
+
+$o = $r->newLazyProxy(function ($obj) {
+    global $o;
+    $o = null;
+    return new C();
+});
+$p = new stdClass;
+
+try {
+    $o->s = $p;
+} catch (Error $e) {
+    printf("%s: %s\n", $e::class, $e->getMessage());
+}
+
+print "# GC cycle:\n";
+
+$o = $r->newLazyGhost(function ($obj) {
+    global $o;
+    $o->s = $o;
+    $o = null;
+    gc_collect_cycles();
+});
+$p = new stdClass;
+
+$o->s = $p;
+gc_collect_cycles();
+
+print "# Nested error (ghost):\n";
+
+$r = new ReflectionClass(C::class);
+
+$o = $r->newLazyGhost(function ($obj) {
+    global $o;
+    $o = null;
+    return new stdClass;
+});
+$p = new stdClass;
+
+try {
+    $o->s = $p;
+} catch (Error $e) {
+    do {
+        printf("%s: %s\n", $e::class, $e->getMessage());
+    } while ($e = $e->getPrevious());
+}
+
+print "# Nested error (proxy):\n";
+
+$r = new ReflectionClass(C::class);
+
+$o = $r->newLazyProxy(function ($obj) {
+    global $o;
+    $o = null;
+    return new stdClass;
+});
+$p = new stdClass;
+
+try {
+    $o->s = $p;
+} catch (Error $e) {
+    do {
+        printf("%s: %s\n", $e::class, $e->getMessage());
+    } while ($e = $e->getPrevious());
+}
+
+?>
+==DONE==
+--EXPECT--
+# Ghost:
+string(13) "C::__destruct"
+Error: Lazy object was released during initialization
+# Proxy:
+string(13) "C::__destruct"
+Error: Lazy object was released during initialization
+# GC cycle:
+string(13) "C::__destruct"
+# Nested error (ghost):
+Error: Lazy object was released during initialization
+TypeError: Lazy object initializer must return NULL or no value
+# Nested error (proxy):
+Error: Lazy object was released during initialization
+TypeError: The real instance class stdClass is not compatible with the proxy class C. The proxy must be a instance of the same class as the real instance, or a sub-class with no additional properties, and no overrides of the __destructor or __clone methods.
+==DONE==
diff --git a/Zend/tests/lazy_objects/gh15999_002.phpt b/Zend/tests/lazy_objects/gh15999_002.phpt
new file mode 100644
index 0000000000000..5227e14ba2ac4
--- /dev/null
+++ b/Zend/tests/lazy_objects/gh15999_002.phpt
@@ -0,0 +1,55 @@
+--TEST--
+Lazy Objects: GH-15999 002: Assigned value is changed during lazy object initialization
+--FILE--
+newLazyGhost(function ($obj) {
+    global $p;
+    $p = null;
+});
+
+$p = new stdClass;
+var_dump($o->s = $p);
+var_dump($o->s);
+
+print "# Proxy:\n";
+
+$r = new ReflectionClass(C::class);
+
+$o = $r->newLazyProxy(function ($obj) {
+    global $p;
+    $p = null;
+    return new C();
+});
+
+$p = new stdClass;
+var_dump($o->s = $p);
+var_dump($o->s);
+
+?>
+==DONE==
+--EXPECTF--
+# Ghost:
+object(stdClass)#%d (0) {
+}
+object(stdClass)#%d (0) {
+}
+# Proxy:
+string(13) "C::__destruct"
+object(stdClass)#%d (0) {
+}
+object(stdClass)#%d (0) {
+}
+==DONE==
+string(13) "C::__destruct"
diff --git a/Zend/tests/lazy_objects/init_trigger_foreach.phpt b/Zend/tests/lazy_objects/init_trigger_foreach.phpt
index b8bd780666bb8..fda50b84c73cd 100644
--- a/Zend/tests/lazy_objects/init_trigger_foreach.phpt
+++ b/Zend/tests/lazy_objects/init_trigger_foreach.phpt
@@ -5,9 +5,11 @@ Lazy objects: Foreach initializes object
 
 class C {
     public int $a;
+    public int $b;
     public function __construct() {
         var_dump(__METHOD__);
         $this->a = 1;
+        $this->b = 2;
     }
 }
 
@@ -24,6 +26,17 @@ foreach ($obj as $prop => $value) {
     var_dump($prop, $value);
 }
 
+print "# Ghost (by ref):\n";
+
+$obj = $reflector->newLazyGhost(function ($obj) {
+    var_dump("initializer");
+    $obj->__construct();
+});
+
+foreach ($obj as $prop => &$value) {
+    var_dump($prop, $value);
+}
+
 print "# Proxy:\n";
 
 $obj = $reflector->newLazyProxy(function ($obj) {
@@ -35,14 +48,110 @@ foreach ($obj as $prop => $value) {
     var_dump($prop, $value);
 }
 
---EXPECTF--
+print "# Proxy (by ref):\n";
+
+$obj = $reflector->newLazyProxy(function ($obj) {
+    var_dump("initializer");
+    return new C();
+});
+
+foreach ($obj as $prop => &$value) {
+    var_dump($prop, $value);
+}
+
+print "# Ghost (init failure)\n";
+
+$fail = true;
+$obj = $reflector->newLazyGhost(function ($obj) use (&$fail) {
+    if ($fail) {
+        throw new Exception("initializer");
+    } else {
+        var_dump("initializer");
+        $obj->__construct();
+    }
+});
+
+try {
+    foreach ($obj as $prop => $value) {
+        var_dump($prop, $value);
+    }
+} catch (Exception $e) {
+    printf("%s: %s\n", $e::class, $e->getMessage());
+}
+
+$fail = false;
+foreach ($obj as $prop => $value) {
+    var_dump($prop, $value);
+}
+
+print "# Ghost (init failure, by ref)\n";
+
+$fail = true;
+$obj = $reflector->newLazyGhost(function ($obj) use (&$fail) {
+    if ($fail) {
+        throw new Exception("initializer");
+    } else {
+        var_dump("initializer");
+        $obj->__construct();
+    }
+});
+
+try {
+    foreach ($obj as $prop => &$value) {
+        var_dump($prop, $value);
+    }
+} catch (Exception $e) {
+    printf("%s: %s\n", $e::class, $e->getMessage());
+}
+
+$fail = false;
+foreach ($obj as $prop => &$value) {
+    var_dump($prop, $value);
+}
+
+?>
+--EXPECT--
 # Ghost:
 string(11) "initializer"
 string(14) "C::__construct"
 string(1) "a"
 int(1)
+string(1) "b"
+int(2)
+# Ghost (by ref):
+string(11) "initializer"
+string(14) "C::__construct"
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
 # Proxy:
 string(11) "initializer"
 string(14) "C::__construct"
 string(1) "a"
 int(1)
+string(1) "b"
+int(2)
+# Proxy (by ref):
+string(11) "initializer"
+string(14) "C::__construct"
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
+# Ghost (init failure)
+Exception: initializer
+string(11) "initializer"
+string(14) "C::__construct"
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
+# Ghost (init failure, by ref)
+Exception: initializer
+string(11) "initializer"
+string(14) "C::__construct"
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
diff --git a/Zend/tests/lazy_objects/init_trigger_foreach_hooks.phpt b/Zend/tests/lazy_objects/init_trigger_foreach_hooks.phpt
index d955c92c5ab01..27ac8bf7228dd 100644
--- a/Zend/tests/lazy_objects/init_trigger_foreach_hooks.phpt
+++ b/Zend/tests/lazy_objects/init_trigger_foreach_hooks.phpt
@@ -6,49 +6,79 @@ Lazy objects: Foreach initializes object
 #[AllowDynamicProperties]
 class C {
     public int $a;
+    private int $_b;
     public int $b {
-        get { return $this->b; }
-        set(int $value) { $this->b = $value; }
+        &get { $ref = &$this->_b; return $ref; }
     }
-    public int $c {
-        get { return $this->a + 2; }
-    }
-    public function __construct() {
+    public function __construct(bool $addDynamic = true) {
         var_dump(__METHOD__);
         $this->a = 1;
-        $this->b = 2;
-        $this->d = 4;
+        $this->_b = 2;
+        if ($addDynamic) {
+            $this->c = 3;
+            $this->d = 4;
+            unset($this->c);
+        }
     }
 }
 
 $reflector = new ReflectionClass(C::class);
 
-print "# Ghost:\n";
+function test(string $name, object $obj) {
+    printf("# %s:\n", $name);
+    foreach ($obj as $prop => $value) {
+        var_dump($prop, $value);
+    }
+    foreach ($obj as $prop => &$value) {
+        var_dump($prop, $value);
+    }
+}
 
 $obj = $reflector->newLazyGhost(function ($obj) {
     var_dump("initializer");
     $obj->__construct();
 });
 
-foreach ($obj as $prop => $value) {
-    var_dump($prop, $value);
-}
+test('Ghost', $obj);
+
+$obj = $reflector->newLazyProxy(function ($obj) {
+    var_dump("initializer");
+    return new C();
+});
+
+test('Proxy', $obj);
 
-print "# Proxy:\n";
+$obj = $reflector->newLazyGhost(function ($obj) {
+    var_dump("initializer");
+    $obj->__construct(addDynamic: false);
+});
+
+test('Ghost (no dynamic)', $obj);
 
 $obj = $reflector->newLazyProxy(function ($obj) {
     var_dump("initializer");
+    return new C(addDynamic: false);
+});
+
+test('Proxy (no dynamic)', $obj);
+
+print "# Proxy of proxy (initialization)\n";
+
+$obj = $reflector->newLazyProxy(function ($obj) use (&$obj2, $reflector) {
+    var_dump("initializer");
+    return $obj2 = new C();
+});
+$reflector->initializeLazyObject($obj);
+$reflector->resetAsLazyProxy($obj2, function () {
     return new C();
 });
 
-foreach ($obj as $prop => $value) {
-    var_dump($prop, $value);
-}
+test('Proxy of proxy', $obj);
 
 print "# Ghost (init exception):\n";
 
 $obj = $reflector->newLazyGhost(function ($obj) {
-    throw new \Exception();
+    throw new \Exception("initializer");
 });
 
 try {
@@ -60,7 +90,7 @@ try {
 print "# Proxy (init exception):\n";
 
 $obj = $reflector->newLazyProxy(function ($obj) {
-    throw new \Exception();
+    throw new \Exception("initializer");
 });
 
 try {
@@ -77,8 +107,12 @@ string(1) "a"
 int(1)
 string(1) "b"
 int(2)
-string(1) "c"
-int(3)
+string(1) "d"
+int(4)
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
 string(1) "d"
 int(4)
 # Proxy:
@@ -88,9 +122,54 @@ string(1) "a"
 int(1)
 string(1) "b"
 int(2)
-string(1) "c"
-int(3)
+string(1) "d"
+int(4)
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
+string(1) "d"
+int(4)
+# Ghost (no dynamic):
+string(11) "initializer"
+string(14) "C::__construct"
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
+# Proxy (no dynamic):
+string(11) "initializer"
+string(14) "C::__construct"
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
+# Proxy of proxy (initialization)
+string(11) "initializer"
+string(14) "C::__construct"
+# Proxy of proxy:
+string(14) "C::__construct"
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
+string(1) "d"
+int(4)
+string(1) "a"
+int(1)
+string(1) "b"
+int(2)
+string(1) "d"
+int(4)
 # Ghost (init exception):
-Exception: 
+Exception: initializer
 # Proxy (init exception):
-Exception:
+Exception: initializer
diff --git a/Zend/tests/lazy_objects/oss_fuzz_71382.phpt b/Zend/tests/lazy_objects/oss_fuzz_71382.phpt
new file mode 100644
index 0000000000000..2f63b05902b06
--- /dev/null
+++ b/Zend/tests/lazy_objects/oss_fuzz_71382.phpt
@@ -0,0 +1,27 @@
+--TEST--
+oss-fuzz #71382
+--FILE--
+newLazyGhost(function() {
+    throw new \Exception('initializer');
+});
+
+try {
+    foreach($obj as $a) {
+    }
+} catch (Exception $e) {
+    printf("%s: %s\n", $e::class, $e->getMessage());
+}
+
+--EXPECT--
+Exception: initializer
diff --git a/Zend/tests/lazy_objects/oss_fuzz_71446.phpt b/Zend/tests/lazy_objects/oss_fuzz_71446.phpt
new file mode 100644
index 0000000000000..ae2db55c73fc1
--- /dev/null
+++ b/Zend/tests/lazy_objects/oss_fuzz_71446.phpt
@@ -0,0 +1,22 @@
+--TEST--
+oss-fuzz #71446
+--FILE--
+newLazyProxy(function() {
+    $c = new C;
+    return $c;
+});
+
+serialize($obj);
+?>
+--EXPECTF--
diff --git a/Zend/tests/lazy_objects/reset_as_lazy_resets_dynamic_props.phpt b/Zend/tests/lazy_objects/reset_as_lazy_resets_dynamic_props.phpt
index d99a30b3c1164..9de565a929a32 100644
--- a/Zend/tests/lazy_objects/reset_as_lazy_resets_dynamic_props.phpt
+++ b/Zend/tests/lazy_objects/reset_as_lazy_resets_dynamic_props.phpt
@@ -47,7 +47,7 @@ var_dump($obj);
 --EXPECTF--
 # Ghost:
 string(18) "Canary::__destruct"
-lazy ghost object(C)#%d (0) {
+lazy ghost object(C)#%d (%d) {
 }
 string(11) "initializer"
 object(Canary)#%d (0) {
@@ -62,7 +62,7 @@ object(C)#%d (2) {
 # Proxy:
 string(18) "Canary::__destruct"
 string(18) "Canary::__destruct"
-lazy proxy object(C)#%d (0) {
+lazy proxy object(C)#%d (%d) {
 }
 string(11) "initializer"
 object(Canary)#%d (0) {
diff --git a/Zend/tests/lazy_objects/serialize___sleep.phpt b/Zend/tests/lazy_objects/serialize___sleep.phpt
new file mode 100644
index 0000000000000..d21f0fe09c97d
--- /dev/null
+++ b/Zend/tests/lazy_objects/serialize___sleep.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Lazy Objects: serialize with __sleep fetches property info from the real instance
+--FILE--
+newLazyProxy(function() {
+    $c = new C;
+    return $c;
+});
+
+var_dump(serialize($obj));
+
+print "Init on serialize and failed initialization\n";
+
+$obj = $reflector->newLazyProxy(function() {
+    throw new \Exception('initializer');
+});
+
+try {
+    var_dump(serialize($obj));
+} catch (Exception $e) {
+    printf("%s: %s\n", $e::class, $e->getMessage());
+}
+
+?>
+--EXPECTF--
+Init on serialize and successful initialization
+string(27) "O:1:"C":1:{s:4:"%0C%0b";i:1;}"
+Init on serialize and failed initialization
+Exception: initializer
diff --git a/Zend/tests/lazy_objects/typed_properties_001.phpt b/Zend/tests/lazy_objects/typed_properties_001.phpt
new file mode 100644
index 0000000000000..1f457531d87c5
--- /dev/null
+++ b/Zend/tests/lazy_objects/typed_properties_001.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Typed property assignment by ref with variable name on proxy
+--FILE--
+newLazyProxy(function () {
+    return new Test();
+});
+$ref = "foobar";
+try {
+    $test->$name =& $ref;
+} catch (TypeError $e) {
+    echo $e->getMessage(), "\n";
+}
+var_dump($test);
+
+?>
+--EXPECTF--
+Cannot assign string to property Test::$prop of type int
+lazy proxy object(Test)#%d (1) {
+  ["instance"]=>
+  object(Test)#%d (0) {
+    ["prop"]=>
+    uninitialized(int)
+  }
+}
diff --git a/Zend/tests/lazy_objects/typed_properties_002.phpt b/Zend/tests/lazy_objects/typed_properties_002.phpt
new file mode 100644
index 0000000000000..528605246a9da
--- /dev/null
+++ b/Zend/tests/lazy_objects/typed_properties_002.phpt
@@ -0,0 +1,60 @@
+--TEST--
+Typed property assignment by ref with variable name on proxy
+--FILE--
+$b =& $obj->$a;
+    try {
+        $obj->$a = new B;
+    } catch (Error $e) {
+        printf("%s: %s\n", $e::class, $e->getMessage());
+    }
+    try {
+        $obj->$b = new A;
+    } catch (Error $e) {
+        printf("%s: %s\n", $e::class, $e->getMessage());
+    }
+    $obj->$a = new C;
+    unset($obj->$a);
+    $obj->$b = new B;
+}
+
+$reflector = new ReflectionClass(Test::class);
+$obj = $reflector->newLazyProxy(function () {
+    return new Test(new C, new C);
+});
+
+test($obj, 'a', 'b');
+
+var_dump($obj);
+
+?>
+--EXPECTF--
+TypeError: Cannot assign B to property Test::$a of type I
+TypeError: Cannot assign A to property Test::$b of type J
+lazy proxy object(Test)#%d (1) {
+  ["instance"]=>
+  object(Test)#%d (1) {
+    ["a"]=>
+    uninitialized(I)
+    ["b"]=>
+    object(B)#%d (0) {
+    }
+  }
+}
diff --git a/Zend/tests/lazy_objects/typed_properties_003.phpt b/Zend/tests/lazy_objects/typed_properties_003.phpt
new file mode 100644
index 0000000000000..af47e54bc3f83
--- /dev/null
+++ b/Zend/tests/lazy_objects/typed_properties_003.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Typed property assign op cached
+--FILE--
+$prop += 1;
+}
+function pre($obj, $prop) {
+    return ++$obj->$prop;
+}
+function post($obj, $prop) {
+    return $obj->$prop++;
+}
+
+$reflector = new ReflectionClass(Test::class);
+$obj = $reflector->newLazyProxy(function () {
+    return new Test();
+});
+
+op($obj, 'prop');
+op($obj, 'prop');
+
+pre($obj, 'prop');
+pre($obj, 'prop');
+
+post($obj, 'prop');
+post($obj, 'prop');
+
+var_dump($obj);
+
+?>
+--EXPECTF--
+lazy proxy object(Test)#%d (1) {
+  ["instance"]=>
+  object(Test)#%d (1) {
+    ["prop"]=>
+    int(6)
+  }
+}
diff --git a/Zend/tests/lazy_objects/typed_properties_004.phpt b/Zend/tests/lazy_objects/typed_properties_004.phpt
new file mode 100644
index 0000000000000..d8474a769f844
--- /dev/null
+++ b/Zend/tests/lazy_objects/typed_properties_004.phpt
@@ -0,0 +1,45 @@
+--TEST--
+Lazy Objects: Foreach by ref over typed properties
+--FILE--
+_b; return $value; }
+    }
+}
+
+$reflector = new ReflectionClass(C::class);
+$obj = $reflector->newLazyProxy(function () {
+    return new C();
+});
+
+foreach ($obj as $key => &$value) {
+    var_dump($key);
+    try {
+        $value = 'string';
+    } catch (Error $e) {
+        printf("%s: %s\n", $e::class, $e->getMessage());
+    }
+    $value = 2;
+}
+
+var_dump($obj);
+
+?>
+--EXPECTF--
+string(1) "a"
+TypeError: Cannot assign string to reference held by property C::$a of type int
+string(1) "b"
+TypeError: Cannot assign string to reference held by property C::$_b of type int
+lazy proxy object(C)#%d (1) {
+  ["instance"]=>
+  object(C)#%d (2) {
+    ["a"]=>
+    int(2)
+    ["_b":"C":private]=>
+    &int(2)
+  }
+}
diff --git a/Zend/tests/lazy_objects/unclean_shutdown.phpt b/Zend/tests/lazy_objects/unclean_shutdown.phpt
index 9ec02b5a7c4d7..62e4c395d0935 100644
--- a/Zend/tests/lazy_objects/unclean_shutdown.phpt
+++ b/Zend/tests/lazy_objects/unclean_shutdown.phpt
@@ -16,4 +16,4 @@ $obj = $reflector->newLazyGhost(function ($obj) {
 
 var_dump($obj->a);
 --EXPECTF--
-Fatal error: Cannot use 'bool' as class name%s on line %d
+Fatal error: Cannot use "bool" as a class name%s on line %d
diff --git a/Zend/tests/list_001.phpt b/Zend/tests/list/list_001.phpt
similarity index 100%
rename from Zend/tests/list_001.phpt
rename to Zend/tests/list/list_001.phpt
diff --git a/Zend/tests/list_002.phpt b/Zend/tests/list/list_002.phpt
similarity index 100%
rename from Zend/tests/list_002.phpt
rename to Zend/tests/list/list_002.phpt
diff --git a/Zend/tests/list_003.phpt b/Zend/tests/list/list_003.phpt
similarity index 100%
rename from Zend/tests/list_003.phpt
rename to Zend/tests/list/list_003.phpt
diff --git a/Zend/tests/list_004.phpt b/Zend/tests/list/list_004.phpt
similarity index 100%
rename from Zend/tests/list_004.phpt
rename to Zend/tests/list/list_004.phpt
diff --git a/Zend/tests/list_005.phpt b/Zend/tests/list/list_005.phpt
similarity index 100%
rename from Zend/tests/list_005.phpt
rename to Zend/tests/list/list_005.phpt
diff --git a/Zend/tests/list_006.phpt b/Zend/tests/list/list_006.phpt
similarity index 100%
rename from Zend/tests/list_006.phpt
rename to Zend/tests/list/list_006.phpt
diff --git a/Zend/tests/list_007.phpt b/Zend/tests/list/list_007.phpt
similarity index 100%
rename from Zend/tests/list_007.phpt
rename to Zend/tests/list/list_007.phpt
diff --git a/Zend/tests/list_008.phpt b/Zend/tests/list/list_008.phpt
similarity index 100%
rename from Zend/tests/list_008.phpt
rename to Zend/tests/list/list_008.phpt
diff --git a/Zend/tests/list_010.phpt b/Zend/tests/list/list_010.phpt
similarity index 100%
rename from Zend/tests/list_010.phpt
rename to Zend/tests/list/list_010.phpt
diff --git a/Zend/tests/list_011.phpt b/Zend/tests/list/list_011.phpt
similarity index 100%
rename from Zend/tests/list_011.phpt
rename to Zend/tests/list/list_011.phpt
diff --git a/Zend/tests/list_012.phpt b/Zend/tests/list/list_012.phpt
similarity index 100%
rename from Zend/tests/list_012.phpt
rename to Zend/tests/list/list_012.phpt
diff --git a/Zend/tests/list_013.phpt b/Zend/tests/list/list_013.phpt
similarity index 100%
rename from Zend/tests/list_013.phpt
rename to Zend/tests/list/list_013.phpt
diff --git a/Zend/tests/list_014.phpt b/Zend/tests/list/list_014.phpt
similarity index 100%
rename from Zend/tests/list_014.phpt
rename to Zend/tests/list/list_014.phpt
diff --git a/Zend/tests/list_assign_ref_string_offset_error.phpt b/Zend/tests/list/list_assign_ref_string_offset_error.phpt
similarity index 100%
rename from Zend/tests/list_assign_ref_string_offset_error.phpt
rename to Zend/tests/list/list_assign_ref_string_offset_error.phpt
diff --git a/Zend/tests/list_destructuring_to_special_variables.phpt b/Zend/tests/list/list_destructuring_to_special_variables.phpt
similarity index 100%
rename from Zend/tests/list_destructuring_to_special_variables.phpt
rename to Zend/tests/list/list_destructuring_to_special_variables.phpt
diff --git a/Zend/tests/list_empty_error.phpt b/Zend/tests/list/list_empty_error.phpt
similarity index 100%
rename from Zend/tests/list_empty_error.phpt
rename to Zend/tests/list/list_empty_error.phpt
diff --git a/Zend/tests/list_empty_error_keyed.phpt b/Zend/tests/list/list_empty_error_keyed.phpt
similarity index 100%
rename from Zend/tests/list_empty_error_keyed.phpt
rename to Zend/tests/list/list_empty_error_keyed.phpt
diff --git a/Zend/tests/list_keyed.phpt b/Zend/tests/list/list_keyed.phpt
similarity index 100%
rename from Zend/tests/list_keyed.phpt
rename to Zend/tests/list/list_keyed.phpt
diff --git a/Zend/tests/list_keyed_ArrayAccess.phpt b/Zend/tests/list/list_keyed_ArrayAccess.phpt
similarity index 100%
rename from Zend/tests/list_keyed_ArrayAccess.phpt
rename to Zend/tests/list/list_keyed_ArrayAccess.phpt
diff --git a/Zend/tests/list_keyed_conversions.phpt b/Zend/tests/list/list_keyed_conversions.phpt
similarity index 100%
rename from Zend/tests/list_keyed_conversions.phpt
rename to Zend/tests/list/list_keyed_conversions.phpt
diff --git a/Zend/tests/list_keyed_evaluation_order.inc b/Zend/tests/list/list_keyed_evaluation_order.inc
similarity index 100%
rename from Zend/tests/list_keyed_evaluation_order.inc
rename to Zend/tests/list/list_keyed_evaluation_order.inc
diff --git a/Zend/tests/list_keyed_evaluation_order.phpt b/Zend/tests/list/list_keyed_evaluation_order.phpt
similarity index 100%
rename from Zend/tests/list_keyed_evaluation_order.phpt
rename to Zend/tests/list/list_keyed_evaluation_order.phpt
diff --git a/Zend/tests/list_keyed_evaluation_order_2.phpt b/Zend/tests/list/list_keyed_evaluation_order_2.phpt
similarity index 100%
rename from Zend/tests/list_keyed_evaluation_order_2.phpt
rename to Zend/tests/list/list_keyed_evaluation_order_2.phpt
diff --git a/Zend/tests/list_keyed_evaluation_order_3.phpt b/Zend/tests/list/list_keyed_evaluation_order_3.phpt
similarity index 100%
rename from Zend/tests/list_keyed_evaluation_order_3.phpt
rename to Zend/tests/list/list_keyed_evaluation_order_3.phpt
diff --git a/Zend/tests/list_keyed_evaluation_order_nested.phpt b/Zend/tests/list/list_keyed_evaluation_order_nested.phpt
similarity index 100%
rename from Zend/tests/list_keyed_evaluation_order_nested.phpt
rename to Zend/tests/list/list_keyed_evaluation_order_nested.phpt
diff --git a/Zend/tests/list_keyed_leading_comma.phpt b/Zend/tests/list/list_keyed_leading_comma.phpt
similarity index 100%
rename from Zend/tests/list_keyed_leading_comma.phpt
rename to Zend/tests/list/list_keyed_leading_comma.phpt
diff --git a/Zend/tests/list_keyed_non_literals.phpt b/Zend/tests/list/list_keyed_non_literals.phpt
similarity index 100%
rename from Zend/tests/list_keyed_non_literals.phpt
rename to Zend/tests/list/list_keyed_non_literals.phpt
diff --git a/Zend/tests/list_keyed_trailing_comma.phpt b/Zend/tests/list/list_keyed_trailing_comma.phpt
similarity index 100%
rename from Zend/tests/list_keyed_trailing_comma.phpt
rename to Zend/tests/list/list_keyed_trailing_comma.phpt
diff --git a/Zend/tests/list_keyed_undefined.phpt b/Zend/tests/list/list_keyed_undefined.phpt
similarity index 100%
rename from Zend/tests/list_keyed_undefined.phpt
rename to Zend/tests/list/list_keyed_undefined.phpt
diff --git a/Zend/tests/list_mixed_keyed_unkeyed.phpt b/Zend/tests/list/list_mixed_keyed_unkeyed.phpt
similarity index 100%
rename from Zend/tests/list_mixed_keyed_unkeyed.phpt
rename to Zend/tests/list/list_mixed_keyed_unkeyed.phpt
diff --git a/Zend/tests/list_mixed_nested_keyed_unkeyed.phpt b/Zend/tests/list/list_mixed_nested_keyed_unkeyed.phpt
similarity index 100%
rename from Zend/tests/list_mixed_nested_keyed_unkeyed.phpt
rename to Zend/tests/list/list_mixed_nested_keyed_unkeyed.phpt
diff --git a/Zend/tests/list_self_assign.phpt b/Zend/tests/list/list_self_assign.phpt
similarity index 100%
rename from Zend/tests/list_self_assign.phpt
rename to Zend/tests/list/list_self_assign.phpt
diff --git a/Zend/tests/lsb_001.phpt b/Zend/tests/lsb/lsb_001.phpt
similarity index 100%
rename from Zend/tests/lsb_001.phpt
rename to Zend/tests/lsb/lsb_001.phpt
diff --git a/Zend/tests/lsb_002.phpt b/Zend/tests/lsb/lsb_002.phpt
similarity index 100%
rename from Zend/tests/lsb_002.phpt
rename to Zend/tests/lsb/lsb_002.phpt
diff --git a/Zend/tests/lsb_003.phpt b/Zend/tests/lsb/lsb_003.phpt
similarity index 100%
rename from Zend/tests/lsb_003.phpt
rename to Zend/tests/lsb/lsb_003.phpt
diff --git a/Zend/tests/lsb_004.phpt b/Zend/tests/lsb/lsb_004.phpt
similarity index 100%
rename from Zend/tests/lsb_004.phpt
rename to Zend/tests/lsb/lsb_004.phpt
diff --git a/Zend/tests/lsb_005.phpt b/Zend/tests/lsb/lsb_005.phpt
similarity index 93%
rename from Zend/tests/lsb_005.phpt
rename to Zend/tests/lsb/lsb_005.phpt
index e3ed92e215b90..37b6dbfa6b31d 100644
--- a/Zend/tests/lsb_005.phpt
+++ b/Zend/tests/lsb/lsb_005.phpt
@@ -1,5 +1,5 @@
 --TEST--
-ZE2 Late Static Binding stacking static calleds
+ZE2 Late Static Binding stacking static calls
 --FILE--
 
+==DONE==
+--EXPECTF--
+Fatal error: Cannot use "static" as class name, as it is reserved in %s on line %d
diff --git a/Zend/tests/lsb/lsb_007.phpt b/Zend/tests/lsb/lsb_007.phpt
new file mode 100644
index 0000000000000..c2f6265530d22
--- /dev/null
+++ b/Zend/tests/lsb/lsb_007.phpt
@@ -0,0 +1,12 @@
+--TEST--
+ZE2 Late Static Binding ensuring implementing "static" is not allowed
+--FILE--
+
+==DONE==
+--EXPECTF--
+Fatal error: Cannot use "static" as interface name, as it is reserved in %s on line %d
diff --git a/Zend/tests/lsb_008.phpt b/Zend/tests/lsb/lsb_008.phpt
similarity index 100%
rename from Zend/tests/lsb_008.phpt
rename to Zend/tests/lsb/lsb_008.phpt
diff --git a/Zend/tests/lsb_009.phpt b/Zend/tests/lsb/lsb_009.phpt
similarity index 100%
rename from Zend/tests/lsb_009.phpt
rename to Zend/tests/lsb/lsb_009.phpt
diff --git a/Zend/tests/lsb_010.phpt b/Zend/tests/lsb/lsb_010.phpt
similarity index 100%
rename from Zend/tests/lsb_010.phpt
rename to Zend/tests/lsb/lsb_010.phpt
diff --git a/Zend/tests/lsb_011.phpt b/Zend/tests/lsb/lsb_011.phpt
similarity index 100%
rename from Zend/tests/lsb_011.phpt
rename to Zend/tests/lsb/lsb_011.phpt
diff --git a/Zend/tests/lsb_012.phpt b/Zend/tests/lsb/lsb_012.phpt
similarity index 100%
rename from Zend/tests/lsb_012.phpt
rename to Zend/tests/lsb/lsb_012.phpt
diff --git a/Zend/tests/lsb_013.phpt b/Zend/tests/lsb/lsb_013.phpt
similarity index 100%
rename from Zend/tests/lsb_013.phpt
rename to Zend/tests/lsb/lsb_013.phpt
diff --git a/Zend/tests/lsb_014.phpt b/Zend/tests/lsb/lsb_014.phpt
similarity index 100%
rename from Zend/tests/lsb_014.phpt
rename to Zend/tests/lsb/lsb_014.phpt
diff --git a/Zend/tests/lsb_015.phpt b/Zend/tests/lsb/lsb_015.phpt
similarity index 100%
rename from Zend/tests/lsb_015.phpt
rename to Zend/tests/lsb/lsb_015.phpt
diff --git a/Zend/tests/lsb_016.phpt b/Zend/tests/lsb/lsb_016.phpt
similarity index 100%
rename from Zend/tests/lsb_016.phpt
rename to Zend/tests/lsb/lsb_016.phpt
diff --git a/Zend/tests/lsb_017.phpt b/Zend/tests/lsb/lsb_017.phpt
similarity index 100%
rename from Zend/tests/lsb_017.phpt
rename to Zend/tests/lsb/lsb_017.phpt
diff --git a/Zend/tests/lsb_018.phpt b/Zend/tests/lsb/lsb_018.phpt
similarity index 100%
rename from Zend/tests/lsb_018.phpt
rename to Zend/tests/lsb/lsb_018.phpt
diff --git a/Zend/tests/lsb_019.phpt b/Zend/tests/lsb/lsb_019.phpt
similarity index 100%
rename from Zend/tests/lsb_019.phpt
rename to Zend/tests/lsb/lsb_019.phpt
diff --git a/Zend/tests/lsb_020.phpt b/Zend/tests/lsb/lsb_020.phpt
similarity index 100%
rename from Zend/tests/lsb_020.phpt
rename to Zend/tests/lsb/lsb_020.phpt
diff --git a/Zend/tests/lsb_021.phpt b/Zend/tests/lsb/lsb_021.phpt
similarity index 100%
rename from Zend/tests/lsb_021.phpt
rename to Zend/tests/lsb/lsb_021.phpt
diff --git a/Zend/tests/lsb_022.phpt b/Zend/tests/lsb/lsb_022.phpt
similarity index 100%
rename from Zend/tests/lsb_022.phpt
rename to Zend/tests/lsb/lsb_022.phpt
diff --git a/Zend/tests/lsb_023.phpt b/Zend/tests/lsb/lsb_023.phpt
similarity index 100%
rename from Zend/tests/lsb_023.phpt
rename to Zend/tests/lsb/lsb_023.phpt
diff --git a/Zend/tests/lsb_024.phpt b/Zend/tests/lsb/lsb_024.phpt
similarity index 100%
rename from Zend/tests/lsb_024.phpt
rename to Zend/tests/lsb/lsb_024.phpt
diff --git a/Zend/tests/lsb_006.phpt b/Zend/tests/lsb_006.phpt
deleted file mode 100644
index 9d1600d425ae1..0000000000000
--- a/Zend/tests/lsb_006.phpt
+++ /dev/null
@@ -1,12 +0,0 @@
---TEST--
-ZE2 Late Static Binding ensuring extending 'static' is not allowed
---FILE--
-
-==DONE==
---EXPECTF--
-Fatal error: Cannot use 'static' as class name, as it is reserved in %s on line %d
diff --git a/Zend/tests/lsb_007.phpt b/Zend/tests/lsb_007.phpt
deleted file mode 100644
index 970044eab29e9..0000000000000
--- a/Zend/tests/lsb_007.phpt
+++ /dev/null
@@ -1,12 +0,0 @@
---TEST--
-ZE2 Late Static Binding ensuring implementing 'static' is not allowed
---FILE--
-
-==DONE==
---EXPECTF--
-Fatal error: Cannot use 'static' as interface name, as it is reserved in %s on line %d
diff --git a/Zend/tests/magic_by_ref_001.phpt b/Zend/tests/magic_methods/magic_by_ref_001.phpt
similarity index 100%
rename from Zend/tests/magic_by_ref_001.phpt
rename to Zend/tests/magic_methods/magic_by_ref_001.phpt
diff --git a/Zend/tests/magic_by_ref_002.phpt b/Zend/tests/magic_methods/magic_by_ref_002.phpt
similarity index 100%
rename from Zend/tests/magic_by_ref_002.phpt
rename to Zend/tests/magic_methods/magic_by_ref_002.phpt
diff --git a/Zend/tests/magic_by_ref_003.phpt b/Zend/tests/magic_methods/magic_by_ref_003.phpt
similarity index 100%
rename from Zend/tests/magic_by_ref_003.phpt
rename to Zend/tests/magic_methods/magic_by_ref_003.phpt
diff --git a/Zend/tests/magic_by_ref_004.phpt b/Zend/tests/magic_methods/magic_by_ref_004.phpt
similarity index 100%
rename from Zend/tests/magic_by_ref_004.phpt
rename to Zend/tests/magic_methods/magic_by_ref_004.phpt
diff --git a/Zend/tests/magic_by_ref_005.phpt b/Zend/tests/magic_methods/magic_by_ref_005.phpt
similarity index 100%
rename from Zend/tests/magic_by_ref_005.phpt
rename to Zend/tests/magic_methods/magic_by_ref_005.phpt
diff --git a/Zend/tests/magic_by_ref_006.phpt b/Zend/tests/magic_methods/magic_by_ref_006.phpt
similarity index 100%
rename from Zend/tests/magic_by_ref_006.phpt
rename to Zend/tests/magic_methods/magic_by_ref_006.phpt
diff --git a/Zend/tests/magic_by_ref_007.phpt b/Zend/tests/magic_methods/magic_by_ref_007.phpt
similarity index 100%
rename from Zend/tests/magic_by_ref_007.phpt
rename to Zend/tests/magic_methods/magic_by_ref_007.phpt
diff --git a/Zend/tests/magic_get_destroy_object.phpt b/Zend/tests/magic_methods/magic_get_destroy_object.phpt
similarity index 100%
rename from Zend/tests/magic_get_destroy_object.phpt
rename to Zend/tests/magic_methods/magic_get_destroy_object.phpt
diff --git a/Zend/tests/magic_methods_001.phpt b/Zend/tests/magic_methods/magic_methods_001.phpt
similarity index 100%
rename from Zend/tests/magic_methods_001.phpt
rename to Zend/tests/magic_methods/magic_methods_001.phpt
diff --git a/Zend/tests/magic_methods_002.phpt b/Zend/tests/magic_methods/magic_methods_002.phpt
similarity index 100%
rename from Zend/tests/magic_methods_002.phpt
rename to Zend/tests/magic_methods/magic_methods_002.phpt
diff --git a/Zend/tests/magic_methods_003.phpt b/Zend/tests/magic_methods/magic_methods_003.phpt
similarity index 100%
rename from Zend/tests/magic_methods_003.phpt
rename to Zend/tests/magic_methods/magic_methods_003.phpt
diff --git a/Zend/tests/magic_methods_004.phpt b/Zend/tests/magic_methods/magic_methods_004.phpt
similarity index 100%
rename from Zend/tests/magic_methods_004.phpt
rename to Zend/tests/magic_methods/magic_methods_004.phpt
diff --git a/Zend/tests/magic_methods_005.phpt b/Zend/tests/magic_methods/magic_methods_005.phpt
similarity index 100%
rename from Zend/tests/magic_methods_005.phpt
rename to Zend/tests/magic_methods/magic_methods_005.phpt
diff --git a/Zend/tests/magic_methods_006.phpt b/Zend/tests/magic_methods/magic_methods_006.phpt
similarity index 100%
rename from Zend/tests/magic_methods_006.phpt
rename to Zend/tests/magic_methods/magic_methods_006.phpt
diff --git a/Zend/tests/magic_methods_007.phpt b/Zend/tests/magic_methods/magic_methods_007.phpt
similarity index 100%
rename from Zend/tests/magic_methods_007.phpt
rename to Zend/tests/magic_methods/magic_methods_007.phpt
diff --git a/Zend/tests/magic_methods_008.phpt b/Zend/tests/magic_methods/magic_methods_008.phpt
similarity index 100%
rename from Zend/tests/magic_methods_008.phpt
rename to Zend/tests/magic_methods/magic_methods_008.phpt
diff --git a/Zend/tests/magic_methods_009.phpt b/Zend/tests/magic_methods/magic_methods_009.phpt
similarity index 100%
rename from Zend/tests/magic_methods_009.phpt
rename to Zend/tests/magic_methods/magic_methods_009.phpt
diff --git a/Zend/tests/magic_methods_010.phpt b/Zend/tests/magic_methods/magic_methods_010.phpt
similarity index 100%
rename from Zend/tests/magic_methods_010.phpt
rename to Zend/tests/magic_methods/magic_methods_010.phpt
diff --git a/Zend/tests/magic_methods_011.phpt b/Zend/tests/magic_methods/magic_methods_011.phpt
similarity index 100%
rename from Zend/tests/magic_methods_011.phpt
rename to Zend/tests/magic_methods/magic_methods_011.phpt
diff --git a/Zend/tests/magic_methods_012.phpt b/Zend/tests/magic_methods/magic_methods_012.phpt
similarity index 100%
rename from Zend/tests/magic_methods_012.phpt
rename to Zend/tests/magic_methods/magic_methods_012.phpt
diff --git a/Zend/tests/magic_methods_013.phpt b/Zend/tests/magic_methods/magic_methods_013.phpt
similarity index 100%
rename from Zend/tests/magic_methods_013.phpt
rename to Zend/tests/magic_methods/magic_methods_013.phpt
diff --git a/Zend/tests/magic_methods_014.phpt b/Zend/tests/magic_methods/magic_methods_014.phpt
similarity index 100%
rename from Zend/tests/magic_methods_014.phpt
rename to Zend/tests/magic_methods/magic_methods_014.phpt
diff --git a/Zend/tests/magic_methods_015.phpt b/Zend/tests/magic_methods/magic_methods_015.phpt
similarity index 100%
rename from Zend/tests/magic_methods_015.phpt
rename to Zend/tests/magic_methods/magic_methods_015.phpt
diff --git a/Zend/tests/magic_methods_016.phpt b/Zend/tests/magic_methods/magic_methods_016.phpt
similarity index 100%
rename from Zend/tests/magic_methods_016.phpt
rename to Zend/tests/magic_methods/magic_methods_016.phpt
diff --git a/Zend/tests/magic_methods_017.phpt b/Zend/tests/magic_methods/magic_methods_017.phpt
similarity index 100%
rename from Zend/tests/magic_methods_017.phpt
rename to Zend/tests/magic_methods/magic_methods_017.phpt
diff --git a/Zend/tests/magic_methods_018.phpt b/Zend/tests/magic_methods/magic_methods_018.phpt
similarity index 100%
rename from Zend/tests/magic_methods_018.phpt
rename to Zend/tests/magic_methods/magic_methods_018.phpt
diff --git a/Zend/tests/magic_methods_019.phpt b/Zend/tests/magic_methods/magic_methods_019.phpt
similarity index 100%
rename from Zend/tests/magic_methods_019.phpt
rename to Zend/tests/magic_methods/magic_methods_019.phpt
diff --git a/Zend/tests/magic_methods_020.phpt b/Zend/tests/magic_methods/magic_methods_020.phpt
similarity index 100%
rename from Zend/tests/magic_methods_020.phpt
rename to Zend/tests/magic_methods/magic_methods_020.phpt
diff --git a/Zend/tests/magic_methods_021.phpt b/Zend/tests/magic_methods/magic_methods_021.phpt
similarity index 100%
rename from Zend/tests/magic_methods_021.phpt
rename to Zend/tests/magic_methods/magic_methods_021.phpt
diff --git a/Zend/tests/magic_methods_inheritance_rules.phpt b/Zend/tests/magic_methods/magic_methods_inheritance_rules.phpt
similarity index 100%
rename from Zend/tests/magic_methods_inheritance_rules.phpt
rename to Zend/tests/magic_methods/magic_methods_inheritance_rules.phpt
diff --git a/Zend/tests/magic_methods_inheritance_rules_non_trivial_01.phpt b/Zend/tests/magic_methods/magic_methods_inheritance_rules_non_trivial_01.phpt
similarity index 100%
rename from Zend/tests/magic_methods_inheritance_rules_non_trivial_01.phpt
rename to Zend/tests/magic_methods/magic_methods_inheritance_rules_non_trivial_01.phpt
diff --git a/Zend/tests/magic_methods_inheritance_rules_non_trivial_02.phpt b/Zend/tests/magic_methods/magic_methods_inheritance_rules_non_trivial_02.phpt
similarity index 100%
rename from Zend/tests/magic_methods_inheritance_rules_non_trivial_02.phpt
rename to Zend/tests/magic_methods/magic_methods_inheritance_rules_non_trivial_02.phpt
diff --git a/Zend/tests/magic_methods_serialize.phpt b/Zend/tests/magic_methods/magic_methods_serialize.phpt
similarity index 100%
rename from Zend/tests/magic_methods_serialize.phpt
rename to Zend/tests/magic_methods/magic_methods_serialize.phpt
diff --git a/Zend/tests/magic_methods_set_state.phpt b/Zend/tests/magic_methods/magic_methods_set_state.phpt
similarity index 100%
rename from Zend/tests/magic_methods_set_state.phpt
rename to Zend/tests/magic_methods/magic_methods_set_state.phpt
diff --git a/Zend/tests/magic_methods_sleep.phpt b/Zend/tests/magic_methods/magic_methods_sleep.phpt
similarity index 100%
rename from Zend/tests/magic_methods_sleep.phpt
rename to Zend/tests/magic_methods/magic_methods_sleep.phpt
diff --git a/Zend/tests/magic_methods_unserialize.phpt b/Zend/tests/magic_methods/magic_methods_unserialize.phpt
similarity index 100%
rename from Zend/tests/magic_methods_unserialize.phpt
rename to Zend/tests/magic_methods/magic_methods_unserialize.phpt
diff --git a/Zend/tests/magic_methods_wakeup.phpt b/Zend/tests/magic_methods/magic_methods_wakeup.phpt
similarity index 100%
rename from Zend/tests/magic_methods_wakeup.phpt
rename to Zend/tests/magic_methods/magic_methods_wakeup.phpt
diff --git a/Zend/tests/namespace_first_stmt_nop.phpt b/Zend/tests/namespaces/namespace_first_stmt_nop.phpt
similarity index 100%
rename from Zend/tests/namespace_first_stmt_nop.phpt
rename to Zend/tests/namespaces/namespace_first_stmt_nop.phpt
diff --git a/Zend/tests/namespace_name_namespace.phpt b/Zend/tests/namespaces/namespace_name_namespace.phpt
similarity index 100%
rename from Zend/tests/namespace_name_namespace.phpt
rename to Zend/tests/namespaces/namespace_name_namespace.phpt
diff --git a/Zend/tests/namespace_name_namespace_start.phpt b/Zend/tests/namespaces/namespace_name_namespace_start.phpt
similarity index 100%
rename from Zend/tests/namespace_name_namespace_start.phpt
rename to Zend/tests/namespaces/namespace_name_namespace_start.phpt
diff --git a/Zend/tests/namespace_name_reserved_keywords.phpt b/Zend/tests/namespaces/namespace_name_reserved_keywords.phpt
similarity index 100%
rename from Zend/tests/namespace_name_reserved_keywords.phpt
rename to Zend/tests/namespaces/namespace_name_reserved_keywords.phpt
diff --git a/Zend/tests/namespaced_name_whitespace.phpt b/Zend/tests/namespaces/namespaced_name_whitespace.phpt
similarity index 100%
rename from Zend/tests/namespaced_name_whitespace.phpt
rename to Zend/tests/namespaces/namespaced_name_whitespace.phpt
diff --git a/Zend/tests/ns_001.phpt b/Zend/tests/namespaces/ns_001.phpt
similarity index 100%
rename from Zend/tests/ns_001.phpt
rename to Zend/tests/namespaces/ns_001.phpt
diff --git a/Zend/tests/ns_002.phpt b/Zend/tests/namespaces/ns_002.phpt
similarity index 100%
rename from Zend/tests/ns_002.phpt
rename to Zend/tests/namespaces/ns_002.phpt
diff --git a/Zend/tests/ns_003.phpt b/Zend/tests/namespaces/ns_003.phpt
similarity index 100%
rename from Zend/tests/ns_003.phpt
rename to Zend/tests/namespaces/ns_003.phpt
diff --git a/Zend/tests/ns_004.phpt b/Zend/tests/namespaces/ns_004.phpt
similarity index 100%
rename from Zend/tests/ns_004.phpt
rename to Zend/tests/namespaces/ns_004.phpt
diff --git a/Zend/tests/ns_005.phpt b/Zend/tests/namespaces/ns_005.phpt
similarity index 100%
rename from Zend/tests/ns_005.phpt
rename to Zend/tests/namespaces/ns_005.phpt
diff --git a/Zend/tests/ns_006.phpt b/Zend/tests/namespaces/ns_006.phpt
similarity index 100%
rename from Zend/tests/ns_006.phpt
rename to Zend/tests/namespaces/ns_006.phpt
diff --git a/Zend/tests/ns_007.phpt b/Zend/tests/namespaces/ns_007.phpt
similarity index 100%
rename from Zend/tests/ns_007.phpt
rename to Zend/tests/namespaces/ns_007.phpt
diff --git a/Zend/tests/ns_008.phpt b/Zend/tests/namespaces/ns_008.phpt
similarity index 100%
rename from Zend/tests/ns_008.phpt
rename to Zend/tests/namespaces/ns_008.phpt
diff --git a/Zend/tests/ns_009.phpt b/Zend/tests/namespaces/ns_009.phpt
similarity index 100%
rename from Zend/tests/ns_009.phpt
rename to Zend/tests/namespaces/ns_009.phpt
diff --git a/Zend/tests/ns_010.phpt b/Zend/tests/namespaces/ns_010.phpt
similarity index 100%
rename from Zend/tests/ns_010.phpt
rename to Zend/tests/namespaces/ns_010.phpt
diff --git a/Zend/tests/ns_011.phpt b/Zend/tests/namespaces/ns_011.phpt
similarity index 100%
rename from Zend/tests/ns_011.phpt
rename to Zend/tests/namespaces/ns_011.phpt
diff --git a/Zend/tests/ns_012.phpt b/Zend/tests/namespaces/ns_012.phpt
similarity index 100%
rename from Zend/tests/ns_012.phpt
rename to Zend/tests/namespaces/ns_012.phpt
diff --git a/Zend/tests/ns_013.phpt b/Zend/tests/namespaces/ns_013.phpt
similarity index 100%
rename from Zend/tests/ns_013.phpt
rename to Zend/tests/namespaces/ns_013.phpt
diff --git a/Zend/tests/ns_014.phpt b/Zend/tests/namespaces/ns_014.phpt
similarity index 100%
rename from Zend/tests/ns_014.phpt
rename to Zend/tests/namespaces/ns_014.phpt
diff --git a/Zend/tests/ns_015.phpt b/Zend/tests/namespaces/ns_015.phpt
similarity index 100%
rename from Zend/tests/ns_015.phpt
rename to Zend/tests/namespaces/ns_015.phpt
diff --git a/Zend/tests/ns_016.phpt b/Zend/tests/namespaces/ns_016.phpt
similarity index 100%
rename from Zend/tests/ns_016.phpt
rename to Zend/tests/namespaces/ns_016.phpt
diff --git a/Zend/tests/ns_017.phpt b/Zend/tests/namespaces/ns_017.phpt
similarity index 100%
rename from Zend/tests/ns_017.phpt
rename to Zend/tests/namespaces/ns_017.phpt
diff --git a/Zend/tests/ns_018.phpt b/Zend/tests/namespaces/ns_018.phpt
similarity index 100%
rename from Zend/tests/ns_018.phpt
rename to Zend/tests/namespaces/ns_018.phpt
diff --git a/Zend/tests/ns_019.phpt b/Zend/tests/namespaces/ns_019.phpt
similarity index 100%
rename from Zend/tests/ns_019.phpt
rename to Zend/tests/namespaces/ns_019.phpt
diff --git a/Zend/tests/ns_020.phpt b/Zend/tests/namespaces/ns_020.phpt
similarity index 100%
rename from Zend/tests/ns_020.phpt
rename to Zend/tests/namespaces/ns_020.phpt
diff --git a/Zend/tests/ns_021.phpt b/Zend/tests/namespaces/ns_021.phpt
similarity index 100%
rename from Zend/tests/ns_021.phpt
rename to Zend/tests/namespaces/ns_021.phpt
diff --git a/Zend/tests/ns_022.inc b/Zend/tests/namespaces/ns_022.inc
similarity index 100%
rename from Zend/tests/ns_022.inc
rename to Zend/tests/namespaces/ns_022.inc
diff --git a/Zend/tests/ns_022.phpt b/Zend/tests/namespaces/ns_022.phpt
similarity index 100%
rename from Zend/tests/ns_022.phpt
rename to Zend/tests/namespaces/ns_022.phpt
diff --git a/Zend/tests/ns_023.phpt b/Zend/tests/namespaces/ns_023.phpt
similarity index 100%
rename from Zend/tests/ns_023.phpt
rename to Zend/tests/namespaces/ns_023.phpt
diff --git a/Zend/tests/ns_024.phpt b/Zend/tests/namespaces/ns_024.phpt
similarity index 100%
rename from Zend/tests/ns_024.phpt
rename to Zend/tests/namespaces/ns_024.phpt
diff --git a/Zend/tests/ns_025.phpt b/Zend/tests/namespaces/ns_025.phpt
similarity index 100%
rename from Zend/tests/ns_025.phpt
rename to Zend/tests/namespaces/ns_025.phpt
diff --git a/Zend/tests/ns_026.phpt b/Zend/tests/namespaces/ns_026.phpt
similarity index 100%
rename from Zend/tests/ns_026.phpt
rename to Zend/tests/namespaces/ns_026.phpt
diff --git a/Zend/tests/ns_027.inc b/Zend/tests/namespaces/ns_027.inc
similarity index 100%
rename from Zend/tests/ns_027.inc
rename to Zend/tests/namespaces/ns_027.inc
diff --git a/Zend/tests/ns_027.phpt b/Zend/tests/namespaces/ns_027.phpt
similarity index 80%
rename from Zend/tests/ns_027.phpt
rename to Zend/tests/namespaces/ns_027.phpt
index 574cc4b0fa0b0..6f54df7155877 100644
--- a/Zend/tests/ns_027.phpt
+++ b/Zend/tests/namespaces/ns_027.phpt
@@ -1,5 +1,5 @@
 --TEST--
-027: Name ambiguity (class name & part of extertnal namespace name)
+027: Name ambiguity (class name & part of external namespace name)
 --FILE--
 
 --EXPECTF--
-Fatal error: Class C contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (P::$prop::set) in %s on line %d
+Fatal error: Class C contains 1 abstract method and must therefore be declared abstract or implement the remaining method (P::$prop::set) in %s on line %d
diff --git a/Zend/tests/property_hooks/abstract_hook_in_non_abstract_class.phpt b/Zend/tests/property_hooks/abstract_hook_in_non_abstract_class.phpt
index fe27f3ecebc5e..d3b8396a55f0a 100644
--- a/Zend/tests/property_hooks/abstract_hook_in_non_abstract_class.phpt
+++ b/Zend/tests/property_hooks/abstract_hook_in_non_abstract_class.phpt
@@ -12,4 +12,4 @@ class Test {
 
 ?>
 --EXPECTF--
-Fatal error: Class Test contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Test::$prop::get) in %s on line %d
+Fatal error: Class Test contains 1 abstract method and must therefore be declared abstract or implement the remaining method (Test::$prop::get) in %s on line %d
diff --git a/Zend/tests/property_hooks/abstract_hook_not_implemented.phpt b/Zend/tests/property_hooks/abstract_hook_not_implemented.phpt
index bb94c0650b01a..24fd4f1ef1ed5 100644
--- a/Zend/tests/property_hooks/abstract_hook_not_implemented.phpt
+++ b/Zend/tests/property_hooks/abstract_hook_not_implemented.phpt
@@ -14,4 +14,4 @@ class B extends A {}
 
 ?>
 --EXPECTF--
-Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::$prop::get) in %s on line %d
+Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining method (A::$prop::get) in %s on line %d
diff --git a/Zend/tests/property_hooks/dump.phpt b/Zend/tests/property_hooks/dump.phpt
index f05805e8861c9..d7cd57183d63f 100644
--- a/Zend/tests/property_hooks/dump.phpt
+++ b/Zend/tests/property_hooks/dump.phpt
@@ -59,13 +59,21 @@ function dump($test) {
     var_dump((array) $test);
 }
 
+echo "dump(Test):\n";
 dump(new Test);
+
+echo "\n\ndump(Child):\n";
 dump(new Child);
+
+echo "\n\nChild::dumpTest():\n";
 (new Child)->dumpTest();
+
+echo "\n\nChild::dumpChild():\n";
 (new Child)->dumpChild();
 
 ?>
 --EXPECTF--
+dump(Test):
 object(Test)#%d (4) {
   ["addedHooks"]=>
   string(10) "addedHooks"
@@ -102,6 +110,9 @@ array(4) {
   ["%0Test%0changed"]=>
   string(12) "changed Test"
 }
+
+
+dump(Child):
 object(Child)#%d (5) {
   ["addedHooks"]=>
   string(10) "addedHooks"
@@ -124,11 +135,11 @@ array(3) {
 }
 \Child::__set_state(array(
    'addedHooks' => 'ADDEDHOOKS',
-   'changed' => 'CHANGED CHILD',
    'virtual' => 'VIRTUAL',
    'backed' => 'BACKED',
    'private' => 'PRIVATE',
-   'changed' => 'changed Child',
+   'changed' => 'CHANGED TEST',
+   'changed' => 'CHANGED CHILD',
 ))
 {"addedHooks":"ADDEDHOOKS","virtual":"VIRTUAL","backed":"BACKED"}
 array(5) {
@@ -143,6 +154,9 @@ array(5) {
   ["%0Child%0changed"]=>
   string(13) "changed Child"
 }
+
+
+Child::dumpTest():
 object(Child)#%d (5) {
   ["addedHooks"]=>
   string(10) "addedHooks"
@@ -155,7 +169,7 @@ object(Child)#%d (5) {
   ["changed":"Child":private]=>
   string(13) "changed Child"
 }
-array(4) {
+array(5) {
   ["addedHooks"]=>
   string(10) "ADDEDHOOKS"
   ["virtual"]=>
@@ -164,6 +178,8 @@ array(4) {
   string(6) "BACKED"
   ["private"]=>
   string(7) "PRIVATE"
+  ["changed"]=>
+  string(12) "CHANGED TEST"
 }
 array(5) {
   ["addedHooks"]=>
@@ -179,11 +195,11 @@ array(5) {
 }
 \Child::__set_state(array(
    'addedHooks' => 'ADDEDHOOKS',
-   'changed' => 'CHANGED CHILD',
    'virtual' => 'VIRTUAL',
    'backed' => 'BACKED',
    'private' => 'PRIVATE',
-   'changed' => 'changed Child',
+   'changed' => 'CHANGED TEST',
+   'changed' => 'CHANGED CHILD',
 ))
 {"addedHooks":"ADDEDHOOKS","virtual":"VIRTUAL","backed":"BACKED"}
 array(5) {
@@ -198,6 +214,9 @@ array(5) {
   ["%0Child%0changed"]=>
   string(13) "changed Child"
 }
+
+
+Child::dumpChild():
 object(Child)#%d (5) {
   ["addedHooks"]=>
   string(10) "addedHooks"
@@ -210,25 +229,23 @@ object(Child)#%d (5) {
   ["changed":"Child":private]=>
   string(13) "changed Child"
 }
-array(5) {
+array(4) {
   ["addedHooks"]=>
   string(10) "ADDEDHOOKS"
-  ["changed"]=>
-  string(13) "CHANGED CHILD"
   ["virtual"]=>
   string(7) "VIRTUAL"
   ["backed"]=>
   string(6) "BACKED"
   ["changed"]=>
-  string(13) "changed Child"
+  string(13) "CHANGED CHILD"
 }
 \Child::__set_state(array(
    'addedHooks' => 'ADDEDHOOKS',
-   'changed' => 'CHANGED CHILD',
    'virtual' => 'VIRTUAL',
    'backed' => 'BACKED',
    'private' => 'PRIVATE',
-   'changed' => 'changed Child',
+   'changed' => 'CHANGED TEST',
+   'changed' => 'CHANGED CHILD',
 ))
 {"addedHooks":"ADDEDHOOKS","virtual":"VIRTUAL","backed":"BACKED"}
 array(5) {
diff --git a/Zend/tests/property_hooks/foreach.phpt b/Zend/tests/property_hooks/foreach.phpt
index c6073b50ed990..e40f2c1d4d57e 100644
--- a/Zend/tests/property_hooks/foreach.phpt
+++ b/Zend/tests/property_hooks/foreach.phpt
@@ -23,7 +23,9 @@ class ByRef {
         }
     }
     public function __construct() {
+        $this->undef = 'dynamic';
         $this->dynamic = 'dynamic';
+        unset($this->undef);
     }
 }
 
@@ -84,8 +86,35 @@ testByVal(new ByVal);
 testByVal(new ByRef);
 testByRef(new ByRef);
 
+class A {
+    private $changed { get => 'A'; }
+    protected $promoted { get => 'A'; }
+    protected $protected { get => 'A'; }
+    private $shadowed = 'A';
+
+    public function test() {
+        foreach ($this as $k => $v) {
+            var_dump($k, $v);
+        }
+    }
+}
+
+#[AllowDynamicProperties]
+class B extends A {
+    public $changed { get => 'B'; }
+    public $promoted { get => 'B'; }
+}
+
+$b = new B;
+$b->shadowed = 'Global';
+$b->test();
+
 ?>
 --EXPECTF--
+plain => plain
+ByRef::$virtualByRef::get
+virtualByRef => virtualByRef
+ByRef::$virtualByRef::set
 ByVal::$virtualByVal::get
 virtualByVal => virtualByVal
 ByVal::$virtualByVal::set
@@ -95,10 +124,6 @@ ByVal::$backed::set
 ByVal::$backedUninitialized::get
 backedUninitialized => backedUninitialized
 ByVal::$backedUninitialized::set
-plain => plain
-ByRef::$virtualByRef::get
-virtualByRef => virtualByRef
-ByRef::$virtualByRef::set
 dynamic => dynamic
 object(ByVal)#%d (6) {
   ["plain"]=>
@@ -139,3 +164,11 @@ object(ByRef)#%d (3) {
   ["dynamic"]=>
   string(7) "DYNAMIC"
 }
+string(7) "changed"
+string(1) "A"
+string(8) "promoted"
+string(1) "B"
+string(9) "protected"
+string(1) "A"
+string(8) "shadowed"
+string(1) "A"
diff --git a/Zend/tests/property_hooks/gh16040.phpt b/Zend/tests/property_hooks/gh16040.phpt
new file mode 100644
index 0000000000000..f9dfd6f29d944
--- /dev/null
+++ b/Zend/tests/property_hooks/gh16040.phpt
@@ -0,0 +1,20 @@
+--TEST--
+GH-16040: Use-after-free of object released in hook
+--FILE--
+bar);
+
+?>
+--EXPECT--
+int(42)
diff --git a/Zend/tests/property_hooks/gh16185.phpt b/Zend/tests/property_hooks/gh16185.phpt
new file mode 100644
index 0000000000000..d66cc095d323f
--- /dev/null
+++ b/Zend/tests/property_hooks/gh16185.phpt
@@ -0,0 +1,28 @@
+--TEST--
+GH-16185: Incorrect indexing into dynamic property array
+--FILE--
+ null;
+        set { $this->dynamicProp = $value; }
+    }
+}
+
+$object = new ByVal;
+foreach ($object as $value) {
+    var_dump($value);
+    $object->_virtualByRef = $value;
+}
+
+?>
+--EXPECTF--
+NULL
+
+Deprecated: Creation of dynamic property ByVal::$dynamicProp is deprecated in %s on line %d
+NULL
diff --git a/Zend/tests/property_hooks/gh16185_002.phpt b/Zend/tests/property_hooks/gh16185_002.phpt
new file mode 100644
index 0000000000000..39edba438b04c
--- /dev/null
+++ b/Zend/tests/property_hooks/gh16185_002.phpt
@@ -0,0 +1,30 @@
+--TEST--
+GH-16185: Hooked object iterator with readonly props
+--FILE--
+prop = 1;
+    }
+}
+
+$c = new C;
+
+// Okay, as foreach skips over uninitialized properties.
+foreach ($c as &$prop) {}
+
+$c->init();
+
+try {
+    foreach ($c as &$prop) {}
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECTF--
+Cannot acquire reference to readonly property C::$prop
diff --git a/Zend/tests/property_hooks/invalid_abstract_indirect.phpt b/Zend/tests/property_hooks/invalid_abstract_indirect.phpt
index 834440a7f6885..b04d44c8c8a85 100644
--- a/Zend/tests/property_hooks/invalid_abstract_indirect.phpt
+++ b/Zend/tests/property_hooks/invalid_abstract_indirect.phpt
@@ -13,4 +13,4 @@ class B extends A {
 
 ?>
 --EXPECTF--
-Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::$prop::get) in %s on line %d
+Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining method (A::$prop::get) in %s on line %d
diff --git a/Zend/tests/property_hooks/invalid_abstract_indirect_2.phpt b/Zend/tests/property_hooks/invalid_abstract_indirect_2.phpt
index 28938c17540b5..8526562c2adf5 100644
--- a/Zend/tests/property_hooks/invalid_abstract_indirect_2.phpt
+++ b/Zend/tests/property_hooks/invalid_abstract_indirect_2.phpt
@@ -12,4 +12,4 @@ class B extends A {
 
 ?>
 --EXPECTF--
-Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::$prop::get) in %s on line %d
+Fatal error: Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining method (A::$prop::get) in %s on line %d
diff --git a/Zend/tests/property_hooks/invalid_hook_visibility.phpt b/Zend/tests/property_hooks/invalid_hook_visibility.phpt
index a5b1e721ff8d4..56822d557cede 100644
--- a/Zend/tests/property_hooks/invalid_hook_visibility.phpt
+++ b/Zend/tests/property_hooks/invalid_hook_visibility.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Property hooks cannot have explicity visibility
+Property hooks cannot have explicitly visibility
 --FILE--
 
 --EXPECTF--
-Fatal error: Cannot use 'self' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "self" as a trait name as it is reserved in %s on line %d
diff --git a/Zend/tests/stack_limit/gh16041_001.phpt b/Zend/tests/stack_limit/gh16041_001.phpt
new file mode 100644
index 0000000000000..4d3e41a54dcdb
--- /dev/null
+++ b/Zend/tests/stack_limit/gh16041_001.phpt
@@ -0,0 +1,39 @@
+--TEST--
+GH-16041 001: Stack overflow in phpdbg
+--SKIPIF--
+
+--INI--
+zend.max_allowed_stack_size=512K
+--PHPDBG--
+set pagination off
+run
+continue
+quit
+--FILE--
+
+--EXPECTF--
+[Successful compilation of %sgh16041_001.php]
+prompt> prompt> [Uncaught Error in %s on line %d: Maximum call stack size of %d bytes%s
+>00005:         new Canary();
+ 00006:     }
+ 00007: }
+prompt> [Uncaught Error in %s on line %d]
+Error: Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion? in %s:%d
+Stack trace:
+#0 %s(%d): Canary->__destruct()
+%a
+prompt>
diff --git a/Zend/tests/stack_limit/gh16041_002.phpt b/Zend/tests/stack_limit/gh16041_002.phpt
new file mode 100644
index 0000000000000..6d389d208af4a
--- /dev/null
+++ b/Zend/tests/stack_limit/gh16041_002.phpt
@@ -0,0 +1,33 @@
+--TEST--
+GH-16041 002: Stack overflow in phpdbg
+--SKIPIF--
+
+--INI--
+zend.max_allowed_stack_size=512K
+--PHPDBG--
+set pagination off
+run
+quit
+--FILE--
+getMessage());
+}
+
+?>
+--EXPECTF--
+[Successful compilation of %sgh16041_002.php]
+prompt> prompt> Error: Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
+[Script ended normally]
+prompt>
diff --git a/Zend/tests/stack_limit/stack_limit_001.phpt b/Zend/tests/stack_limit/stack_limit_001.phpt
index a7d9e4c50e8ce..73cc3c08fe9d6 100644
--- a/Zend/tests/stack_limit/stack_limit_001.phpt
+++ b/Zend/tests/stack_limit/stack_limit_001.phpt
@@ -27,13 +27,6 @@ class Test2 {
     }
 }
 
-class Test3 {
-    public function __sleep()
-    {
-        serialize($this);
-    }
-}
-
 function replace() {
     return preg_replace_callback('#.#', function () {
         return replace();
@@ -52,12 +45,6 @@ try {
     echo $e->getMessage(), "\n";
 }
 
-try {
-    serialize(new Test3);
-} catch (Error $e) {
-    echo $e->getMessage(), "\n";
-}
-
 try {
     replace();
 } catch (Error $e) {
@@ -79,4 +66,3 @@ array(4) {
 Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
 Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
 Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
-Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
diff --git a/Zend/tests/stack_limit/stack_limit_002.phpt b/Zend/tests/stack_limit/stack_limit_002.phpt
index 44fab205f2ff0..64a11e1b26380 100644
--- a/Zend/tests/stack_limit/stack_limit_002.phpt
+++ b/Zend/tests/stack_limit/stack_limit_002.phpt
@@ -25,13 +25,6 @@ class Test2 {
     }
 }
 
-class Test3 {
-    public function __sleep()
-    {
-        serialize($this);
-    }
-}
-
 function replace() {
     return preg_replace_callback('#.#', function () {
         return replace();
@@ -51,12 +44,6 @@ $fiber = new Fiber(function (): void {
         echo $e->getMessage(), "\n";
     }
 
-    try {
-        serialize(new Test3);
-    } catch (Error $e) {
-        echo $e->getMessage(), "\n";
-    }
-
     try {
         replace();
     } catch (Error $e) {
@@ -81,4 +68,3 @@ array(4) {
 Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
 Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
 Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
-Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
diff --git a/Zend/tests/static_in_trait_insteadof_list.phpt b/Zend/tests/static_in_trait_insteadof_list.phpt
index 77ecf1e42baa3..f0458a09d87ff 100644
--- a/Zend/tests/static_in_trait_insteadof_list.phpt
+++ b/Zend/tests/static_in_trait_insteadof_list.phpt
@@ -15,4 +15,4 @@ class Test {
 
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'static' as trait name, as it is reserved in %s on line %d
+Fatal error: Cannot use "static" as trait name, as it is reserved in %s on line %d
diff --git a/Zend/tests/static_in_trait_insteadof_reference.phpt b/Zend/tests/static_in_trait_insteadof_reference.phpt
index 95a6b3c170668..d97d66993a80a 100644
--- a/Zend/tests/static_in_trait_insteadof_reference.phpt
+++ b/Zend/tests/static_in_trait_insteadof_reference.phpt
@@ -15,4 +15,4 @@ class Test {
 
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'static' as trait name, as it is reserved in %s on line %d
+Fatal error: Cannot use "static" as trait name, as it is reserved in %s on line %d
diff --git a/Zend/tests/temporary_cleaning_001.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_001.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_001.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_001.phpt
diff --git a/Zend/tests/temporary_cleaning_002.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_002.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_002.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_002.phpt
diff --git a/Zend/tests/temporary_cleaning_003.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_003.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_003.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_003.phpt
diff --git a/Zend/tests/temporary_cleaning_004.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_004.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_004.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_004.phpt
diff --git a/Zend/tests/temporary_cleaning_005.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_005.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_005.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_005.phpt
diff --git a/Zend/tests/temporary_cleaning_006.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_006.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_006.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_006.phpt
diff --git a/Zend/tests/temporary_cleaning_007.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_007.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_007.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_007.phpt
diff --git a/Zend/tests/temporary_cleaning_008.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_008.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_008.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_008.phpt
diff --git a/Zend/tests/temporary_cleaning_009.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_009.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_009.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_009.phpt
diff --git a/Zend/tests/temporary_cleaning_010.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_010.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_010.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_010.phpt
diff --git a/Zend/tests/temporary_cleaning_011.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_011.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_011.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_011.phpt
diff --git a/Zend/tests/temporary_cleaning_012.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_012.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_012.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_012.phpt
diff --git a/Zend/tests/temporary_cleaning_013.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_013.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_013.phpt
diff --git a/Zend/tests/temporary_cleaning_014.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_014.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_014.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_014.phpt
diff --git a/Zend/tests/temporary_cleaning_015.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_015.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_015.phpt
diff --git a/Zend/tests/temporary_cleaning_016.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_016.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_016.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_016.phpt
diff --git a/Zend/tests/temporary_cleaning_017.phpt b/Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt
similarity index 100%
rename from Zend/tests/temporary_cleaning_017.phpt
rename to Zend/tests/temporary_cleaning/temporary_cleaning_017.phpt
diff --git a/Zend/tests/throw/leaks.phpt b/Zend/tests/throw/leaks.phpt
index 0f9311a820c04..9249213801cc1 100644
--- a/Zend/tests/throw/leaks.phpt
+++ b/Zend/tests/throw/leaks.phpt
@@ -31,4 +31,4 @@ new stdClass(exit);
 Caught
 Caught
 Caught
-int(32767)
+int(30719)
diff --git a/Zend/tests/traits/abstract_method_6.phpt b/Zend/tests/traits/abstract_method_6.phpt
index a8a3fc4138689..279022d7f29cf 100644
--- a/Zend/tests/traits/abstract_method_6.phpt
+++ b/Zend/tests/traits/abstract_method_6.phpt
@@ -17,4 +17,4 @@ class D extends C {
 
 ?>
 --EXPECTF--
-Fatal error: Class C must implement 1 abstract private method (C::method) in %s on line %d
+Fatal error: Class C must implement 1 abstract method (C::method) in %s on line %d
diff --git a/Zend/tests/traits/bug60153.phpt b/Zend/tests/traits/bug60153.phpt
index 0b9fe951ba554..dce049f1d8742 100644
--- a/Zend/tests/traits/bug60153.phpt
+++ b/Zend/tests/traits/bug60153.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #60153 (Interface method prototypes not enforced when implementd via traits.)
+Bug #60153 (Interface method prototypes not enforced when implemented via traits.)
 --FILE--
 hello();
 ?>
 --EXPECTF--
-Fatal error: Class %s contains %d abstract method and must therefore be declared abstract or implement the remaining methods (%s) in %s on line %d
+Fatal error: Class %s contains %d abstract method and must therefore be declared abstract or implement the remaining method (%s) in %s on line %d
diff --git a/Zend/tests/traits/bugs/abstract-methods04.phpt b/Zend/tests/traits/bugs/abstract-methods04.phpt
index 0ae3137657096..f22a4546411ec 100644
--- a/Zend/tests/traits/bugs/abstract-methods04.phpt
+++ b/Zend/tests/traits/bugs/abstract-methods04.phpt
@@ -1,6 +1,6 @@
 --TEST--
 Abstract Trait Methods should behave like common abstract methods and
-implementstion may be provided by other traits. Sorting order shouldn't influence result.
+implementation may be provided by other traits. Sorting order shouldn't influence result.
 --FILE--
 
 --EXPECTF--
-Fatal error: Class bar contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (baz::abc) in %s on line %d
+Fatal error: Class bar contains 1 abstract method and must therefore be declared abstract or implement the remaining method (baz::abc) in %s on line %d
diff --git a/Zend/tests/traits/enum_underscore_as_name.phpt b/Zend/tests/traits/trait_underscore_as_name.phpt
similarity index 58%
rename from Zend/tests/traits/enum_underscore_as_name.phpt
rename to Zend/tests/traits/trait_underscore_as_name.phpt
index de62dad6af8e0..c29a93965de30 100644
--- a/Zend/tests/traits/enum_underscore_as_name.phpt
+++ b/Zend/tests/traits/trait_underscore_as_name.phpt
@@ -13,6 +13,6 @@ namespace {
 
 ?>
 --EXPECTF--
-Deprecated: Using "_" as a class name is deprecated since 8.4 in %s on line %d
+Deprecated: Using "_" as a trait name is deprecated since 8.4 in %s on line %d
 
-Deprecated: Using "_" as a class name is deprecated since 8.4 in %s on line %d
+Deprecated: Using "_" as a trait name is deprecated since 8.4 in %s on line %d
diff --git a/Zend/tests/try/try_catch_finally_005.phpt b/Zend/tests/try/try_catch_finally_005.phpt
index 9ff21c3e8b766..95e5fcb0850e5 100644
--- a/Zend/tests/try/try_catch_finally_005.phpt
+++ b/Zend/tests/try/try_catch_finally_005.phpt
@@ -32,7 +32,7 @@ for ($i = 0;  $i < 3; $i ++) {
             }
         }
     } catch (Exception $e) {
-       var_dump("cactched");
+       var_dump("caught");
     }  finally {
        var_dump("finally");
     }
@@ -46,7 +46,7 @@ string(9) "continue1"
 string(9) "continue2"
 string(7) "finally"
 string(9) "continue2"
-string(8) "cactched"
+string(6) "caught"
 string(7) "finally"
 string(9) "continue2"
 string(7) "finally"
diff --git a/Zend/tests/type_declarations/dnf_types/variance/valid1.phpt b/Zend/tests/type_declarations/dnf_types/variance/valid1.phpt
index 3282b0f9dc04f..d1716b4be7fb8 100644
--- a/Zend/tests/type_declarations/dnf_types/variance/valid1.phpt
+++ b/Zend/tests/type_declarations/dnf_types/variance/valid1.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Valid inheritence - co-variance
+Valid inheritance - co-variance
 --FILE--
 
 --EXPECTF--
-Fatal error: Cannot use 'mixed' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "mixed" as a class name as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_relative_typehint_disallowed.phpt b/Zend/tests/type_declarations/scalar_relative_typehint_disallowed.phpt
index 7f53b49b9c630..c22cc2445acf8 100644
--- a/Zend/tests/type_declarations/scalar_relative_typehint_disallowed.phpt
+++ b/Zend/tests/type_declarations/scalar_relative_typehint_disallowed.phpt
@@ -11,4 +11,4 @@ foo(10);
 
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'bar\int' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "bar\int" as a type name as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_reserved2.phpt b/Zend/tests/type_declarations/scalar_reserved2.phpt
index 4e1cca3d4012d..d0323836c0348 100644
--- a/Zend/tests/type_declarations/scalar_reserved2.phpt
+++ b/Zend/tests/type_declarations/scalar_reserved2.phpt
@@ -6,4 +6,4 @@ Scalar type names cannot be used as class, trait or interface names (2)
 class int {}
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'int' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "int" as a class name as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_reserved2_class_alias.phpt b/Zend/tests/type_declarations/scalar_reserved2_class_alias.phpt
index ae9e890516926..d5a6b5030ab76 100644
--- a/Zend/tests/type_declarations/scalar_reserved2_class_alias.phpt
+++ b/Zend/tests/type_declarations/scalar_reserved2_class_alias.phpt
@@ -7,4 +7,4 @@ class foobar {}
 class_alias("foobar", "int");
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'int' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "int" as a class alias as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_reserved3.phpt b/Zend/tests/type_declarations/scalar_reserved3.phpt
index 932bf624cc007..6b08388812e23 100644
--- a/Zend/tests/type_declarations/scalar_reserved3.phpt
+++ b/Zend/tests/type_declarations/scalar_reserved3.phpt
@@ -6,4 +6,4 @@ Scalar type names cannot be used as class, trait or interface names (3)
 class float {}
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'float' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "float" as a class name as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_reserved3_class_alias.phpt b/Zend/tests/type_declarations/scalar_reserved3_class_alias.phpt
index a7387495a31be..a784982a19452 100644
--- a/Zend/tests/type_declarations/scalar_reserved3_class_alias.phpt
+++ b/Zend/tests/type_declarations/scalar_reserved3_class_alias.phpt
@@ -7,4 +7,4 @@ class foobar {}
 class_alias("foobar", "float");
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'float' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "float" as a class alias as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_reserved4.phpt b/Zend/tests/type_declarations/scalar_reserved4.phpt
index 7cd5ae5775902..1559d181bfab5 100644
--- a/Zend/tests/type_declarations/scalar_reserved4.phpt
+++ b/Zend/tests/type_declarations/scalar_reserved4.phpt
@@ -6,4 +6,4 @@ Scalar type names cannot be used as class, trait or interface names (4)
 class string {}
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'string' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "string" as a class name as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_reserved4_class_alias.phpt b/Zend/tests/type_declarations/scalar_reserved4_class_alias.phpt
index 311503ec61177..b57d696d3d4e0 100644
--- a/Zend/tests/type_declarations/scalar_reserved4_class_alias.phpt
+++ b/Zend/tests/type_declarations/scalar_reserved4_class_alias.phpt
@@ -7,4 +7,4 @@ class foobar {}
 class_alias("foobar", "string");
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'string' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "string" as a class alias as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_reserved6.phpt b/Zend/tests/type_declarations/scalar_reserved6.phpt
index dca439d212203..f821fff9f141b 100644
--- a/Zend/tests/type_declarations/scalar_reserved6.phpt
+++ b/Zend/tests/type_declarations/scalar_reserved6.phpt
@@ -6,4 +6,4 @@ Scalar type names cannot be used as class, trait or interface names (6)
 class bool {}
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'bool' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "bool" as a class name as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_reserved6_class_alias.phpt b/Zend/tests/type_declarations/scalar_reserved6_class_alias.phpt
index 9aa060058a073..76410bb4e6e1f 100644
--- a/Zend/tests/type_declarations/scalar_reserved6_class_alias.phpt
+++ b/Zend/tests/type_declarations/scalar_reserved6_class_alias.phpt
@@ -7,4 +7,4 @@ class foobar {}
 class_alias("foobar", "bool");
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'bool' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "bool" as a class alias as it is reserved in %s on line %d
diff --git a/Zend/tests/type_declarations/scalar_reserved7.phpt b/Zend/tests/type_declarations/scalar_reserved7.phpt
index 1ab7a67204a06..a596c3442cd16 100644
--- a/Zend/tests/type_declarations/scalar_reserved7.phpt
+++ b/Zend/tests/type_declarations/scalar_reserved7.phpt
@@ -7,4 +7,4 @@ namespace foo;
 class int {}
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'int' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "int" as a class name as it is reserved in %s on line %d
diff --git a/Zend/tests/this_in_unset.phpt b/Zend/tests/unset/this_in_unset.phpt
similarity index 100%
rename from Zend/tests/this_in_unset.phpt
rename to Zend/tests/unset/this_in_unset.phpt
diff --git a/Zend/tests/unset.inc b/Zend/tests/unset/unset.inc
similarity index 100%
rename from Zend/tests/unset.inc
rename to Zend/tests/unset/unset.inc
diff --git a/Zend/tests/unset_cast_removed.phpt b/Zend/tests/unset/unset_cast_removed.phpt
similarity index 100%
rename from Zend/tests/unset_cast_removed.phpt
rename to Zend/tests/unset/unset_cast_removed.phpt
diff --git a/Zend/tests/unset_cv01.phpt b/Zend/tests/unset/unset_cv01.phpt
similarity index 100%
rename from Zend/tests/unset_cv01.phpt
rename to Zend/tests/unset/unset_cv01.phpt
diff --git a/Zend/tests/unset_cv02.phpt b/Zend/tests/unset/unset_cv02.phpt
similarity index 100%
rename from Zend/tests/unset_cv02.phpt
rename to Zend/tests/unset/unset_cv02.phpt
diff --git a/Zend/tests/unset_cv03.phpt b/Zend/tests/unset/unset_cv03.phpt
similarity index 100%
rename from Zend/tests/unset_cv03.phpt
rename to Zend/tests/unset/unset_cv03.phpt
diff --git a/Zend/tests/unset_cv04.phpt b/Zend/tests/unset/unset_cv04.phpt
similarity index 100%
rename from Zend/tests/unset_cv04.phpt
rename to Zend/tests/unset/unset_cv04.phpt
diff --git a/Zend/tests/unset_cv05.phpt b/Zend/tests/unset/unset_cv05.phpt
similarity index 100%
rename from Zend/tests/unset_cv05.phpt
rename to Zend/tests/unset/unset_cv05.phpt
diff --git a/Zend/tests/unset_cv06.phpt b/Zend/tests/unset/unset_cv06.phpt
similarity index 100%
rename from Zend/tests/unset_cv06.phpt
rename to Zend/tests/unset/unset_cv06.phpt
diff --git a/Zend/tests/unset_cv08.phpt b/Zend/tests/unset/unset_cv08.phpt
similarity index 100%
rename from Zend/tests/unset_cv08.phpt
rename to Zend/tests/unset/unset_cv08.phpt
diff --git a/Zend/tests/unset_cv10.phpt b/Zend/tests/unset/unset_cv10.phpt
similarity index 100%
rename from Zend/tests/unset_cv10.phpt
rename to Zend/tests/unset/unset_cv10.phpt
diff --git a/Zend/tests/unset_cv11.phpt b/Zend/tests/unset/unset_cv11.phpt
similarity index 100%
rename from Zend/tests/unset_cv11.phpt
rename to Zend/tests/unset/unset_cv11.phpt
diff --git a/Zend/tests/unset_cv12.phpt b/Zend/tests/unset/unset_cv12.phpt
similarity index 100%
rename from Zend/tests/unset_cv12.phpt
rename to Zend/tests/unset/unset_cv12.phpt
diff --git a/Zend/tests/unset_non_array.phpt b/Zend/tests/unset/unset_non_array.phpt
similarity index 100%
rename from Zend/tests/unset_non_array.phpt
rename to Zend/tests/unset/unset_non_array.phpt
diff --git a/Zend/tests/unset_prop_recursion.phpt b/Zend/tests/unset/unset_prop_recursion.phpt
similarity index 100%
rename from Zend/tests/unset_prop_recursion.phpt
rename to Zend/tests/unset/unset_prop_recursion.phpt
diff --git a/Zend/zend.c b/Zend/zend.c
index 2d3aa4f8e3300..b4fd4fd269c8a 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -94,6 +94,7 @@ ZEND_API char *(*zend_getenv)(const char *name, size_t name_len);
 ZEND_API zend_string *(*zend_resolve_path)(zend_string *filename);
 ZEND_API zend_result (*zend_post_startup_cb)(void) = NULL;
 ZEND_API void (*zend_post_shutdown_cb)(void) = NULL;
+ZEND_API void (*zend_accel_schedule_restart_hook)(int reason) = NULL;
 ZEND_ATTRIBUTE_NONNULL ZEND_API zend_result (*zend_random_bytes)(void *bytes, size_t size, char *errstr, size_t errstr_size) = NULL;
 ZEND_ATTRIBUTE_NONNULL ZEND_API void (*zend_random_bytes_insecure)(zend_random_bytes_insecure_state *state, void *bytes, size_t size) = NULL;
 
@@ -273,7 +274,7 @@ ZEND_INI_BEGIN()
 #ifdef ZEND_CHECK_STACK_LIMIT
 	/* The maximum allowed call stack size. 0: auto detect, -1: no limit. For fibers, this is fiber.stack_size. */
 	STD_ZEND_INI_ENTRY("zend.max_allowed_stack_size",	"0",	ZEND_INI_SYSTEM,	OnUpdateMaxAllowedStackSize,	max_allowed_stack_size,		zend_executor_globals,	executor_globals)
-	/* Substracted from the max allowed stack size, as a buffer, when checking for overflow. 0: auto detect. */
+	/* Subtracted from the max allowed stack size, as a buffer, when checking for overflow. 0: auto detect. */
 	STD_ZEND_INI_ENTRY("zend.reserved_stack_size",	"0",	ZEND_INI_SYSTEM,	OnUpdateReservedStackSize,	reserved_stack_size,		zend_executor_globals,	executor_globals)
 #endif
 
@@ -711,6 +712,7 @@ static void auto_global_copy_ctor(zval *zv) /* {{{ */
 static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) /* {{{ */
 {
 	compiler_globals->compiled_filename = NULL;
+	compiler_globals->zend_lineno = 0;
 
 	compiler_globals->function_table = (HashTable *) malloc(sizeof(HashTable));
 	zend_hash_init(compiler_globals->function_table, 1024, NULL, ZEND_FUNCTION_DTOR, 1);
@@ -803,6 +805,7 @@ static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{
 	zend_init_call_trampoline_op();
 	memset(&executor_globals->trampoline, 0, sizeof(zend_op_array));
 	executor_globals->capture_warnings_during_sccp = 0;
+	executor_globals->user_error_handler_error_reporting = 0;
 	ZVAL_UNDEF(&executor_globals->user_error_handler);
 	ZVAL_UNDEF(&executor_globals->user_exception_handler);
 	executor_globals->in_autoload = NULL;
@@ -1602,7 +1605,6 @@ static ZEND_COLD void get_filename_lineno(int type, zend_string **filename, uint
 		case E_COMPILE_WARNING:
 		case E_ERROR:
 		case E_NOTICE:
-		case E_STRICT:
 		case E_DEPRECATED:
 		case E_WARNING:
 		case E_USER_ERROR:
diff --git a/Zend/zend.h b/Zend/zend.h
index 1506b868e1690..0cf1faeb653fe 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -20,7 +20,7 @@
 #ifndef ZEND_H
 #define ZEND_H
 
-#define ZEND_VERSION "4.4.0-dev"
+#define ZEND_VERSION "4.5.0-dev"
 
 #define ZEND_ENGINE_3
 
@@ -377,6 +377,8 @@ extern ZEND_ATTRIBUTE_NONNULL ZEND_API void (*zend_random_bytes_insecure)(
 extern ZEND_API zend_result (*zend_post_startup_cb)(void);
 extern ZEND_API void (*zend_post_shutdown_cb)(void);
 
+extern ZEND_API void (*zend_accel_schedule_restart_hook)(int reason);
+
 ZEND_API ZEND_COLD void zend_error(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
 ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
 ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn_unchecked(int type, const char *format, ...);
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 2319862488ca6..fd5b7c8db7966 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -1879,7 +1879,6 @@ ZEND_API zend_result object_init_with_constructor(zval *arg, zend_class_entry *c
 			zend_hash_get_current_key(named_params, &arg_name, /* num_index */ NULL);
 			ZEND_ASSERT(arg_name != NULL);
 			zend_throw_error(NULL, "Unknown named parameter $%s", ZSTR_VAL(arg_name));
-			zend_string_release(arg_name);
 			/* Do not call destructor, free object, and set arg to IS_UNDEF */
 			zend_object_store_ctor_failed(obj);
 			zval_ptr_dtor(arg);
@@ -2958,7 +2957,7 @@ ZEND_API zend_result zend_register_functions(zend_class_entry *scope, const zend
 		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 {
-#if ZTS
+#ifdef ZTS
 			ZEND_MAP_PTR_NEW_STATIC(internal_function->run_time_cache);
 #else
 			ZEND_MAP_PTR_INIT(internal_function->run_time_cache, NULL);
@@ -3571,7 +3570,7 @@ ZEND_API zend_result zend_register_class_alias_ex(const char *name, size_t name_
 		zend_str_tolower_copy(ZSTR_VAL(lcname), name, name_len);
 	}
 
-	zend_assert_valid_class_name(lcname);
+	zend_assert_valid_class_name(lcname, "a class alias");
 
 	lcname = zend_new_interned_string(lcname);
 
diff --git a/Zend/zend_attributes_arginfo.h b/Zend/zend_attributes_arginfo.h
index 817dacbd44d50..018caa47d0ac5 100644
--- a/Zend/zend_attributes_arginfo.h
+++ b/Zend/zend_attributes_arginfo.h
@@ -207,9 +207,7 @@ static zend_class_entry *register_class_SensitiveParameterValue(void)
 
 	zval property_value_default_value;
 	ZVAL_UNDEF(&property_value_default_value);
-	zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1);
-	zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PRIVATE|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY));
-	zend_string_release(property_value_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_VALUE), &property_value_default_value, ZEND_ACC_PRIVATE|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ANY));
 
 	return class_entry;
 }
@@ -240,15 +238,11 @@ static zend_class_entry *register_class_Deprecated(void)
 
 	zval property_message_default_value;
 	ZVAL_UNDEF(&property_message_default_value);
-	zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
-	zend_declare_typed_property(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
-	zend_string_release(property_message_name);
+	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|MAY_BE_NULL));
 
 	zval property_since_default_value;
 	ZVAL_UNDEF(&property_since_default_value);
-	zend_string *property_since_name = zend_string_init("since", sizeof("since") - 1, 1);
-	zend_declare_typed_property(class_entry, property_since_name, &property_since_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
-	zend_string_release(property_since_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_SINCE), &property_since_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 
 	zend_string *attribute_name_Attribute_class_Deprecated_0 = zend_string_init_interned("Attribute", sizeof("Attribute") - 1, 1);
 	zend_attribute *attribute_Attribute_class_Deprecated_0 = zend_add_class_attribute(class_entry, attribute_name_Attribute_class_Deprecated_0, 1);
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 654ba7e7ea129..bb8bb28bf6e4f 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -1017,8 +1017,8 @@ static void _property_exists(zval *return_value, zval *object, zend_string *prop
 		RETURN_TRUE;
 	}
 
-	if (Z_TYPE_P(object) ==  IS_OBJECT &&
-		Z_OBJ_HANDLER_P(object, has_property)(Z_OBJ_P(object), property, 2, NULL)) {
+	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;
@@ -1883,6 +1883,16 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
 	}
 
 	while (call && (limit == 0 || frameno < limit)) {
+		if (UNEXPECTED(!call->func)) {
+			/* This is the fake frame inserted for nested generators. Normally,
+			 * this frame is preceded by the actual generator frame and then
+			 * replaced by zend_generator_check_placeholder_frame() below.
+			 * However, the frame is popped before cleaning the stack frame,
+			 * which is observable by destructors. */
+			call = zend_generator_check_placeholder_frame(call);
+			ZEND_ASSERT(call->func);
+		}
+
 		zend_execute_data *prev = call->prev_execute_data;
 
 		if (!prev) {
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 63787c902f647..ae50c29dffad6 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -237,14 +237,14 @@ static bool zend_is_reserved_class_name(const zend_string *name) /* {{{ */
 }
 /* }}} */
 
-void zend_assert_valid_class_name(const zend_string *name) /* {{{ */
+void zend_assert_valid_class_name(const zend_string *name, const char *type) /* {{{ */
 {
 	if (zend_is_reserved_class_name(name)) {
 		zend_error_noreturn(E_COMPILE_ERROR,
-			"Cannot use '%s' as class name as it is reserved", ZSTR_VAL(name));
+			"Cannot use \"%s\" as %s as it is reserved", ZSTR_VAL(name), type);
 	}
 	if (zend_string_equals_literal(name, "_")) {
-		zend_error(E_DEPRECATED, "Using \"_\" as a class name is deprecated since 8.4");
+		zend_error(E_DEPRECATED, "Using \"_\" as %s is deprecated since 8.4", type);
 	}
 }
 /* }}} */
@@ -1764,7 +1764,7 @@ static zend_string *zend_resolve_const_class_name_reference(zend_ast *ast, const
 	zend_string *class_name = zend_ast_get_str(ast);
 	if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type_ast(ast)) {
 		zend_error_noreturn(E_COMPILE_ERROR,
-			"Cannot use '%s' as %s, as it is reserved",
+			"Cannot use \"%s\" as %s, as it is reserved",
 			ZSTR_VAL(class_name), type);
 	}
 	return zend_resolve_class_name(class_name, ast->attr);
@@ -6985,7 +6985,7 @@ static zend_type zend_compile_single_typename(zend_ast *ast)
 			uint32_t fetch_type = zend_get_class_fetch_type_ast(ast);
 			if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) {
 				class_name = zend_resolve_class_name_ast(ast);
-				zend_assert_valid_class_name(class_name);
+				zend_assert_valid_class_name(class_name, "a type name");
 			} else {
 				zend_ensure_valid_class_fetch_type(fetch_type);
 				zend_string_addref(class_name);
@@ -8598,6 +8598,10 @@ static void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t f
 		zend_error_noreturn(E_COMPILE_ERROR, "Property cannot be both final and private");
 	}
 
+	if ((flags & ZEND_ACC_STATIC) && (flags & ZEND_ACC_PPP_SET_MASK)) {
+		zend_error_noreturn(E_COMPILE_ERROR, "Static property may not have asymmetric visibility");
+	}
+
 	if (ce->ce_flags & ZEND_ACC_INTERFACE) {
 		if (flags & ZEND_ACC_FINAL) {
 			zend_error_noreturn(E_COMPILE_ERROR, "Property in interface cannot be final");
@@ -8996,7 +9000,15 @@ static void zend_compile_class_decl(znode *result, zend_ast *ast, bool toplevel)
 			zend_error_noreturn(E_COMPILE_ERROR, "Class declarations may not be nested");
 		}
 
-		zend_assert_valid_class_name(unqualified_name);
+		const char *type = "a class name";
+		if (decl->flags & ZEND_ACC_ENUM) {
+			type = "an enum name";
+		} else if (decl->flags & ZEND_ACC_INTERFACE) {
+			type = "an interface name";
+		} else if (decl->flags & ZEND_ACC_TRAIT) {
+			type = "a trait name";
+		}
+		zend_assert_valid_class_name(unqualified_name, type);
 		name = zend_prefix_with_ns(unqualified_name);
 		name = zend_new_interned_string(name);
 		lcname = zend_string_tolower(name);
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index f8f33879973f1..1eaf3ef686e79 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -337,7 +337,7 @@ typedef struct _zend_oparray_context {
 /* ==============                                         |     |     |     */
 /*                                                        |     |     |     */
 /* deprecation flag                                       |     |     |     */
-#define ZEND_ACC_DEPRECATED              (1 << 11) /*     |  X  |     |     */
+#define ZEND_ACC_DEPRECATED              (1 << 11) /*     |  X  |     |  X  */
 /*                                                        |     |     |     */
 /* Function returning by reference                        |     |     |     */
 #define ZEND_ACC_RETURN_REFERENCE        (1 << 12) /*     |  X  |     |     */
@@ -1001,7 +1001,7 @@ ZEND_API void zend_set_function_arg_flags(zend_function *func);
 
 int ZEND_FASTCALL zendlex(zend_parser_stack_elem *elem);
 
-void zend_assert_valid_class_name(const zend_string *const_name);
+void zend_assert_valid_class_name(const zend_string *const_name, const char *type);
 
 zend_string *zend_type_to_string_resolved(zend_type type, zend_class_entry *scope);
 ZEND_API zend_string *zend_type_to_string(zend_type type);
diff --git a/Zend/zend_constants.stub.php b/Zend/zend_constants.stub.php
index 014ae748f3ada..ee67966c0151c 100644
--- a/Zend/zend_constants.stub.php
+++ b/Zend/zend_constants.stub.php
@@ -71,6 +71,8 @@
 /**
  * @var int
  * @cvalue E_STRICT
+ * @deprecated
+ * @todo Remove in PHP 9.0
  */
 const E_STRICT = UNKNOWN;
 
diff --git a/Zend/zend_constants_arginfo.h b/Zend/zend_constants_arginfo.h
index 8c1846aa97e26..8d42345ad69bc 100644
--- a/Zend/zend_constants_arginfo.h
+++ b/Zend/zend_constants_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 1da352eeafa0d33ddda4171cca4c7bf18313915f */
+ * Stub hash: 65be08c1bdace83ad1fa1175fc824262e07eac2a */
 
 static void register_zend_constants_symbols(int module_number)
 {
@@ -14,7 +14,7 @@ static void register_zend_constants_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("E_USER_ERROR", E_USER_ERROR, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("E_USER_WARNING", E_USER_WARNING, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("E_USER_NOTICE", E_USER_NOTICE, CONST_PERSISTENT);
-	REGISTER_LONG_CONSTANT("E_STRICT", E_STRICT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("E_STRICT", E_STRICT, CONST_PERSISTENT | CONST_DEPRECATED);
 	REGISTER_LONG_CONSTANT("E_RECOVERABLE_ERROR", E_RECOVERABLE_ERROR, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("E_DEPRECATED", E_DEPRECATED, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("E_USER_DEPRECATED", E_USER_DEPRECATED, CONST_PERSISTENT);
diff --git a/Zend/zend_enum.c b/Zend/zend_enum.c
index 8676d1166cf3a..8259441fd4228 100644
--- a/Zend/zend_enum.c
+++ b/Zend/zend_enum.c
@@ -57,9 +57,9 @@ zend_object *zend_enum_new(zval *result, zend_class_entry *ce, zend_string *case
 	return zobj;
 }
 
-static void zend_verify_enum_properties(zend_class_entry *ce)
+static void zend_verify_enum_properties(const zend_class_entry *ce)
 {
-	zend_property_info *property_info;
+	const zend_property_info *property_info;
 
 	ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, property_info) {
 		if (zend_string_equals(property_info->name, ZSTR_KNOWN(ZEND_STR_NAME))) {
@@ -77,7 +77,7 @@ static void zend_verify_enum_properties(zend_class_entry *ce)
 	} ZEND_HASH_FOREACH_END();
 }
 
-static void zend_verify_enum_magic_methods(zend_class_entry *ce)
+static void zend_verify_enum_magic_methods(const zend_class_entry *ce)
 {
 	// Only __get, __call and __invoke are allowed
 
@@ -109,7 +109,7 @@ static void zend_verify_enum_magic_methods(zend_class_entry *ce)
 	}
 }
 
-static void zend_verify_enum_interfaces(zend_class_entry *ce)
+static void zend_verify_enum_interfaces(const zend_class_entry *ce)
 {
 	if (zend_class_implements_interface(ce, zend_ce_serializable)) {
 		zend_error_noreturn(E_COMPILE_ERROR,
@@ -117,7 +117,7 @@ static void zend_verify_enum_interfaces(zend_class_entry *ce)
 	}
 }
 
-void zend_verify_enum(zend_class_entry *ce)
+void zend_verify_enum(const zend_class_entry *ce)
 {
 	zend_verify_enum_properties(ce);
 	zend_verify_enum_magic_methods(ce);
@@ -205,7 +205,7 @@ zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce)
 	zend_hash_init(backed_enum_table, 0, NULL, ZVAL_PTR_DTOR, 0);
 	zend_class_set_backed_enum_table(ce, backed_enum_table);
 
-	zend_string *enum_class_name = ce->name;
+	const zend_string *enum_class_name = ce->name;
 
 	zend_string *name;
 	zval *val;
@@ -228,7 +228,7 @@ zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce)
 
 		if (ce->enum_backing_type == IS_LONG) {
 			zend_long long_key = Z_LVAL_P(case_value);
-			zval *existing_case_name = zend_hash_index_find(backed_enum_table, long_key);
+			const zval *existing_case_name = zend_hash_index_find(backed_enum_table, long_key);
 			if (existing_case_name) {
 				zend_throw_error(NULL, "Duplicate value in enum %s for cases %s and %s",
 					ZSTR_VAL(enum_class_name),
@@ -241,7 +241,7 @@ zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce)
 		} else {
 			ZEND_ASSERT(ce->enum_backing_type == IS_STRING);
 			zend_string *string_key = Z_STR_P(case_value);
-			zval *existing_case_name = zend_hash_find(backed_enum_table, string_key);
+			const zval *existing_case_name = zend_hash_find(backed_enum_table, string_key);
 			if (existing_case_name != NULL) {
 				zend_throw_error(NULL, "Duplicate value in enum %s for cases %s and %s",
 					ZSTR_VAL(enum_class_name),
@@ -294,7 +294,7 @@ ZEND_API zend_result zend_enum_get_case_by_value(zend_object **result, zend_clas
 		}
 	}
 
-	HashTable *backed_enum_table = CE_BACKED_ENUM_TABLE(ce);
+	const HashTable *backed_enum_table = CE_BACKED_ENUM_TABLE(ce);
 	if (!backed_enum_table) {
 		goto not_found;
 	}
@@ -421,7 +421,7 @@ static void zend_enum_register_func(zend_class_entry *ce, zend_known_string_id n
     if (EG(active)) { // at run-time
 		ZEND_MAP_PTR_INIT(zif->run_time_cache, zend_arena_calloc(&CG(arena), 1, zend_internal_run_time_cache_reserved_size()));
 	} else {
-#if ZTS
+#ifdef ZTS
 		ZEND_MAP_PTR_NEW_STATIC(zif->run_time_cache);
 #else
 		ZEND_MAP_PTR_INIT(zif->run_time_cache, NULL);
diff --git a/Zend/zend_enum.h b/Zend/zend_enum.h
index c3519ee35f3bb..7b3b0184b4eb5 100644
--- a/Zend/zend_enum.h
+++ b/Zend/zend_enum.h
@@ -34,7 +34,7 @@ void zend_register_enum_ce(void);
 void zend_enum_add_interfaces(zend_class_entry *ce);
 zend_result zend_enum_build_backed_enum_table(zend_class_entry *ce);
 zend_object *zend_enum_new(zval *result, zend_class_entry *ce, zend_string *case_name, zval *backing_value_zv);
-void zend_verify_enum(zend_class_entry *ce);
+void zend_verify_enum(const zend_class_entry *ce);
 void zend_enum_register_funcs(zend_class_entry *ce);
 void zend_enum_register_props(zend_class_entry *ce);
 
diff --git a/Zend/zend_errors.h b/Zend/zend_errors.h
index dd7539523dbf2..954be61a0aecc 100644
--- a/Zend/zend_errors.h
+++ b/Zend/zend_errors.h
@@ -31,6 +31,7 @@
 #define E_USER_ERROR		(1<<8L)
 #define E_USER_WARNING		(1<<9L)
 #define E_USER_NOTICE		(1<<10L)
+// TODO: Remove in PHP 9.0
 #define E_STRICT			(1<<11L)
 #define E_RECOVERABLE_ERROR	(1<<12L)
 #define E_DEPRECATED		(1<<13L)
@@ -39,7 +40,7 @@
 /* Indicates that this usually fatal error should not result in a bailout */
 #define E_DONT_BAIL			(1<<15L)
 
-#define E_ALL (E_ERROR | E_WARNING | E_PARSE | E_NOTICE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_RECOVERABLE_ERROR | E_DEPRECATED | E_USER_DEPRECATED | E_STRICT)
+#define E_ALL (E_ERROR | E_WARNING | E_PARSE | E_NOTICE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_USER_ERROR | E_USER_WARNING | E_USER_NOTICE | E_RECOVERABLE_ERROR | E_DEPRECATED | E_USER_DEPRECATED)
 #define E_CORE (E_CORE_ERROR | E_CORE_WARNING)
 
 /* Fatal errors that are ignored by the silence operator */
diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index 4af4ec2cfc059..f532c07e4e679 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -116,15 +116,18 @@ void zend_exception_set_previous(zend_object *exception, zend_object *add_previo
 	ex = &zv;
 	do {
 		ancestor = zend_read_property_ex(i_get_exception_base(add_previous), add_previous, ZSTR_KNOWN(ZEND_STR_PREVIOUS), 1, &rv);
+		ZVAL_DEREF(ancestor);
 		while (Z_TYPE_P(ancestor) == IS_OBJECT) {
 			if (Z_OBJ_P(ancestor) == Z_OBJ_P(ex)) {
 				OBJ_RELEASE(add_previous);
 				return;
 			}
 			ancestor = zend_read_property_ex(i_get_exception_base(Z_OBJ_P(ancestor)), Z_OBJ_P(ancestor), ZSTR_KNOWN(ZEND_STR_PREVIOUS), 1, &rv);
+			ZVAL_DEREF(ancestor);
 		}
 		base_ce = i_get_exception_base(Z_OBJ_P(ex));
 		previous = zend_read_property_ex(base_ce, Z_OBJ_P(ex), ZSTR_KNOWN(ZEND_STR_PREVIOUS), 1, &rv);
+		ZVAL_DEREF(previous);
 		if (Z_TYPE_P(previous) == IS_NULL) {
 			zend_update_property_ex(base_ce, Z_OBJ_P(ex), ZSTR_KNOWN(ZEND_STR_PREVIOUS), &pv);
 			GC_DELREF(add_previous);
@@ -295,7 +298,7 @@ static zend_object *zend_default_exception_new(zend_class_entry *class_type) /*
 /* {{{ Clone the exception object */
 ZEND_COLD ZEND_METHOD(Exception, __clone)
 {
-	/* Should never be executable */
+	/* __clone() is private but this is reachable with reflection */
 	zend_throw_exception(NULL, "Cannot clone object using __clone()", 0);
 }
 /* }}} */
@@ -626,6 +629,7 @@ ZEND_METHOD(Exception, getTraceAsString)
 		RETURN_THROWS();
 	}
 
+	ZVAL_DEREF(trace);
 	/* Type should be guaranteed by property type. */
 	ZEND_ASSERT(Z_TYPE_P(trace) == IS_ARRAY);
 	RETURN_NEW_STR(zend_trace_to_string(Z_ARRVAL_P(trace), /* include_main */ true));
@@ -639,7 +643,7 @@ ZEND_METHOD(Exception, getPrevious)
 
 	ZEND_PARSE_PARAMETERS_NONE();
 
-	ZVAL_COPY(return_value, GET_PROPERTY_SILENT(ZEND_THIS, ZEND_STR_PREVIOUS));
+	ZVAL_COPY_DEREF(return_value, GET_PROPERTY_SILENT(ZEND_THIS, ZEND_STR_PREVIOUS));
 } /* }}} */
 
 /* {{{ Obtain the string representation of the Exception object */
@@ -713,7 +717,8 @@ ZEND_METHOD(Exception, __toString)
 
 		Z_PROTECT_RECURSION_P(exception);
 		exception = GET_PROPERTY(exception, ZEND_STR_PREVIOUS);
-		if (exception && Z_TYPE_P(exception) == IS_OBJECT && Z_IS_RECURSIVE_P(exception)) {
+		ZVAL_DEREF(exception);
+		if (Z_TYPE_P(exception) == IS_OBJECT && Z_IS_RECURSIVE_P(exception)) {
 			break;
 		}
 	}
@@ -721,13 +726,14 @@ ZEND_METHOD(Exception, __toString)
 
 	exception = ZEND_THIS;
 	/* Reset apply counts */
-	while (exception && Z_TYPE_P(exception) == IS_OBJECT && (base_ce = i_get_exception_base(Z_OBJ_P(exception))) && instanceof_function(Z_OBJCE_P(exception), base_ce)) {
+	while (Z_TYPE_P(exception) == IS_OBJECT && (base_ce = i_get_exception_base(Z_OBJ_P(exception))) && instanceof_function(Z_OBJCE_P(exception), base_ce)) {
 		if (Z_IS_RECURSIVE_P(exception)) {
 			Z_UNPROTECT_RECURSION_P(exception);
 		} else {
 			break;
 		}
 		exception = GET_PROPERTY(exception, ZEND_STR_PREVIOUS);
+		ZVAL_DEREF(exception);
 	}
 
 	exception = ZEND_THIS;
diff --git a/Zend/zend_exceptions_arginfo.h b/Zend/zend_exceptions_arginfo.h
index 0519b61e3d978..cef37a1f0f0b9 100644
--- a/Zend/zend_exceptions_arginfo.h
+++ b/Zend/zend_exceptions_arginfo.h
@@ -163,46 +163,32 @@ static zend_class_entry *register_class_Exception(zend_class_entry *class_entry_
 
 	zval property_message_default_value;
 	ZVAL_EMPTY_STRING(&property_message_default_value);
-	zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
-	zend_declare_typed_property(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
-	zend_string_release(property_message_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_MESSAGE), &property_message_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 
 	zval property_string_default_value;
 	ZVAL_EMPTY_STRING(&property_string_default_value);
-	zend_string *property_string_name = zend_string_init("string", sizeof("string") - 1, 1);
-	zend_declare_typed_property(class_entry, property_string_name, &property_string_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_string_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_STRING), &property_string_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_code_default_value;
 	ZVAL_LONG(&property_code_default_value, 0);
-	zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
-	zend_declare_typed_property(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
-	zend_string_release(property_code_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_CODE), &property_code_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 
 	zval property_file_default_value;
 	ZVAL_EMPTY_STRING(&property_file_default_value);
-	zend_string *property_file_name = zend_string_init("file", sizeof("file") - 1, 1);
-	zend_declare_typed_property(class_entry, property_file_name, &property_file_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_file_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_FILE), &property_file_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_line_default_value;
 	ZVAL_LONG(&property_line_default_value, 0);
-	zend_string *property_line_name = zend_string_init("line", sizeof("line") - 1, 1);
-	zend_declare_typed_property(class_entry, property_line_name, &property_line_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(property_line_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_LINE), &property_line_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 
 	zval property_trace_default_value;
 	ZVAL_EMPTY_ARRAY(&property_trace_default_value);
-	zend_string *property_trace_name = zend_string_init("trace", sizeof("trace") - 1, 1);
-	zend_declare_typed_property(class_entry, property_trace_name, &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
-	zend_string_release(property_trace_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_TRACE), &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
 
 	zval property_previous_default_value;
 	ZVAL_NULL(&property_previous_default_value);
-	zend_string *property_previous_name = zend_string_init("previous", sizeof("previous") - 1, 1);
 	zend_string *property_previous_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1);
-	zend_declare_typed_property(class_entry, property_previous_name, &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previous_class_Throwable, 0, MAY_BE_NULL));
-	zend_string_release(property_previous_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_PREVIOUS), &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previous_class_Throwable, 0, MAY_BE_NULL));
 
 	return class_entry;
 }
@@ -216,9 +202,7 @@ static zend_class_entry *register_class_ErrorException(zend_class_entry *class_e
 
 	zval property_severity_default_value;
 	ZVAL_LONG(&property_severity_default_value, E_ERROR);
-	zend_string *property_severity_name = zend_string_init("severity", sizeof("severity") - 1, 1);
-	zend_declare_typed_property(class_entry, property_severity_name, &property_severity_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(property_severity_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_SEVERITY), &property_severity_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 
 	return class_entry;
 }
@@ -233,46 +217,32 @@ static zend_class_entry *register_class_Error(zend_class_entry *class_entry_Thro
 
 	zval property_message_default_value;
 	ZVAL_EMPTY_STRING(&property_message_default_value);
-	zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
-	zend_declare_typed_property(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
-	zend_string_release(property_message_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_MESSAGE), &property_message_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 
 	zval property_string_default_value;
 	ZVAL_EMPTY_STRING(&property_string_default_value);
-	zend_string *property_string_name = zend_string_init("string", sizeof("string") - 1, 1);
-	zend_declare_typed_property(class_entry, property_string_name, &property_string_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_string_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_STRING), &property_string_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_code_default_value;
 	ZVAL_LONG(&property_code_default_value, 0);
-	zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
-	zend_declare_typed_property(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
-	zend_string_release(property_code_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_CODE), &property_code_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 
 	zval property_file_default_value;
 	ZVAL_EMPTY_STRING(&property_file_default_value);
-	zend_string *property_file_name = zend_string_init("file", sizeof("file") - 1, 1);
-	zend_declare_typed_property(class_entry, property_file_name, &property_file_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_file_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_FILE), &property_file_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_line_default_value;
 	ZVAL_UNDEF(&property_line_default_value);
-	zend_string *property_line_name = zend_string_init("line", sizeof("line") - 1, 1);
-	zend_declare_typed_property(class_entry, property_line_name, &property_line_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(property_line_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_LINE), &property_line_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 
 	zval property_trace_default_value;
 	ZVAL_EMPTY_ARRAY(&property_trace_default_value);
-	zend_string *property_trace_name = zend_string_init("trace", sizeof("trace") - 1, 1);
-	zend_declare_typed_property(class_entry, property_trace_name, &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
-	zend_string_release(property_trace_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_TRACE), &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_ARRAY));
 
 	zval property_previous_default_value;
 	ZVAL_NULL(&property_previous_default_value);
-	zend_string *property_previous_name = zend_string_init("previous", sizeof("previous") - 1, 1);
 	zend_string *property_previous_class_Throwable = zend_string_init("Throwable", sizeof("Throwable")-1, 1);
-	zend_declare_typed_property(class_entry, property_previous_name, &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previous_class_Throwable, 0, MAY_BE_NULL));
-	zend_string_release(property_previous_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_PREVIOUS), &property_previous_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_previous_class_Throwable, 0, MAY_BE_NULL));
 
 	return class_entry;
 }
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 70e7a2b5fd149..ba398e18ae078 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -2454,7 +2454,7 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_invalid_method_call(z
 		Z_STRVAL_P(function_name), zend_zval_value_name(object));
 }
 
-static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc)
+ZEND_API void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc)
 {
 	zend_throw_error(
 		zend_ce_error,
@@ -2500,7 +2500,7 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_new_element_for_s
 }
 
 #ifdef ZEND_CHECK_STACK_LIMIT
-static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_call_stack_size_error(void)
+ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_call_stack_size_error(void)
 {
 	size_t max_stack_size = 0;
 	if ((uintptr_t) EG(stack_base) > (uintptr_t) EG(stack_limit)) {
@@ -3290,22 +3290,6 @@ ZEND_API bool zend_verify_ref_array_assignable(zend_reference *ref) {
 	return 1;
 }
 
-static zend_property_info *zend_object_fetch_property_type_info(
-		zend_object *obj, zval *slot)
-{
-	if (EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(obj->ce))) {
-		return NULL;
-	}
-
-	/* Not a declared property */
-	if (UNEXPECTED(slot < obj->properties_table ||
-			slot >= obj->properties_table + obj->ce->default_properties_count)) {
-		return NULL;
-	}
-
-	return zend_get_typed_property_info_for_slot(obj, slot);
-}
-
 static zend_never_inline bool zend_handle_fetch_obj_flags(
 		zval *result, zval *ptr, zend_object *obj, zend_property_info *prop_info, uint32_t flags)
 {
@@ -3313,10 +3297,7 @@ static zend_never_inline bool zend_handle_fetch_obj_flags(
 		case ZEND_FETCH_DIM_WRITE:
 			if (promotes_to_array(ptr)) {
 				if (!prop_info) {
-					prop_info = zend_object_fetch_property_type_info(obj, ptr);
-					if (!prop_info) {
-						break;
-					}
+					break;
 				}
 				if (!check_type_array_assignable(prop_info->type)) {
 					zend_throw_auto_init_in_prop_error(prop_info);
@@ -3328,10 +3309,7 @@ static zend_never_inline bool zend_handle_fetch_obj_flags(
 		case ZEND_FETCH_REF:
 			if (Z_TYPE_P(ptr) != IS_REFERENCE) {
 				if (!prop_info) {
-					prop_info = zend_object_fetch_property_type_info(obj, ptr);
-					if (!prop_info) {
-						break;
-					}
+					break;
 				}
 				if (Z_TYPE_P(ptr) == IS_UNDEF) {
 					if (!ZEND_TYPE_ALLOW_NULL(prop_info->type)) {
@@ -3351,11 +3329,17 @@ static zend_never_inline bool zend_handle_fetch_obj_flags(
 	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 OPLINE_DC EXECUTE_DATA_DC)
+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)
 {
 	zval *ptr;
 	zend_object *zobj;
 	zend_string *name, *tmp_name;
+	void *_cache_slot[3] = {0};
+	if (prop_op_type != IS_CONST) {
+		cache_slot = _cache_slot;
+	} else {
+		ZEND_ASSERT(cache_slot);
+	}
 
 	if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
 		do {
@@ -3386,6 +3370,9 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
 	if (prop_op_type == IS_CONST &&
 	    EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
 		uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1);
+		if (prop_info_p) {
+			*prop_info_p = CACHED_PTR_EX(cache_slot + 2);
+		}
 
 		if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
 			ptr = OBJ_PROP(zobj, prop_offset);
@@ -3465,23 +3452,18 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
 	ZVAL_INDIRECT(result, ptr);
 	flags &= ZEND_FETCH_OBJ_FLAGS;
 	if (flags) {
-		zend_property_info *prop_info;
-
-		if (prop_op_type == IS_CONST) {
-			prop_info = CACHED_PTR_EX(cache_slot + 2);
-			if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) {
-				if (UNEXPECTED(!zend_handle_fetch_obj_flags(result, ptr, NULL, prop_info, flags))) {
-					goto end;
-				}
-			}
-		} else {
-			if (UNEXPECTED(!zend_handle_fetch_obj_flags(result, ptr, Z_OBJ_P(container), NULL, flags))) {
+		zend_property_info *prop_info = CACHED_PTR_EX(cache_slot + 2);
+		if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) {
+			if (UNEXPECTED(!zend_handle_fetch_obj_flags(result, ptr, NULL, prop_info, flags))) {
 				goto end;
 			}
 		}
 	}
 
 end:
+	if (prop_info_p) {
+		*prop_info_p = CACHED_PTR_EX(cache_slot + 2);
+	}
 	if (prop_op_type != IS_CONST) {
 		zend_tmp_string_release(tmp_name);
 	}
@@ -3492,9 +3474,10 @@ static zend_always_inline void zend_assign_to_property_reference(zval *container
 	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;
+	zend_property_info *prop_info = NULL;
 
 	zend_fetch_property_address(variable_ptr, container, container_op_type, prop_ptr, prop_op_type,
-		cache_addr, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC);
+		cache_addr, BP_VAR_W, 0, &prop_info OPLINE_CC EXECUTE_DATA_CC);
 
 	if (EXPECTED(Z_TYPE_P(variable_ptr) == IS_INDIRECT)) {
 		variable_ptr = Z_INDIRECT_P(variable_ptr);
@@ -3504,21 +3487,10 @@ static zend_always_inline void zend_assign_to_property_reference(zval *container
 
 			variable_ptr = zend_wrong_assign_to_variable_reference(
 				variable_ptr, value_ptr, &garbage OPLINE_CC EXECUTE_DATA_CC);
+		} else if (prop_info) {
+			variable_ptr = zend_assign_to_typed_property_reference(prop_info, variable_ptr, value_ptr, &garbage EXECUTE_DATA_CC);
 		} else {
-			zend_property_info *prop_info = NULL;
-
-			if (prop_op_type == IS_CONST) {
-				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2);
-			} else {
-				ZVAL_DEREF(container);
-				prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr);
-			}
-
-			if (prop_info) {
-				variable_ptr = zend_assign_to_typed_property_reference(prop_info, variable_ptr, value_ptr, &garbage EXECUTE_DATA_CC);
-			} else {
-				zend_assign_to_variable_reference(variable_ptr, value_ptr, &garbage);
-			}
+			zend_assign_to_variable_reference(variable_ptr, value_ptr, &garbage);
 		}
 	} else if (Z_ISERROR_P(variable_ptr)) {
 		variable_ptr = &EG(uninitialized_zval);
@@ -3560,7 +3532,8 @@ static zend_never_inline void zend_assign_to_property_reference_var_var(zval *co
 		OPLINE_CC EXECUTE_DATA_CC);
 }
 
-static zend_never_inline zend_result zend_fetch_static_property_address_ex(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type OPLINE_DC EXECUTE_DATA_DC) {
+static zend_never_inline zval* zend_fetch_static_property_address_ex(zend_property_info **prop_info, uint32_t cache_slot, int fetch_type OPLINE_DC EXECUTE_DATA_DC) {
+	zval *result;
 	zend_string *name;
 	zend_class_entry *ce;
 	zend_property_info *property_info;
@@ -3576,7 +3549,7 @@ static zend_never_inline zend_result zend_fetch_static_property_address_ex(zval
 			ce = zend_fetch_class_by_name(Z_STR_P(class_name), Z_STR_P(class_name + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
 			if (UNEXPECTED(ce == NULL)) {
 				FREE_OP(op1_type, opline->op1.var);
-				return FAILURE;
+				return NULL;
 			}
 			if (UNEXPECTED(op1_type != IS_CONST)) {
 				CACHE_PTR(cache_slot, ce);
@@ -3587,21 +3560,21 @@ static zend_never_inline zend_result zend_fetch_static_property_address_ex(zval
 			ce = zend_fetch_class(NULL, opline->op2.num);
 			if (UNEXPECTED(ce == NULL)) {
 				FREE_OP(op1_type, opline->op1.var);
-				return FAILURE;
+				return NULL;
 			}
 		} else {
 			ce = Z_CE_P(EX_VAR(opline->op2.var));
 		}
 		if (EXPECTED(op1_type == IS_CONST) && EXPECTED(CACHED_PTR(cache_slot) == ce)) {
-			*retval = CACHED_PTR(cache_slot + sizeof(void *));
+			result = CACHED_PTR(cache_slot + sizeof(void *));
 			*prop_info = CACHED_PTR(cache_slot + sizeof(void *) * 2);
-			return SUCCESS;
+			return result;
 		}
 	}
 
 	if (EXPECTED(op1_type == IS_CONST)) {
 		name = Z_STR_P(RT_CONSTANT(opline, opline->op1));
-		*retval = zend_std_get_static_property_with_info(ce, name, fetch_type, &property_info);
+		result = zend_std_get_static_property_with_info(ce, name, fetch_type, &property_info);
 	} else {
 		zend_string *tmp_name;
 		zval *varname = get_zval_ptr_undef(opline->op1_type, opline->op1, BP_VAR_R);
@@ -3614,62 +3587,109 @@ static zend_never_inline zend_result zend_fetch_static_property_address_ex(zval
 			}
 			name = zval_get_tmp_string(varname, &tmp_name);
 		}
-		*retval = zend_std_get_static_property_with_info(ce, name, fetch_type, &property_info);
+		result = zend_std_get_static_property_with_info(ce, name, fetch_type, &property_info);
 
 		zend_tmp_string_release(tmp_name);
 
 		FREE_OP(op1_type, opline->op1.var);
 	}
 
-	if (UNEXPECTED(*retval == NULL)) {
-		return FAILURE;
+	if (UNEXPECTED(result == NULL)) {
+		return NULL;
 	}
 
 	*prop_info = property_info;
 
 	if (EXPECTED(op1_type == IS_CONST)
 			&& EXPECTED(!(property_info->ce->ce_flags & ZEND_ACC_TRAIT))) {
-		CACHE_POLYMORPHIC_PTR(cache_slot, ce, *retval);
+		CACHE_POLYMORPHIC_PTR(cache_slot, ce, result);
 		CACHE_PTR(cache_slot + sizeof(void *) * 2, property_info);
 	}
 
-	return SUCCESS;
+	return result;
 }
 
 
-static zend_always_inline zend_result zend_fetch_static_property_address(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type, int flags OPLINE_DC EXECUTE_DATA_DC) {
+static zend_always_inline zval* zend_fetch_static_property_address(zend_property_info **prop_info, uint32_t cache_slot, int fetch_type, int flags OPLINE_DC EXECUTE_DATA_DC) {
+	zval *result;
 	zend_property_info *property_info;
 
-	if (opline->op1_type == IS_CONST && (opline->op2_type == IS_CONST || (opline->op2_type == IS_UNUSED && (opline->op2.num == ZEND_FETCH_CLASS_SELF || opline->op2.num == ZEND_FETCH_CLASS_PARENT))) && EXPECTED(CACHED_PTR(cache_slot) != NULL)) {
-		*retval = CACHED_PTR(cache_slot + sizeof(void *));
+	if (opline->op1_type == IS_CONST
+	 && (opline->op2_type == IS_CONST
+	  || (opline->op2_type == IS_UNUSED
+	   && ((opline->op2.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF
+	    || (opline->op2.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT)))
+	 && EXPECTED(CACHED_PTR(cache_slot + sizeof(void *)) != NULL)) {
+		result = CACHED_PTR(cache_slot + sizeof(void *));
 		property_info = CACHED_PTR(cache_slot + sizeof(void *) * 2);
 
 		if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW)
-				&& UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF)
+				&& UNEXPECTED(Z_TYPE_P(result) == IS_UNDEF)
 				&& ZEND_TYPE_IS_SET(property_info->type)) {
 			zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization",
 				ZSTR_VAL(property_info->ce->name),
 				zend_get_unmangled_property_name(property_info->name));
-			return FAILURE;
+			return NULL;
 		}
 	} else {
-		zend_result success;
-		success = zend_fetch_static_property_address_ex(retval, &property_info, cache_slot, fetch_type OPLINE_CC EXECUTE_DATA_CC);
-		if (UNEXPECTED(success != SUCCESS)) {
-			return FAILURE;
+		result = zend_fetch_static_property_address_ex(&property_info, cache_slot, fetch_type OPLINE_CC EXECUTE_DATA_CC);
+		if (UNEXPECTED(!result)) {
+			return NULL;
 		}
 	}
 
 	flags &= ZEND_FETCH_OBJ_FLAGS;
 	if (flags && ZEND_TYPE_IS_SET(property_info->type)) {
-		zend_handle_fetch_obj_flags(NULL, *retval, NULL, property_info, flags);
+		zend_handle_fetch_obj_flags(NULL, result, NULL, property_info, flags);
 	}
 
 	if (prop_info) {
 		*prop_info = property_info;
 	}
 
-	return SUCCESS;
+	return result;
+}
+
+ZEND_API zval* ZEND_FASTCALL zend_fetch_static_property(zend_execute_data *ex, int fetch_type) {
+	zval *result;
+	zend_property_info *property_info;
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+	zend_execute_data *orig_execute_data = execute_data;
+#else
+	zend_execute_data *execute_data;
+#endif
+	execute_data = ex;
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+	const zend_op *orig_opline = opline;
+#else
+	const zend_op *opline;
+#endif
+	opline = execute_data->opline;
+
+	uint32_t cache_slot = opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS;
+	uint32_t flags = 0;
+
+	if (fetch_type == BP_VAR_W) {
+		flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS;
+	}
+	result = zend_fetch_static_property_address_ex(&property_info, cache_slot, fetch_type OPLINE_CC EXECUTE_DATA_CC);
+	if (EXPECTED(result)) {
+		if (flags && ZEND_TYPE_IS_SET(property_info->type)) {
+			zend_handle_fetch_obj_flags(NULL, result, NULL, property_info, flags);
+		}
+	} else {
+		result = &EG(uninitialized_zval);
+	}
+
+#if defined(ZEND_VM_IP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+	EX(opline) = opline;
+	opline = orig_opline;
+#endif
+#if defined(ZEND_VM_FP_GLOBAL_REG) && ((ZEND_VM_KIND == ZEND_VM_KIND_CALL) || (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID))
+	execute_data = orig_execute_data;
+#endif
+
+	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) {
diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h
index 3f59e2b371a13..6a8ae805fc256 100644
--- a/Zend/zend_execute.h
+++ b/Zend/zend_execute.h
@@ -66,6 +66,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_deprecated_class_constant(const zend_
 ZEND_API ZEND_COLD void ZEND_FASTCALL zend_false_to_array_deprecated(void);
 ZEND_COLD void ZEND_FASTCALL zend_param_must_be_ref(const zend_function *func, uint32_t arg_num);
 ZEND_API ZEND_COLD void ZEND_FASTCALL zend_use_resource_as_offset(const zval *dim);
+ZEND_API zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_call_stack_size_error(void);
 
 ZEND_API bool ZEND_FASTCALL zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, bool strict);
 
@@ -434,6 +435,8 @@ ZEND_API void zend_unfinished_calls_gc(zend_execute_data *execute_data, zend_exe
 ZEND_API void zend_cleanup_unfinished_execution(zend_execute_data *execute_data, uint32_t op_num, uint32_t catch_op_num);
 ZEND_API ZEND_ATTRIBUTE_DEPRECATED HashTable *zend_unfinished_execution_gc(zend_execute_data *execute_data, zend_execute_data *call, zend_get_gc_buffer *gc_buffer);
 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 void ZEND_FASTCALL zend_non_static_method_call(const zend_function *fbc);
 
 ZEND_API void zend_frameless_observed_call(zend_execute_data *execute_data);
 
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 21e17fe8c666b..f42479cf745d2 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -813,7 +813,7 @@ zend_result zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_
 		if (fci_cache) {
 			zend_release_fcall_info_cache(fci_cache);
 		}
-		return SUCCESS; /* we would result in an instable executor otherwise */
+		return SUCCESS; /* we would result in an unstable executor otherwise */
 	}
 
 	ZEND_ASSERT(fci->size == sizeof(zend_fcall_info));
diff --git a/Zend/zend_extensions.h b/Zend/zend_extensions.h
index 15aaa14f91513..becd53d7d08bd 100644
--- a/Zend/zend_extensions.h
+++ b/Zend/zend_extensions.h
@@ -44,7 +44,7 @@ You can use the following macro to check the extension API version for compatibi
 
 /* The first number is the engine version and the rest is the date (YYYYMMDD).
  * This way engine 2/3 API no. is always greater than engine 1 API no..  */
-#define ZEND_EXTENSION_API_NO	420230901
+#define ZEND_EXTENSION_API_NO	420240925
 
 typedef struct _zend_extension_version_info {
 	int zend_extension_api_no;
diff --git a/Zend/zend_float.h b/Zend/zend_float.h
index 64ed97400c9ec..63e0f6f7f69b4 100644
--- a/Zend/zend_float.h
+++ b/Zend/zend_float.h
@@ -43,7 +43,7 @@ END_EXTERN_C()
 
    The current macros are currently only used on x86 and x86_64 architectures,
    on every other architecture, these macros expand to NOPs. This assumes that
-   other architectures do not have an internal precision and the operhand types
+   other architectures do not have an internal precision and the operand types
    define the computational precision of floating point operations. This
    assumption may be false, in that case, the author is interested in further
    details on the other platform.
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index 30314a1e48ce6..a966a106def33 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -2261,6 +2261,9 @@ static ZEND_FUNCTION(gc_destructor_fiber)
 
 		if (UNEXPECTED(fiber->flags & ZEND_FIBER_FLAG_DESTROYED)) {
 			/* Fiber is being destroyed by shutdown sequence */
+			if (GC_G(dtor_fiber) == fiber) {
+				GC_G(dtor_fiber) = NULL;
+			}
 			GC_DELREF(&fiber->std);
 			gc_check_possible_root((zend_refcounted*)&fiber->std.gc);
 			return;
diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c
index d600c662f9387..a6ea91a7425b9 100644
--- a/Zend/zend_generators.c
+++ b/Zend/zend_generators.c
@@ -212,43 +212,30 @@ static zend_always_inline void clear_link_to_root(zend_generator *generator) {
 	}
 }
 
-/* In the context of zend_generator_dtor_storage during shutdown, check if
- * the intermediate node 'generator' is running in a fiber */
+/* Check if the node 'generator' is running in a fiber */
 static inline bool check_node_running_in_fiber(zend_generator *generator) {
-	ZEND_ASSERT(EG(flags) & EG_FLAGS_IN_SHUTDOWN);
 	ZEND_ASSERT(generator->execute_data);
 
-	if (generator->flags & ZEND_GENERATOR_IN_FIBER) {
+	if (EXPECTED(generator->flags & ZEND_GENERATOR_IN_FIBER)) {
 		return true;
 	}
 
-	if (generator->node.children == 0) {
+	if (EXPECTED(generator->node.children == 0)) {
 		return false;
 	}
 
-	if (generator->flags & ZEND_GENERATOR_DTOR_VISITED) {
-		return false;
-	}
-	generator->flags |= ZEND_GENERATOR_DTOR_VISITED;
-
 	if (generator->node.children == 1) {
-		if (check_node_running_in_fiber(generator->node.child.single)) {
-			goto in_fiber;
-		}
-		return false;
+		return check_node_running_in_fiber(generator->node.child.single);
 	}
 
 	zend_generator *child;
 	ZEND_HASH_FOREACH_PTR(generator->node.child.ht, child) {
 		if (check_node_running_in_fiber(child)) {
-			goto in_fiber;
+			return true;
 		}
 	} ZEND_HASH_FOREACH_END();
-	return false;
 
-in_fiber:
-	generator->flags |= ZEND_GENERATOR_IN_FIBER;
-	return true;
+	return false;
 }
 
 static void zend_generator_dtor_storage(zend_object *object) /* {{{ */
diff --git a/Zend/zend_generators.h b/Zend/zend_generators.h
index 9e3e534073435..e7b01fb20ad7f 100644
--- a/Zend/zend_generators.h
+++ b/Zend/zend_generators.h
@@ -101,7 +101,6 @@ static const uint8_t ZEND_GENERATOR_FORCED_CLOSE      = 0x2;
 static const uint8_t ZEND_GENERATOR_AT_FIRST_YIELD    = 0x4;
 static const uint8_t ZEND_GENERATOR_DO_INIT           = 0x8;
 static const uint8_t ZEND_GENERATOR_IN_FIBER          = 0x10;
-static const uint8_t ZEND_GENERATOR_DTOR_VISITED      = 0x20;
 
 void zend_register_generator_ce(void);
 ZEND_API void zend_generator_close(zend_generator *generator, bool finished_execution);
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index c954d2fcf415d..46dff9bfd29e0 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -293,7 +293,7 @@ ZEND_API HashTable* ZEND_FASTCALL _zend_new_array(uint32_t nSize)
 	return ht;
 }
 
-ZEND_API HashTable* ZEND_FASTCALL zend_new_pair(zval *val1, zval *val2)
+ZEND_API HashTable* ZEND_FASTCALL zend_new_pair(const zval *val1, const zval *val2)
 {
 	zval *zv;
 	HashTable *ht = emalloc(sizeof(HashTable));
@@ -457,7 +457,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_discard(HashTable *ht, uint32_t nNumUsed)
 	}
 }
 
-static uint32_t zend_array_recalc_elements(HashTable *ht)
+static uint32_t zend_array_recalc_elements(const HashTable *ht)
 {
 	zval *val;
 	uint32_t num = ht->nNumOfElements;
@@ -671,10 +671,10 @@ ZEND_API void ZEND_FASTCALL zend_hash_iterator_del(uint32_t idx)
 	}
 }
 
-static zend_never_inline void ZEND_FASTCALL _zend_hash_iterators_remove(HashTable *ht)
+static zend_never_inline void ZEND_FASTCALL _zend_hash_iterators_remove(const HashTable *ht)
 {
 	HashTableIterator *iter = EG(ht_iterators);
-	HashTableIterator *end  = iter + EG(ht_iterators_used);
+	const HashTableIterator *end = iter + EG(ht_iterators_used);
 
 	while (iter != end) {
 		if (iter->ht == ht) {
@@ -684,17 +684,17 @@ static zend_never_inline void ZEND_FASTCALL _zend_hash_iterators_remove(HashTabl
 	}
 }
 
-static zend_always_inline void zend_hash_iterators_remove(HashTable *ht)
+static zend_always_inline void zend_hash_iterators_remove(const HashTable *ht)
 {
 	if (UNEXPECTED(HT_HAS_ITERATORS(ht))) {
 		_zend_hash_iterators_remove(ht);
 	}
 }
 
-ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(HashTable *ht, HashPosition start)
+ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(const HashTable *ht, HashPosition start)
 {
-	HashTableIterator *iter = EG(ht_iterators);
-	HashTableIterator *end  = iter + EG(ht_iterators_used);
+	const HashTableIterator *iter = EG(ht_iterators);
+	const HashTableIterator *end = iter + EG(ht_iterators_used);
 	HashPosition res = ht->nNumUsed;
 
 	while (iter != end) {
@@ -708,10 +708,10 @@ ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(HashTable *ht,
 	return res;
 }
 
-ZEND_API void ZEND_FASTCALL _zend_hash_iterators_update(HashTable *ht, HashPosition from, HashPosition to)
+ZEND_API void ZEND_FASTCALL _zend_hash_iterators_update(const HashTable *ht, HashPosition from, HashPosition to)
 {
 	HashTableIterator *iter = EG(ht_iterators);
-	HashTableIterator *end  = iter + EG(ht_iterators_used);
+	const HashTableIterator *end = iter + EG(ht_iterators_used);
 
 	while (iter != end) {
 		if (iter->ht == ht && iter->pos == from) {
@@ -721,10 +721,10 @@ ZEND_API void ZEND_FASTCALL _zend_hash_iterators_update(HashTable *ht, HashPosit
 	}
 }
 
-ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosition step)
+ZEND_API void ZEND_FASTCALL zend_hash_iterators_advance(const HashTable *ht, HashPosition step)
 {
 	HashTableIterator *iter = EG(ht_iterators);
-	HashTableIterator *end  = iter + EG(ht_iterators_used);
+	const HashTableIterator *end = iter + EG(ht_iterators_used);
 
 	while (iter != end) {
 		if (iter->ht == ht) {
@@ -1429,11 +1429,11 @@ ZEND_API void ZEND_FASTCALL zend_hash_rehash(HashTable *ht)
 	}
 }
 
-static zend_always_inline void zend_hash_iterators_clamp_max(HashTable *ht, uint32_t max)
+static zend_always_inline void zend_hash_iterators_clamp_max(const HashTable *ht, uint32_t max)
 {
 	if (UNEXPECTED(HT_HAS_ITERATORS(ht))) {
 		HashTableIterator *iter = EG(ht_iterators);
-		HashTableIterator *end  = iter + EG(ht_iterators_used);
+		const HashTableIterator *end = iter + EG(ht_iterators_used);
 		while (iter != end) {
 			if (iter->ht == ht) {
 				iter->pos = MIN(iter->pos, max);
@@ -2237,7 +2237,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_reverse_apply(HashTable *ht, apply_func_t
 }
 
 
-ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor)
+ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, const HashTable *source, copy_ctor_func_t pCopyConstructor)
 {
 	uint32_t idx;
 	zval *new_entry, *data;
@@ -2284,7 +2284,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source,
 }
 
 
-static zend_always_inline bool zend_array_dup_value(HashTable *source, HashTable *target, zval *data, zval *dest, bool packed, bool with_holes)
+static zend_always_inline bool zend_array_dup_value(const HashTable *source, zval *data, zval *dest, bool packed, bool with_holes)
 {
 	if (with_holes) {
 		if (!packed && Z_TYPE_INFO_P(data) == IS_INDIRECT) {
@@ -2321,9 +2321,9 @@ static zend_always_inline bool zend_array_dup_value(HashTable *source, HashTable
 	return 1;
 }
 
-static zend_always_inline bool zend_array_dup_element(HashTable *source, HashTable *target, uint32_t idx, Bucket *p, Bucket *q, bool packed, bool static_keys, bool with_holes)
+static zend_always_inline bool zend_array_dup_element(const HashTable *source, HashTable *target, uint32_t idx, Bucket *p, Bucket *q, bool packed, bool static_keys, bool with_holes)
 {
-	if (!zend_array_dup_value(source, target, &p->val, &q->val, packed, with_holes)) {
+	if (!zend_array_dup_value(source, &p->val, &q->val, packed, with_holes)) {
 		return 0;
 	}
 
@@ -2344,29 +2344,32 @@ static zend_always_inline bool zend_array_dup_element(HashTable *source, HashTab
 }
 
 // We need to duplicate iterators to be able to search through all copy-on-write copies to find the actually iterated HashTable and position back
-static void zend_array_dup_ht_iterators(HashTable *source, HashTable *target) {
-	HashTableIterator *iter = EG(ht_iterators);
-	HashTableIterator *end  = iter + EG(ht_iterators_used);
+static void zend_array_dup_ht_iterators(const HashTable *source, HashTable *target) {
+	uint32_t iter_index = 0;
+	uint32_t end_index = EG(ht_iterators_used);
 
-	while (iter != end) {
+	while (iter_index != end_index) {
+		HashTableIterator *iter = &EG(ht_iterators)[iter_index];
 		if (iter->ht == source) {
 			uint32_t copy_idx = zend_hash_iterator_add(target, iter->pos);
+			/* Refetch iter because the memory may be reallocated. */
+			iter = &EG(ht_iterators)[iter_index];
 			HashTableIterator *copy_iter = EG(ht_iterators) + copy_idx;
 			copy_iter->next_copy = iter->next_copy;
 			iter->next_copy = copy_idx;
 		}
-		iter++;
+		iter_index++;
 	}
 }
 
-static zend_always_inline void zend_array_dup_packed_elements(HashTable *source, HashTable *target, bool with_holes)
+static zend_always_inline void zend_array_dup_packed_elements(const HashTable *source, HashTable *target, bool with_holes)
 {
 	zval *p = source->arPacked;
 	zval *q = target->arPacked;
-	zval *end = p + source->nNumUsed;
+	const zval *end = p + source->nNumUsed;
 
 	do {
-		if (!zend_array_dup_value(source, target, p, q, 1, with_holes)) {
+		if (!zend_array_dup_value(source, p, q, 1, with_holes)) {
 			if (with_holes) {
 				ZVAL_UNDEF(q);
 			}
@@ -2379,12 +2382,12 @@ static zend_always_inline void zend_array_dup_packed_elements(HashTable *source,
 	}
 }
 
-static zend_always_inline uint32_t zend_array_dup_elements(HashTable *source, HashTable *target, bool static_keys, bool with_holes)
+static zend_always_inline uint32_t zend_array_dup_elements(const HashTable *source, HashTable *target, bool static_keys, bool with_holes)
 {
 	uint32_t idx = 0;
 	Bucket *p = source->arData;
 	Bucket *q = target->arData;
-	Bucket *end = p + source->nNumUsed;
+	const Bucket *end = p + source->nNumUsed;
 
 	if (UNEXPECTED(HT_HAS_ITERATORS(source))) {
 		zend_array_dup_ht_iterators(source, target);
@@ -2432,7 +2435,7 @@ static zend_always_inline uint32_t zend_array_dup_elements(HashTable *source, Ha
 	return idx;
 }
 
-ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
+ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(const HashTable *source)
 {
 	uint32_t idx;
 	HashTable *target;
@@ -2520,7 +2523,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
 	return target;
 }
 
-ZEND_API HashTable* zend_array_to_list(HashTable *source)
+ZEND_API HashTable* zend_array_to_list(const HashTable *source)
 {
 	HashTable *result = _zend_new_array(zend_hash_num_elements(source));
 	zend_hash_real_init_packed(result);
@@ -2541,7 +2544,7 @@ ZEND_API HashTable* zend_array_to_list(HashTable *source)
 }
 
 
-ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite)
+ZEND_API void ZEND_FASTCALL zend_hash_merge(HashTable *target, const HashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite)
 {
 	uint32_t idx;
 	Bucket *p;
@@ -2637,7 +2640,7 @@ static bool ZEND_FASTCALL zend_hash_replace_checker_wrapper(HashTable *target, z
 }
 
 
-ZEND_API void ZEND_FASTCALL zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam)
+ZEND_API void ZEND_FASTCALL zend_hash_merge_ex(HashTable *target, const HashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam)
 {
 	uint32_t idx;
 	Bucket *p;
@@ -2727,7 +2730,7 @@ ZEND_API zval* ZEND_FASTCALL _zend_hash_index_find(const HashTable *ht, zend_ulo
 	return p ? &p->val : NULL;
 }
 
-ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos)
+ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(const HashTable *ht, HashPosition *pos)
 {
 	IS_CONSISTENT(ht);
 	HT_ASSERT(ht, &ht->nInternalPointer != pos || GC_REFCOUNT(ht) == 1);
@@ -2738,7 +2741,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, H
 /* This function will be extremely optimized by remembering
  * the end of the list
  */
-ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos)
+ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(const HashTable *ht, HashPosition *pos)
 {
 	uint32_t idx;
 
@@ -2767,7 +2770,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, Has
 }
 
 
-ZEND_API zend_result ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos)
+ZEND_API zend_result ZEND_FASTCALL zend_hash_move_forward_ex(const HashTable *ht, HashPosition *pos)
 {
 	uint32_t idx;
 
@@ -2806,7 +2809,7 @@ ZEND_API zend_result ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, Hash
 	}
 }
 
-ZEND_API zend_result ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos)
+ZEND_API zend_result ZEND_FASTCALL zend_hash_move_backwards_ex(const HashTable *ht, HashPosition *pos)
 {
 	uint32_t idx = *pos;
 
@@ -2887,7 +2890,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_get_current_key_zval_ex(const HashTable *h
 	}
 }
 
-ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos)
+ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_type_ex(const HashTable *ht, const HashPosition *pos)
 {
 	uint32_t idx;
 	Bucket *p;
@@ -2909,7 +2912,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_get_current_key_type_ex(HashTable *ht, Hash
 }
 
 
-ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(HashTable *ht, HashPosition *pos)
+ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(const HashTable *ht, const HashPosition *pos)
 {
 	uint32_t idx;
 	Bucket *p;
@@ -3063,7 +3066,7 @@ ZEND_API void ZEND_FASTCALL zend_hash_sort_ex(HashTable *ht, sort_func_t sort, b
 	}
 }
 
-static zend_always_inline int zend_hash_compare_impl(HashTable *ht1, HashTable *ht2, compare_func_t compar, bool ordered) {
+static zend_always_inline int zend_hash_compare_impl(const HashTable *ht1, const HashTable *ht2, compare_func_t compar, bool ordered) {
 	uint32_t idx1, idx2;
 	zend_string *key1, *key2;
 	zend_ulong h1, h2;
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 3115bb9929d9e..58a2537ff845c 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -248,16 +248,16 @@ static zend_always_inline bool zend_hash_index_exists(const HashTable *ht, zend_
 ZEND_API HashPosition ZEND_FASTCALL zend_hash_get_current_pos_ex(const HashTable *ht, HashPosition pos);
 ZEND_API HashPosition ZEND_FASTCALL zend_hash_get_current_pos(const HashTable *ht);
 
-ZEND_API zend_result   ZEND_FASTCALL zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos);
-ZEND_API zend_result   ZEND_FASTCALL zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos);
+ZEND_API zend_result   ZEND_FASTCALL zend_hash_move_forward_ex(const HashTable *ht, HashPosition *pos);
+ZEND_API zend_result   ZEND_FASTCALL zend_hash_move_backwards_ex(const HashTable *ht, HashPosition *pos);
 ZEND_API int   ZEND_FASTCALL zend_hash_get_current_key_ex(const HashTable *ht, zend_string **str_index, zend_ulong *num_index, const HashPosition *pos);
 ZEND_API void  ZEND_FASTCALL zend_hash_get_current_key_zval_ex(const HashTable *ht, zval *key, const HashPosition *pos);
-ZEND_API int   ZEND_FASTCALL zend_hash_get_current_key_type_ex(HashTable *ht, HashPosition *pos);
-ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(HashTable *ht, HashPosition *pos);
-ZEND_API void  ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos);
-ZEND_API void  ZEND_FASTCALL zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos);
+ZEND_API int   ZEND_FASTCALL zend_hash_get_current_key_type_ex(const HashTable *ht, const HashPosition *pos);
+ZEND_API zval* ZEND_FASTCALL zend_hash_get_current_data_ex(const HashTable *ht, const HashPosition *pos);
+ZEND_API void  ZEND_FASTCALL zend_hash_internal_pointer_reset_ex(const HashTable *ht, HashPosition *pos);
+ZEND_API void  ZEND_FASTCALL zend_hash_internal_pointer_end_ex(const HashTable *ht, HashPosition *pos);
 
-static zend_always_inline zend_result zend_hash_has_more_elements_ex(HashTable *ht, HashPosition *pos) {
+static zend_always_inline zend_result zend_hash_has_more_elements_ex(const HashTable *ht, const HashPosition *pos) {
 	return (zend_hash_get_current_key_type_ex(ht, pos) == HASH_KEY_NON_EXISTENT ? FAILURE : SUCCESS);
 }
 static zend_always_inline zend_result zend_hash_has_more_elements(HashTable *ht) {
@@ -275,10 +275,10 @@ static zend_always_inline int zend_hash_get_current_key(const HashTable *ht, zen
 static zend_always_inline void zend_hash_get_current_key_zval(const HashTable *ht, zval *key) {
 	zend_hash_get_current_key_zval_ex(ht, key, &ht->nInternalPointer);
 }
-static zend_always_inline int zend_hash_get_current_key_type(HashTable *ht) {
+static zend_always_inline int zend_hash_get_current_key_type(const HashTable *ht) {
 	return zend_hash_get_current_key_type_ex(ht, &ht->nInternalPointer);
 }
-static zend_always_inline zval* zend_hash_get_current_data(HashTable *ht) {
+static zend_always_inline zval* zend_hash_get_current_data(const HashTable *ht) {
 	return zend_hash_get_current_data_ex(ht, &ht->nInternalPointer);
 }
 static zend_always_inline void zend_hash_internal_pointer_reset(HashTable *ht) {
@@ -289,9 +289,9 @@ static zend_always_inline void zend_hash_internal_pointer_end(HashTable *ht) {
 }
 
 /* Copying, merging and sorting */
-ZEND_API void  ZEND_FASTCALL zend_hash_copy(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor);
-ZEND_API void  ZEND_FASTCALL zend_hash_merge(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite);
-ZEND_API void  ZEND_FASTCALL zend_hash_merge_ex(HashTable *target, HashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam);
+ZEND_API void  ZEND_FASTCALL zend_hash_copy(HashTable *target, const HashTable *source, copy_ctor_func_t pCopyConstructor);
+ZEND_API void  ZEND_FASTCALL zend_hash_merge(HashTable *target, const HashTable *source, copy_ctor_func_t pCopyConstructor, bool overwrite);
+ZEND_API void  ZEND_FASTCALL zend_hash_merge_ex(HashTable *target, const HashTable *source, copy_ctor_func_t pCopyConstructor, merge_checker_func_t pMergeSource, void *pParam);
 ZEND_API void  zend_hash_bucket_swap(Bucket *p, Bucket *q);
 ZEND_API void  zend_hash_bucket_renum_swap(Bucket *p, Bucket *q);
 ZEND_API void  zend_hash_bucket_packed_swap(Bucket *p, Bucket *q);
@@ -333,11 +333,11 @@ ZEND_API void ZEND_FASTCALL zend_hash_rehash(HashTable *ht);
 
 ZEND_API HashTable* ZEND_FASTCALL _zend_new_array_0(void);
 ZEND_API HashTable* ZEND_FASTCALL _zend_new_array(uint32_t size);
-ZEND_API HashTable* ZEND_FASTCALL zend_new_pair(zval *val1, zval *val2);
+ZEND_API HashTable* ZEND_FASTCALL zend_new_pair(const zval *val1, const zval *val2);
 ZEND_API uint32_t zend_array_count(HashTable *ht);
-ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source);
+ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(const HashTable *source);
 ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht);
-ZEND_API HashTable* zend_array_to_list(HashTable *source);
+ZEND_API HashTable* zend_array_to_list(const HashTable *source);
 ZEND_API void ZEND_FASTCALL zend_symtable_clean(HashTable *ht);
 ZEND_API HashTable* ZEND_FASTCALL zend_symtable_to_proptable(HashTable *ht);
 ZEND_API HashTable* ZEND_FASTCALL zend_proptable_to_symtable(HashTable *ht, bool always_duplicate);
@@ -348,11 +348,11 @@ ZEND_API uint32_t     ZEND_FASTCALL zend_hash_iterator_add(HashTable *ht, HashPo
 ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos(uint32_t idx, HashTable *ht);
 ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterator_pos_ex(uint32_t idx, zval *array);
 ZEND_API void         ZEND_FASTCALL zend_hash_iterator_del(uint32_t idx);
-ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(HashTable *ht, HashPosition start);
-ZEND_API void         ZEND_FASTCALL _zend_hash_iterators_update(HashTable *ht, HashPosition from, HashPosition to);
-ZEND_API void         ZEND_FASTCALL zend_hash_iterators_advance(HashTable *ht, HashPosition step);
+ZEND_API HashPosition ZEND_FASTCALL zend_hash_iterators_lower_pos(const HashTable *ht, HashPosition start);
+ZEND_API void         ZEND_FASTCALL _zend_hash_iterators_update(const HashTable *ht, HashPosition from, HashPosition to);
+ZEND_API void         ZEND_FASTCALL zend_hash_iterators_advance(const HashTable *ht, HashPosition step);
 
-static zend_always_inline void zend_hash_iterators_update(HashTable *ht, HashPosition from, HashPosition to)
+static zend_always_inline void zend_hash_iterators_update(const HashTable *ht, HashPosition from, HashPosition to)
 {
 	if (UNEXPECTED(HT_HAS_ITERATORS(ht))) {
 		_zend_hash_iterators_update(ht, from, to);
@@ -903,6 +903,8 @@ static zend_always_inline void *zend_hash_str_find_ptr(const HashTable *ht, cons
 	}
 }
 
+BEGIN_EXTERN_C()
+
 /* Will lowercase the str; use only if you don't need the lowercased string for
  * anything else. If you have a lowered string, use zend_hash_str_find_ptr. */
 ZEND_API void *zend_hash_str_find_ptr_lc(const HashTable *ht, const char *str, size_t len);
@@ -911,6 +913,8 @@ ZEND_API void *zend_hash_str_find_ptr_lc(const HashTable *ht, const char *str, s
  * anything else. If you have a lowered string, use zend_hash_find_ptr. */
 ZEND_API void *zend_hash_find_ptr_lc(const HashTable *ht, zend_string *key);
 
+END_EXTERN_C()
+
 static zend_always_inline void *zend_hash_index_find_ptr(const HashTable *ht, zend_ulong h)
 {
 	zval *zv;
@@ -1572,7 +1576,7 @@ static zend_always_inline void *zend_hash_get_current_data_ptr_ex(HashTable *ht,
 	} while (0)
 
 /* Check if an array is a list */
-static zend_always_inline bool zend_array_is_list(zend_array *array)
+static zend_always_inline bool zend_array_is_list(const zend_array *array)
 {
 	zend_ulong expected_idx = 0;
 	zend_ulong num_idx;
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index 732eb141eb271..16af5f0ac61a9 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -95,7 +95,7 @@ static void zend_type_copy_ctor(zend_type *const type, bool use_arena, bool pers
 	}
 }
 
-static zend_function *zend_duplicate_internal_function(zend_function *func, zend_class_entry *ce) /* {{{ */
+static zend_function *zend_duplicate_internal_function(zend_function *func, const zend_class_entry *ce) /* {{{ */
 {
 	zend_function *new_function;
 
@@ -114,7 +114,7 @@ static zend_function *zend_duplicate_internal_function(zend_function *func, zend
 }
 /* }}} */
 
-static zend_always_inline zend_function *zend_duplicate_function(zend_function *func, zend_class_entry *ce) /* {{{ */
+static zend_always_inline zend_function *zend_duplicate_function(zend_function *func, const zend_class_entry *ce) /* {{{ */
 {
 	if (UNEXPECTED(func->type == ZEND_INTERNAL_FUNCTION)) {
 		return zend_duplicate_internal_function(func, ce);
@@ -239,7 +239,7 @@ static zend_string *resolve_class_name(zend_class_entry *scope, zend_string *nam
 	}
 }
 
-static bool class_visible(zend_class_entry *ce) {
+static bool class_visible(const zend_class_entry *ce) {
 	if (ce->type == ZEND_INTERNAL_CLASS) {
 		return !(CG(compiler_options) & ZEND_COMPILE_IGNORE_INTERNAL_CLASSES);
 	} else {
@@ -309,7 +309,7 @@ static zend_class_entry *lookup_class(zend_class_entry *scope, zend_string *name
 }
 
 /* Instanceof that's safe to use on unlinked classes. */
-static bool unlinked_instanceof(zend_class_entry *ce1, zend_class_entry *ce2) {
+static bool unlinked_instanceof(zend_class_entry *ce1, const zend_class_entry *ce2) {
 	if (ce1 == ce2) {
 		return 1;
 	}
@@ -874,7 +874,7 @@ static inheritance_status zend_do_perform_implementation_check(
 /* }}} */
 
 static ZEND_COLD void zend_append_type_hint(
-		smart_str *str, zend_class_entry *scope, zend_arg_info *arg_info, bool return_hint) /* {{{ */
+		smart_str *str, zend_class_entry *scope, const zend_arg_info *arg_info, bool return_hint) /* {{{ */
 {
 	if (ZEND_TYPE_IS_SET(arg_info->type)) {
 		zend_string *type_str = zend_type_to_string_resolved(arg_info->type, scope);
@@ -1041,7 +1041,7 @@ static void ZEND_COLD emit_incompatible_method_error(
 	if (status == INHERITANCE_UNRESOLVED) {
 		// TODO Improve error message if first unresolved class is present in child and parent?
 		/* Fetch the first unresolved class from registered autoloads */
-		zend_string *unresolved_class = NULL;
+		const zend_string *unresolved_class = NULL;
 		ZEND_HASH_MAP_FOREACH_STR_KEY(CG(delayed_autoloads), unresolved_class) {
 			break;
 		} ZEND_HASH_FOREACH_END();
@@ -1051,7 +1051,7 @@ static void ZEND_COLD emit_incompatible_method_error(
 			"Could not check compatibility between %s and %s, because class %s is not available",
 			ZSTR_VAL(child_prototype), ZSTR_VAL(parent_prototype), ZSTR_VAL(unresolved_class));
 	} else if (status == INHERITANCE_WARNING) {
-		zend_attribute *return_type_will_change_attribute = zend_get_attribute_str(
+		const zend_attribute *return_type_will_change_attribute = zend_get_attribute_str(
 			child->common.attributes,
 			"returntypewillchange",
 			sizeof("returntypewillchange")-1
@@ -1407,7 +1407,7 @@ static void inherit_property_hook(
 	 * compiler (variadic and by-ref args, etc). */
 }
 
-static prop_variance prop_get_variance(zend_property_info *prop_info) {
+static prop_variance prop_get_variance(const zend_property_info *prop_info) {
 	bool unbacked = prop_info->flags & ZEND_ACC_VIRTUAL;
 	if (unbacked && prop_info->hooks) {
 		if (!prop_info->hooks[ZEND_PROPERTY_HOOK_SET]) {
@@ -1757,7 +1757,12 @@ ZEND_API void zend_do_inheritance_ex(zend_class_entry *ce, zend_class_entry *par
 		if (UNEXPECTED(!(parent_ce->ce_flags & ZEND_ACC_INTERFACE))) {
 			zend_error_noreturn(E_COMPILE_ERROR, "Interface %s cannot extend class %s", ZSTR_VAL(ce->name), ZSTR_VAL(parent_ce->name));
 		}
-	} else if (UNEXPECTED(parent_ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_FINAL))) {
+	} else if (UNEXPECTED(parent_ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_FINAL|ZEND_ACC_ENUM))) {
+		/* Class must not extend an enum (GH-16315); check enums first since
+		 * enums are implemented as final classes */
+		if (parent_ce->ce_flags & ZEND_ACC_ENUM) {
+			zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend enum %s", ZSTR_VAL(ce->name), ZSTR_VAL(parent_ce->name));
+		}
 		/* Class must not extend a final class */
 		if (parent_ce->ce_flags & ZEND_ACC_FINAL) {
 			zend_error_noreturn(E_COMPILE_ERROR, "Class %s cannot extend final class %s", ZSTR_VAL(ce->name), ZSTR_VAL(parent_ce->name));
@@ -2649,7 +2654,7 @@ static void zend_do_traits_method_binding(zend_class_entry *ce, zend_class_entry
 }
 /* }}} */
 
-static zend_class_entry* find_first_constant_definition(zend_class_entry *ce, zend_class_entry **traits, size_t current_trait, zend_string *constant_name, zend_class_entry *colliding_ce) /* {{{ */
+static const zend_class_entry* find_first_constant_definition(const zend_class_entry *ce, zend_class_entry **traits, size_t current_trait, zend_string *constant_name, const zend_class_entry *colliding_ce) /* {{{ */
 {
 	/* This function is used to show the place of the existing conflicting
 	 * definition in error messages when conflicts occur. Since trait constants
@@ -2674,7 +2679,7 @@ static zend_class_entry* find_first_constant_definition(zend_class_entry *ce, ze
 /* }}} */
 
 static void emit_incompatible_trait_constant_error(
-	zend_class_entry *ce, zend_class_constant *existing_constant, zend_class_constant *trait_constant, zend_string *name,
+	const zend_class_entry *ce, const zend_class_constant *existing_constant, const zend_class_constant *trait_constant, zend_string *name,
 	zend_class_entry **traits, size_t current_trait
 ) {
 	zend_error_noreturn(E_COMPILE_ERROR,
@@ -2770,7 +2775,7 @@ static void zend_do_traits_constant_binding(zend_class_entry *ce, zend_class_ent
 }
 /* }}} */
 
-static zend_class_entry* find_first_property_definition(zend_class_entry *ce, zend_class_entry **traits, size_t current_trait, zend_string *prop_name, zend_class_entry *colliding_ce) /* {{{ */
+static const zend_class_entry* find_first_property_definition(const zend_class_entry *ce, zend_class_entry **traits, size_t current_trait, zend_string *prop_name, const zend_class_entry *colliding_ce) /* {{{ */
 {
 	size_t i;
 
@@ -2791,7 +2796,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent
 {
 	size_t i;
 	zend_property_info *property_info;
-	zend_property_info *colliding_prop;
+	const zend_property_info *colliding_prop;
 	zend_property_info *new_prop;
 	zend_string* prop_name;
 	zval* prop_value;
@@ -2963,11 +2968,11 @@ static void zend_do_bind_traits(zend_class_entry *ce, zend_class_entry **traits)
 	ai.afn[idx] && ai.afn[idx + 1] ? ", " : (ai.afn[idx] && ai.cnt > MAX_ABSTRACT_INFO_CNT ? ", ..." : "")
 
 typedef struct _zend_abstract_info {
-	zend_function *afn[MAX_ABSTRACT_INFO_CNT + 1];
+	const zend_function *afn[MAX_ABSTRACT_INFO_CNT + 1];
 	int cnt;
 } zend_abstract_info;
 
-static void zend_verify_abstract_class_function(zend_function *fn, zend_abstract_info *ai) /* {{{ */
+static void zend_verify_abstract_class_function(const zend_function *fn, zend_abstract_info *ai) /* {{{ */
 {
 	if (ai->cnt < MAX_ABSTRACT_INFO_CNT) {
 		ai->afn[ai->cnt] = fn;
@@ -2978,10 +2983,10 @@ static void zend_verify_abstract_class_function(zend_function *fn, zend_abstract
 
 void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */
 {
-	zend_function *func;
+	const zend_function *func;
 	zend_abstract_info ai;
 	bool is_explicit_abstract = (ce->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) != 0;
-	bool can_be_abstract = (ce->ce_flags & ZEND_ACC_ENUM) == 0;
+	bool can_be_abstract = (ce->ce_flags & (ZEND_ACC_ENUM|ZEND_ACC_ANON_CLASS)) == 0;
 	memset(&ai, 0, sizeof(ai));
 
 	ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, func) {
@@ -2995,11 +3000,11 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */
 	} ZEND_HASH_FOREACH_END();
 
 	if (!is_explicit_abstract) {
-		zend_property_info *prop_info;
+		const zend_property_info *prop_info;
 		ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop_info) {
 			if (prop_info->hooks) {
 				for (uint32_t i = 0; i < ZEND_PROPERTY_HOOK_COUNT; i++) {
-					zend_function *fn = prop_info->hooks[i];
+					const zend_function *fn = prop_info->hooks[i];
 					if (fn && (fn->common.fn_flags & ZEND_ACC_ABSTRACT)) {
 						zend_verify_abstract_class_function(fn, &ai);
 					}
@@ -3009,16 +3014,28 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */
 	}
 
 	if (ai.cnt) {
-		zend_error_noreturn(E_ERROR, !is_explicit_abstract && can_be_abstract
-			? "%s %s contains %d abstract method%s and must therefore be declared abstract or implement the remaining methods (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")"
-			: "%s %s must implement %d abstract private method%s (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")",
-			zend_get_object_type_uc(ce),
-			ZSTR_VAL(ce->name), ai.cnt,
-			ai.cnt > 1 ? "s" : "",
-			DISPLAY_ABSTRACT_FN(0),
-			DISPLAY_ABSTRACT_FN(1),
-			DISPLAY_ABSTRACT_FN(2)
+		if (!is_explicit_abstract && can_be_abstract) {
+			zend_error_noreturn(E_ERROR,
+				"%s %s contains %d abstract method%s and must therefore be declared abstract or implement the remaining method%s (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")",
+				zend_get_object_type_uc(ce),
+				ZSTR_VAL(ce->name), ai.cnt,
+				ai.cnt > 1 ? "s" : "",
+				ai.cnt > 1 ? "s" : "",
+				DISPLAY_ABSTRACT_FN(0),
+				DISPLAY_ABSTRACT_FN(1),
+				DISPLAY_ABSTRACT_FN(2)
 			);
+		} else {
+			zend_error_noreturn(E_ERROR,
+				"%s %s must implement %d abstract method%s (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")",
+				zend_get_object_type_uc(ce),
+				ZSTR_VAL(ce->name), ai.cnt,
+				ai.cnt > 1 ? "s" : "",
+				DISPLAY_ABSTRACT_FN(0),
+				DISPLAY_ABSTRACT_FN(1),
+				DISPLAY_ABSTRACT_FN(2)
+			);
+		}
 	} else {
 		/* now everything should be fine and an added ZEND_ACC_IMPLICIT_ABSTRACT_CLASS should be removed */
 		ce->ce_flags &= ~ZEND_ACC_IMPLICIT_ABSTRACT_CLASS;
@@ -3245,7 +3262,7 @@ static void resolve_delayed_variance_obligations(zend_class_entry *ce) {
 	zend_hash_index_del(all_obligations, num_key);
 }
 
-static void check_unrecoverable_load_failure(zend_class_entry *ce) {
+static void check_unrecoverable_load_failure(const zend_class_entry *ce) {
 	/* If this class has been used while unlinked through a variance obligation, it is not legal
 	 * to remove the class from the class table and throw an exception, because there is already
 	 * a dependence on the inheritance hierarchy of this specific class. Instead we fall back to
@@ -3264,7 +3281,7 @@ static void check_unrecoverable_load_failure(zend_class_entry *ce) {
 	} while (0)
 
 static zend_op_array *zend_lazy_method_load(
-		zend_op_array *op_array, zend_class_entry *ce, zend_class_entry *pce) {
+		zend_op_array *op_array, zend_class_entry *ce, const zend_class_entry *pce) {
 	ZEND_ASSERT(op_array->type == ZEND_USER_FUNCTION);
 	ZEND_ASSERT(op_array->scope == pce);
 	ZEND_ASSERT(op_array->prototype == NULL);
@@ -3585,7 +3602,7 @@ ZEND_API zend_class_entry *zend_do_link_class(zend_class_entry *ce, zend_string
 			zend_verify_enum(ce);
 		}
 		if (ce->num_hooked_prop_variance_checks) {
-			zend_property_info *prop_info;
+			const zend_property_info *prop_info;
 			ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop_info) {
 				if (prop_info->ce == ce && prop_info->hooks && prop_info->hooks[ZEND_PROPERTY_HOOK_SET]) {
 					switch (zend_verify_property_hook_variance(prop_info, prop_info->hooks[ZEND_PROPERTY_HOOK_SET])) {
@@ -3690,8 +3707,8 @@ static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_e
 {
 	zend_string *key;
 	zend_function *parent_func;
-	zend_property_info *parent_info;
-	zend_class_constant *parent_const;
+	const zend_property_info *parent_info;
+	const zend_class_constant *parent_const;
 	inheritance_status overall_status = INHERITANCE_SUCCESS;
 
 	ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, parent_func) {
@@ -3713,14 +3730,14 @@ static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_e
 	} ZEND_HASH_FOREACH_END();
 
 	ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&parent_ce->properties_info, key, parent_info) {
-		zval *zv;
+		const zval *zv;
 		if ((parent_info->flags & ZEND_ACC_PRIVATE) || !ZEND_TYPE_IS_SET(parent_info->type)) {
 			continue;
 		}
 
 		zv = zend_hash_find_known_hash(&ce->properties_info, key);
 		if (zv) {
-			zend_property_info *child_info = Z_PTR_P(zv);
+			const zend_property_info *child_info = Z_PTR_P(zv);
 			if (ZEND_TYPE_IS_SET(child_info->type)) {
 				inheritance_status status = verify_property_type_compatibility(parent_info, child_info, prop_get_variance(parent_info), false, false);
 				if (UNEXPECTED(status != INHERITANCE_SUCCESS)) {
@@ -3731,14 +3748,14 @@ static inheritance_status zend_can_early_bind(zend_class_entry *ce, zend_class_e
 	} ZEND_HASH_FOREACH_END();
 
 	ZEND_HASH_MAP_FOREACH_STR_KEY_PTR(&parent_ce->constants_table, key, parent_const) {
-		zval *zv;
+		const zval *zv;
 		if ((ZEND_CLASS_CONST_FLAGS(parent_const) & ZEND_ACC_PRIVATE) || !ZEND_TYPE_IS_SET(parent_const->type)) {
 			continue;
 		}
 
 		zv = zend_hash_find_known_hash(&ce->constants_table, key);
 		if (zv) {
-			zend_class_constant *child_const = Z_PTR_P(zv);
+			const zend_class_constant *child_const = Z_PTR_P(zv);
 			if (ZEND_TYPE_IS_SET(child_const->type)) {
 				inheritance_status status = class_constant_types_compatible(parent_const, child_const);
 				ZEND_ASSERT(status != INHERITANCE_WARNING);
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index f3fb4151a5830..c0127feabbf68 100644
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -478,6 +478,10 @@ static int zend_implement_serializable(zend_class_entry *interface, zend_class_e
 	if (!(class_type->ce_flags & ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)
 			&& (!class_type->__serialize || !class_type->__unserialize)) {
 		zend_error(E_DEPRECATED, "%s implements the Serializable interface, which is deprecated. Implement __serialize() and __unserialize() instead (or in addition, if support for old PHP versions is necessary)", ZSTR_VAL(class_type->name));
+		if (EG(exception)) {
+			zend_exception_uncaught_error(
+				"During inheritance of %s, while implementing Serializable", ZSTR_VAL(class_type->name));
+		}
 	}
 	return SUCCESS;
 }
diff --git a/Zend/zend_lazy_objects.c b/Zend/zend_lazy_objects.c
index 357150bc63876..94be396f580f8 100644
--- a/Zend/zend_lazy_objects.c
+++ b/Zend/zend_lazy_objects.c
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* Lazy objects are standard zend_object whose initialization is defered until
+/* Lazy objects are standard zend_object whose initialization is deferred until
  * one of their properties backing store is accessed for the first time.
  *
  * This is implemented by using the same fallback mechanism as __get and __set
@@ -199,6 +199,27 @@ ZEND_API bool zend_class_can_be_lazy(zend_class_entry *ce)
 	return true;
 }
 
+static int zlo_hash_remove_dyn_props_func(zval *pDest)
+{
+	if (Z_TYPE_P(pDest) == IS_INDIRECT) {
+		return ZEND_HASH_APPLY_STOP;
+	}
+
+	return ZEND_HASH_APPLY_REMOVE;
+}
+
+static bool zlo_is_iterating(zend_object *object)
+{
+	if (object->properties && HT_ITERATORS_COUNT(object->properties)) {
+		return true;
+	}
+	if (zend_object_is_lazy_proxy(object)
+			&& zend_lazy_object_initialized(object)) {
+		return zlo_is_iterating(zend_lazy_object_get_instance(object));
+	}
+	return false;
+}
+
 /* Make object 'obj' lazy. If 'obj' is NULL, create a lazy instance of
  * class 'reflection_ce' */
 ZEND_API zend_object *zend_object_make_lazy(zend_object *obj,
@@ -251,6 +272,10 @@ ZEND_API zend_object *zend_object_make_lazy(zend_object *obj,
 			}
 		}
 	} else {
+		if (zlo_is_iterating(obj)) {
+			zend_throw_error(NULL, "Can not reset an object during property iteration");
+			return NULL;
+		}
 		if (zend_object_is_lazy(obj)) {
 			ZEND_ASSERT(zend_object_is_lazy_proxy(obj) && zend_lazy_object_initialized(obj));
 			OBJ_EXTRA_FLAGS(obj) &= ~(IS_OBJ_LAZY_UNINITIALIZED|IS_OBJ_LAZY_PROXY);
@@ -278,9 +303,17 @@ ZEND_API zend_object *zend_object_make_lazy(zend_object *obj,
 
 		GC_DEL_FLAGS(obj, IS_OBJ_DESTRUCTOR_CALLED);
 
-		/* unset() dynamic properties */
-		zend_object_dtor_dynamic_properties(obj);
-		obj->properties = NULL;
+		/* unset() dynamic properties. Do not NULL out obj->properties, as this
+		 * would be unexpected. */
+		if (obj->properties) {
+			if (UNEXPECTED(GC_REFCOUNT(obj->properties) > 1)) {
+				if (EXPECTED(!(GC_FLAGS(obj->properties) & IS_ARRAY_IMMUTABLE))) {
+					GC_DELREF(obj->properties);
+				}
+				obj->properties = zend_array_dup(obj->properties);
+			}
+			zend_hash_reverse_apply(obj->properties, zlo_hash_remove_dyn_props_func);
+		}
 
 		/* unset() declared properties */
 		for (int i = 0; i < reflection_ce->default_properties_count; i++) {
@@ -303,7 +336,7 @@ ZEND_API zend_object *zend_object_make_lazy(zend_object *obj,
 	}
 
 	/* Objects become non-lazy if all properties are made non-lazy before
-	 * initialization is triggerd. If the object has no properties to begin
+	 * initialization is triggered. If the object has no properties to begin
 	 * with, this happens immediately. */
 	if (UNEXPECTED(!lazy_properties_count)) {
 		return obj;
@@ -429,6 +462,9 @@ static zend_object *zend_lazy_object_init_proxy(zend_object *obj)
 	ZEND_ASSERT(zend_object_is_lazy_proxy(obj));
 	ZEND_ASSERT(!zend_lazy_object_initialized(obj));
 
+	/* Prevent object from being released during initialization */
+	GC_ADDREF(obj);
+
 	zend_lazy_object_info *info = zend_lazy_object_get_info(obj);
 
 	/* prevent reentrant initialization */
@@ -440,6 +476,7 @@ static zend_object *zend_lazy_object_init_proxy(zend_object *obj)
 	zval zobj;
 	HashTable *named_params = NULL;
 	zend_fcall_info_cache *initializer = &info->u.initializer.fcc;
+	zend_object *instance = NULL;
 
 	ZVAL_OBJ(&zobj, obj);
 
@@ -447,7 +484,7 @@ static zend_object *zend_lazy_object_init_proxy(zend_object *obj)
 
 	if (UNEXPECTED(EG(exception))) {
 		OBJ_EXTRA_FLAGS(obj) |= IS_OBJ_LAZY_UNINITIALIZED|IS_OBJ_LAZY_PROXY;
-		return NULL;
+		goto exit;
 	}
 
 	if (UNEXPECTED(Z_TYPE(retval) != IS_OBJECT)) {
@@ -456,8 +493,7 @@ static zend_object *zend_lazy_object_init_proxy(zend_object *obj)
 				ZSTR_VAL(obj->ce->name),
 				zend_zval_value_name(&retval));
 		zval_ptr_dtor(&retval);
-		return NULL;
-
+		goto exit;
 	}
 
 	if (UNEXPECTED(Z_TYPE(retval) != IS_OBJECT || !zend_lazy_object_compatible(Z_OBJ(retval), obj))) {
@@ -466,14 +502,14 @@ static zend_object *zend_lazy_object_init_proxy(zend_object *obj)
 				zend_zval_value_name(&retval),
 				ZSTR_VAL(obj->ce->name));
 		zval_ptr_dtor(&retval);
-		return NULL;
+		goto exit;
 	}
 
 	if (UNEXPECTED(Z_OBJ(retval) == obj || zend_object_is_lazy(Z_OBJ(retval)))) {
 		OBJ_EXTRA_FLAGS(obj) |= IS_OBJ_LAZY_UNINITIALIZED|IS_OBJ_LAZY_PROXY;
 		zend_throw_error(NULL, "Lazy proxy factory must return a non-lazy object");
 		zval_ptr_dtor(&retval);
-		return NULL;
+		goto exit;
 	}
 
 	zend_fcc_dtor(&info->u.initializer.fcc);
@@ -495,7 +531,18 @@ static zend_object *zend_lazy_object_init_proxy(zend_object *obj)
 		}
 	}
 
-	return Z_OBJ(retval);
+	instance = Z_OBJ(retval);
+
+exit:
+	if (UNEXPECTED(GC_DELREF(obj) == 0)) {
+		zend_throw_error(NULL, "Lazy object was released during initialization");
+		zend_objects_store_del(obj);
+		instance = NULL;
+	} else {
+		gc_check_possible_root((zend_refcounted*) obj);
+	}
+
+	return instance;
 }
 
 /* Initialize a lazy object. */
@@ -513,6 +560,9 @@ ZEND_API zend_object *zend_lazy_object_init(zend_object *obj)
 		ZEND_ASSERT(zend_object_is_lazy_proxy(obj));
 		zend_lazy_object_info *info = zend_lazy_object_get_info(obj);
 		ZEND_ASSERT(info->flags & ZEND_LAZY_OBJECT_INITIALIZED);
+		if (zend_object_is_lazy(info->u.instance)) {
+			return zend_lazy_object_init(info->u.instance);
+		}
 		return info->u.instance;
 	}
 
@@ -529,6 +579,9 @@ ZEND_API zend_object *zend_lazy_object_init(zend_object *obj)
 		return zend_lazy_object_init_proxy(obj);
 	}
 
+	/* Prevent object from being released during initialization */
+	GC_ADDREF(obj);
+
 	zend_fcall_info_cache *initializer = zend_lazy_object_get_initializer_fcc(obj);
 
 	/* Prevent reentrant initialization */
@@ -562,6 +615,7 @@ ZEND_API zend_object *zend_lazy_object_init(zend_object *obj)
 	int argc = 1;
 	zval zobj;
 	HashTable *named_params = NULL;
+	zend_object *instance = NULL;
 
 	ZVAL_OBJ(&zobj, obj);
 
@@ -569,14 +623,14 @@ ZEND_API zend_object *zend_lazy_object_init(zend_object *obj)
 
 	if (EG(exception)) {
 		zend_lazy_object_revert_init(obj, properties_table_snapshot, properties_snapshot);
-		return NULL;
+		goto exit;
 	}
 
 	if (Z_TYPE(retval) != IS_NULL) {
 		zend_lazy_object_revert_init(obj, properties_table_snapshot, properties_snapshot);
 		zval_ptr_dtor(&retval);
 		zend_type_error("Lazy object initializer must return NULL or no value");
-		return NULL;
+		goto exit;
 	}
 
 	if (properties_table_snapshot) {
@@ -598,7 +652,18 @@ ZEND_API zend_object *zend_lazy_object_init(zend_object *obj)
 	 * zend_lazy_object_has_stale_info() check */
 	zend_lazy_object_del_info(obj);
 
-	return obj;
+	instance = obj;
+
+exit:
+	if (UNEXPECTED(GC_DELREF(obj) == 0)) {
+		zend_throw_error(NULL, "Lazy object was released during initialization");
+		zend_objects_store_del(obj);
+		instance = NULL;
+	} else {
+		gc_check_possible_root((zend_refcounted*) obj);
+	}
+
+	return instance;
 }
 
 /* Mark an object as non-lazy (after all properties were initialized) */
@@ -624,8 +689,10 @@ ZEND_API HashTable *zend_lazy_object_get_properties(zend_object *object)
 
 	zend_object *tmp = zend_lazy_object_init(object);
 	if (UNEXPECTED(!tmp)) {
-		ZEND_ASSERT(!object->properties || object->properties == &zend_empty_array);
-		return object->properties = (zend_array*) &zend_empty_array;
+		if (object->properties) {
+			return object->properties;
+		}
+		return object->properties = zend_new_array(0);
 	}
 
 	object = tmp;
@@ -734,3 +801,21 @@ HashTable *zend_lazy_object_get_gc(zend_object *zobj, zval **table, int *n)
 	zend_get_gc_buffer_use(gc_buffer, table, n);
 	return NULL;
 }
+
+zend_property_info *zend_lazy_object_get_property_info_for_slot(zend_object *obj, zval *slot)
+{
+	ZEND_ASSERT(zend_object_is_lazy_proxy(obj));
+
+	zend_property_info **table = obj->ce->properties_info_table;
+	intptr_t prop_num = slot - obj->properties_table;
+	if (prop_num >= 0 && prop_num < obj->ce->default_properties_count) {
+		return table[prop_num];
+	}
+
+	if (!zend_lazy_object_initialized(obj)) {
+		return NULL;
+	}
+
+	obj = zend_lazy_object_get_instance(obj);
+	return zend_get_property_info_for_slot(obj, slot);
+}
diff --git a/Zend/zend_lazy_objects.h b/Zend/zend_lazy_objects.h
index addb07173c3f4..64f68d66360cd 100644
--- a/Zend/zend_lazy_objects.h
+++ b/Zend/zend_lazy_objects.h
@@ -53,6 +53,7 @@ typedef struct _zend_lazy_objects_store {
 	HashTable infos;
 } zend_lazy_objects_store;
 
+typedef struct _zend_property_info zend_property_info;
 typedef struct _zend_fcall_info zend_fcall_info;
 typedef struct _zend_fcall_info_cache zend_fcall_info_cache;
 
@@ -75,6 +76,7 @@ HashTable *zend_lazy_object_debug_info(zend_object *object, int *is_temp);
 HashTable *zend_lazy_object_get_gc(zend_object *zobj, zval **table, int *n);
 bool zend_lazy_object_decr_lazy_props(zend_object *obj);
 void zend_lazy_object_realize(zend_object *obj);
+ZEND_API zend_property_info *zend_lazy_object_get_property_info_for_slot(zend_object *obj, zval *slot);
 
 static zend_always_inline bool zend_object_is_lazy(zend_object *obj)
 {
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index f3f6ca826817d..efc04a63bb363 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -31,7 +31,7 @@
 #define ZEND_MODULE_INFO_FUNC_ARGS zend_module_entry *zend_module
 #define ZEND_MODULE_INFO_FUNC_ARGS_PASSTHRU zend_module
 
-#define ZEND_MODULE_API_NO 20230901
+#define ZEND_MODULE_API_NO 20240925
 #ifdef ZTS
 #define USING_ZTS 1
 #else
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 1383c437b6423..6f5cc8b45214c 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -32,6 +32,7 @@
 #include "zend_compile.h"
 #include "zend_hash.h"
 #include "zend_property_hooks.h"
+#include "zend_observer.h"
 
 #define DEBUG_OBJECT_HANDLERS 0
 
@@ -828,8 +829,8 @@ ZEND_API zval *zend_std_read_property(zend_object *zobj, zend_string *name, int
 
 		if (EXPECTED(cache_slot
 		 && zend_execute_ex == execute_ex
-		 && zobj->ce->default_object_handlers->read_property == zend_std_read_property
-		 && !zobj->ce->create_object
+		 && ce->default_object_handlers->read_property == zend_std_read_property
+		 && !ce->create_object
 		 && !zend_is_in_hook(prop_info)
 		 && !(prop_info->hooks[ZEND_PROPERTY_HOOK_GET]->common.fn_flags & ZEND_ACC_RETURN_REFERENCE))) {
 			ZEND_SET_PROPERTY_HOOK_SIMPLE_GET(cache_slot);
@@ -1183,13 +1184,21 @@ found:;
 exit:
 	return variable_ptr;
 
-lazy_init:
+lazy_init:;
+	/* backup value as it may change during initialization */
+	zval backup;
+	ZVAL_COPY(&backup, value);
+
 	zobj = zend_lazy_object_init(zobj);
 	if (UNEXPECTED(!zobj)) {
 		variable_ptr = &EG(error_zval);
+		zval_ptr_dtor(&backup);
 		goto exit;
 	}
-	return zend_std_write_property(zobj, name, value, cache_slot);
+
+	variable_ptr = zend_std_write_property(zobj, name, &backup, cache_slot);
+	zval_ptr_dtor(&backup);
+	return variable_ptr;
 }
 /* }}} */
 
@@ -1619,7 +1628,8 @@ ZEND_API zend_function *zend_get_call_trampoline_func(const zend_class_entry *ce
 	 * value so that it doesn't contain garbage when the engine allocates space for the next stack
 	 * frame. This didn't cause any issues until now due to "lucky" structure layout. */
 	func->last_var = 0;
-	func->T = (fbc->type == ZEND_USER_FUNCTION)? MAX(fbc->op_array.last_var + fbc->op_array.T, 2) : 2;
+	uint32_t min_T = 2 + ZEND_OBSERVER_ENABLED;
+	func->T = (fbc->type == ZEND_USER_FUNCTION)? MAX(fbc->op_array.last_var + fbc->op_array.T, min_T) : min_T;
 	func->filename = (fbc->type == ZEND_USER_FUNCTION)? fbc->op_array.filename : ZSTR_EMPTY_ALLOC();
 	func->line_start = (fbc->type == ZEND_USER_FUNCTION)? fbc->op_array.line_start : 0;
 	func->line_end = (fbc->type == ZEND_USER_FUNCTION)? fbc->op_array.line_end : 0;
@@ -2208,6 +2218,15 @@ ZEND_API int zend_std_has_property(zend_object *zobj, zend_string *name, int has
 		}
 	} else if (IS_HOOKED_PROPERTY_OFFSET(property_offset)) {
 		zend_function *get = prop_info->hooks[ZEND_PROPERTY_HOOK_GET];
+
+		if (has_set_exists == ZEND_PROPERTY_EXISTS) {
+			if (prop_info->flags & ZEND_ACC_VIRTUAL) {
+				return true;
+			}
+			property_offset = prop_info->offset;
+			goto try_again;
+		}
+
 		if (!get) {
 			if (prop_info->flags & ZEND_ACC_VIRTUAL) {
 				zend_throw_error(NULL, "Property %s::$%s is write-only",
@@ -2219,19 +2238,12 @@ ZEND_API int zend_std_has_property(zend_object *zobj, zend_string *name, int has
 			}
 		}
 
-		if (has_set_exists == ZEND_PROPERTY_EXISTS) {
-			return 1;
-		}
-
 		zval rv;
 		if (!zend_call_get_hook(prop_info, name, get, zobj, &rv)) {
 			if (EG(exception)) {
 				return 0;
 			}
 			property_offset = prop_info->offset;
-			if (!ZEND_TYPE_IS_SET(prop_info->type)) {
-				prop_info = NULL;
-			}
 			goto try_again;
 		}
 
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index 348b3f3416b91..fd0e97c5f4131 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -65,7 +65,7 @@ void zend_object_dtor_property(zend_object *object, zval *p)
 	if (Z_REFCOUNTED_P(p)) {
 		if (UNEXPECTED(Z_ISREF_P(p)) &&
 				(ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(p)))) {
-			zend_property_info *prop_info = zend_get_property_info_for_slot(object, p);
+			zend_property_info *prop_info = zend_get_property_info_for_slot_self(object, p);
 			if (ZEND_TYPE_IS_SET(prop_info->type)) {
 				ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info);
 			}
@@ -233,7 +233,7 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object,
 
 			if (UNEXPECTED(Z_ISREF_P(dst)) &&
 					(ZEND_DEBUG || ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(dst)))) {
-				zend_property_info *prop_info = zend_get_property_info_for_slot(new_object, dst);
+				zend_property_info *prop_info = zend_get_property_info_for_slot_self(new_object, dst);
 				if (ZEND_TYPE_IS_SET(prop_info->type)) {
 					ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(dst), prop_info);
 				}
diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h
index 95fa5acf62fb7..02326f2b31460 100644
--- a/Zend/zend_objects_API.h
+++ b/Zend/zend_objects_API.h
@@ -96,8 +96,21 @@ static zend_always_inline void *zend_object_alloc(size_t obj_size, zend_class_en
 	return obj;
 }
 
+/* Use when 'slot' was obtained directly from obj->properties_table, or when
+ * 'obj' can not be lazy. Otherwise, use zend_get_property_info_for_slot(). */
+static inline zend_property_info *zend_get_property_info_for_slot_self(zend_object *obj, zval *slot)
+{
+	zend_property_info **table = obj->ce->properties_info_table;
+	intptr_t prop_num = slot - obj->properties_table;
+	ZEND_ASSERT(prop_num >= 0 && prop_num < obj->ce->default_properties_count);
+	return table[prop_num];
+}
+
 static inline zend_property_info *zend_get_property_info_for_slot(zend_object *obj, zval *slot)
 {
+	if (UNEXPECTED(zend_object_is_lazy_proxy(obj))) {
+		return zend_lazy_object_get_property_info_for_slot(obj, slot);
+	}
 	zend_property_info **table = obj->ce->properties_info_table;
 	intptr_t prop_num = slot - obj->properties_table;
 	ZEND_ASSERT(prop_num >= 0 && prop_num < obj->ce->default_properties_count);
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index ae75e95a71c1d..c2fbc0ee110c9 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1389,10 +1389,13 @@ ZEND_API zend_result ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *o
 }
 /* }}} */
 
-/* Returns SUCCESS/TYPES_NOT_HANDLED/DIV_BY_ZERO */
-#define TYPES_NOT_HANDLED 1
-#define DIV_BY_ZERO 2
-static int ZEND_FASTCALL div_function_base(zval *result, zval *op1, zval *op2) /* {{{ */
+typedef enum {
+	DIV_SUCCESS,
+	DIV_BY_ZERO,
+	DIV_TYPES_NOT_HANDLED
+} zend_div_status;
+
+static zend_div_status ZEND_FASTCALL div_function_base(zval *result, const zval *op1, const zval *op2) /* {{{ */
 {
 	uint8_t type_pair = TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2));
 
@@ -1402,34 +1405,34 @@ static int ZEND_FASTCALL div_function_base(zval *result, zval *op1, zval *op2) /
 		} else if (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == ZEND_LONG_MIN) {
 			/* Prevent overflow error/crash */
 			ZVAL_DOUBLE(result, (double) ZEND_LONG_MIN / -1);
-			return SUCCESS;
+			return DIV_SUCCESS;
 		}
 		if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */
 			ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2));
 		} else {
 			ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2));
 		}
-		return SUCCESS;
+		return DIV_SUCCESS;
 	} else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_DOUBLE))) {
 		if (Z_DVAL_P(op2) == 0) {
 			return DIV_BY_ZERO;
 		}
 		ZVAL_DOUBLE(result, Z_DVAL_P(op1) / Z_DVAL_P(op2));
-		return SUCCESS;
+		return DIV_SUCCESS;
 	} else if (EXPECTED(type_pair == TYPE_PAIR(IS_DOUBLE, IS_LONG))) {
 		if (Z_LVAL_P(op2) == 0) {
 			return DIV_BY_ZERO;
 		}
 		ZVAL_DOUBLE(result, Z_DVAL_P(op1) / (double)Z_LVAL_P(op2));
-		return SUCCESS;
+		return DIV_SUCCESS;
 	} else if (EXPECTED(type_pair == TYPE_PAIR(IS_LONG, IS_DOUBLE))) {
 		if (Z_DVAL_P(op2) == 0) {
 			return DIV_BY_ZERO;
 		}
 		ZVAL_DOUBLE(result, (double)Z_LVAL_P(op1) / Z_DVAL_P(op2));
-		return SUCCESS;
+		return DIV_SUCCESS;
 	} else {
-		return TYPES_NOT_HANDLED;
+		return DIV_TYPES_NOT_HANDLED;
 	}
 }
 /* }}} */
@@ -1439,8 +1442,8 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
 	ZVAL_DEREF(op1);
 	ZVAL_DEREF(op2);
 
-	int retval = div_function_base(result, op1, op2);
-	if (EXPECTED(retval == SUCCESS)) {
+	zend_div_status retval = div_function_base(result, op1, op2);
+	if (EXPECTED(retval == DIV_SUCCESS)) {
 		return SUCCESS;
 	}
 
@@ -1461,7 +1464,7 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
 	}
 
 	retval = div_function_base(&result_copy, &op1_copy, &op2_copy);
-	if (retval == SUCCESS) {
+	if (retval == DIV_SUCCESS) {
 		if (result == op1) {
 			zval_ptr_dtor(result);
 		}
@@ -1470,7 +1473,7 @@ ZEND_API zend_result ZEND_FASTCALL div_function(zval *result, zval *op1, zval *o
 	}
 
 div_by_zero:
-	ZEND_ASSERT(retval == DIV_BY_ZERO && "TYPES_NOT_HANDLED should not occur here");
+	ZEND_ASSERT(retval == DIV_BY_ZERO && "DIV_TYPES_NOT_HANDLED should not occur here");
 	if (result != op1) {
 		ZVAL_UNDEF(result);
 	}
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index 45f9820c41b16..f8c901b149806 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -28,7 +28,20 @@
 #include 
 
 #ifdef HAVE_IEEEFP_H
-#include 
+/**
+ * On FreeBSD with ubsan/clang we get the following:
+ * `/usr/include/machine/ieeefp.h:161:17: runtime error: left shift of negative value -1`
+ * `SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/include/machine/ieeefp.h:161:17`
+ * ...
+ * `_newcw |= (~_m << FP_MSKS_OFF) & FP_MSKS_FLD;`
+**/
+# if __has_feature(undefined_behavior_sanitizer) && defined(__FreeBSD__) && defined(__clang__)
+#  pragma clang attribute push (__attribute__((no_sanitize("undefined"))), apply_to=function)
+# endif
+# include 
+# if __has_feature(undefined_behavior_sanitizer) && defined(__FreeBSD__) && defined(__clang__)
+#  pragma clang attribute pop
+# endif
 #endif
 
 #include "zend_portability.h"
@@ -484,10 +497,10 @@ 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_objects(zval *o1, zval *o2);
 
-/** Deprecatd in favor of ZEND_STRTOL() */
+/** Deprecated in favor of ZEND_STRTOL() */
 ZEND_ATTRIBUTE_DEPRECATED ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, size_t str_len);
 
-/** Deprecatd in favor of ZEND_STRTOL() */
+/** Deprecated in favor of ZEND_STRTOL() */
 ZEND_ATTRIBUTE_DEPRECATED ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, size_t str_len);
 
 #define convert_to_null_ex(zv) convert_to_null(zv)
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index 5be8d7e4f5ced..f4609428326c7 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -444,14 +444,6 @@ char *alloca();
 # define ZTS_V 0
 #endif
 
-#ifndef LONG_MAX
-# define LONG_MAX 2147483647L
-#endif
-
-#ifndef LONG_MIN
-# define LONG_MIN (- LONG_MAX - 1)
-#endif
-
 #define MAX_LENGTH_OF_DOUBLE 32
 
 #undef MIN
diff --git a/Zend/zend_property_hooks.c b/Zend/zend_property_hooks.c
index 9cfa15ecafa4d..0286bc0c4486f 100644
--- a/Zend/zend_property_hooks.c
+++ b/Zend/zend_property_hooks.c
@@ -36,49 +36,69 @@ typedef struct {
 static zend_result zho_it_valid(zend_object_iterator *iter);
 static void zho_it_move_forward(zend_object_iterator *iter);
 
-// FIXME: This should probably be stored on zend_class_entry somewhere (e.g. through num_virtual_props).
 static uint32_t zho_num_backed_props(zend_object *zobj)
 {
-	zend_property_info *prop_info;
-	int backed_property_count = 0;
-	ZEND_HASH_MAP_FOREACH_PTR(&zobj->ce->properties_info, prop_info) {
-		if (!(prop_info->flags & (ZEND_ACC_STATIC|ZEND_ACC_VIRTUAL))) {
-			backed_property_count++;
-		}
-	} ZEND_HASH_FOREACH_END();
-	return backed_property_count;
+	return zobj->ce->default_properties_count;
 }
 
-static zend_array *zho_build_properties_ex(zend_object *zobj, bool check_access, bool include_dynamic_props)
+static zend_array *zho_build_properties_ex(zend_object *zobj, bool check_access, bool force_ptr, bool include_dynamic_props)
 {
-	if (UNEXPECTED(zend_lazy_object_must_init(zobj))) {
-		zobj = zend_lazy_object_init(zobj);
-		if (UNEXPECTED(!zobj)) {
-			return (zend_array*) &zend_empty_array;
-		}
-	}
-
 	zend_class_entry *ce = zobj->ce;
 	zend_array *properties = zend_new_array(ce->default_properties_count);
 	zend_hash_real_init_mixed(properties);
 
-	zend_property_info *prop_info;
-	ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop_info) {
-		if (prop_info->flags & ZEND_ACC_STATIC) {
-			continue;
-		}
-		if (check_access && zend_check_property_access(zobj, prop_info->name, false) == FAILURE) {
-			continue;
-		}
-		if (prop_info->hooks) {
-			_zend_hash_append_ptr(properties, prop_info->name, prop_info);
-		} else {
-			if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
-				HT_FLAGS(properties) |= HASH_FLAG_HAS_EMPTY_IND;
+	/* Build list of parents */
+	int32_t parent_count = 0;
+	for (zend_class_entry *pce = ce; pce; pce = pce->parent) {
+		parent_count++;
+	}
+	zend_class_entry **parents = emalloc(sizeof(zend_class_entry*) * parent_count);
+	int32_t i = 0;
+	for (zend_class_entry *pce = ce; pce; pce = pce->parent) {
+		parents[i++] = pce;
+	}
+
+	/* Iterate parents top to bottom */
+	i--;
+	for (; i >= 0; i--) {
+		zend_class_entry *pce = parents[i];
+
+		zend_property_info *prop_info;
+		ZEND_HASH_MAP_FOREACH_PTR(&pce->properties_info, prop_info) {
+			if (prop_info->flags & ZEND_ACC_STATIC) {
+				continue;
 			}
-			_zend_hash_append_ind(properties, prop_info->name, OBJ_PROP(zobj, prop_info->offset));
-		}
-	} ZEND_HASH_FOREACH_END();
+			zend_string *property_name = prop_info->name;
+			/* When promoting properties from protected to public, use the unmangled name to preserve order. */
+			if (prop_info->flags & ZEND_ACC_PROTECTED) {
+				const char *tmp = zend_get_unmangled_property_name(property_name);
+				zend_string *unmangled_name = zend_string_init(tmp, strlen(tmp), false);
+				zend_property_info *child_prop_info = zend_hash_find_ptr(&ce->properties_info, unmangled_name);
+				if (child_prop_info && (child_prop_info->flags & ZEND_ACC_PUBLIC)) {
+					property_name = unmangled_name;
+				} else {
+					zend_string_release(unmangled_name);
+				}
+			}
+			if (check_access && zend_check_property_access(zobj, property_name, false) == FAILURE) {
+				goto skip_property;
+			}
+			if (prop_info->hooks || force_ptr) {
+				zend_hash_update_ptr(properties, property_name, prop_info);
+			} else {
+				if (UNEXPECTED(Z_TYPE_P(OBJ_PROP(zobj, prop_info->offset)) == IS_UNDEF)) {
+					HT_FLAGS(properties) |= HASH_FLAG_HAS_EMPTY_IND;
+				}
+				zend_hash_update_ind(properties, property_name, OBJ_PROP(zobj, prop_info->offset));
+			}
+skip_property:
+			if (property_name != prop_info->name) {
+				zend_string_release(property_name);
+			}
+		} ZEND_HASH_FOREACH_END();
+	}
+
+	efree(parents);
 
 	if (include_dynamic_props && zobj->properties) {
 		zend_string *prop_name;
@@ -93,23 +113,22 @@ static zend_array *zho_build_properties_ex(zend_object *zobj, bool check_access,
 
 ZEND_API zend_array *zend_hooked_object_build_properties(zend_object *zobj)
 {
-	return zho_build_properties_ex(zobj, false, true);
+	if (UNEXPECTED(zend_lazy_object_must_init(zobj))) {
+		zobj = zend_lazy_object_init(zobj);
+		if (UNEXPECTED(!zobj)) {
+			return (zend_array*) &zend_empty_array;
+		}
+	}
+
+	return zho_build_properties_ex(zobj, false, false, true);
 }
 
-static bool zho_dynamic_it_init(zend_hooked_object_iterator *hooked_iter)
+static void zho_dynamic_it_init(zend_hooked_object_iterator *hooked_iter)
 {
-	if (hooked_iter->dynamic_prop_it != (uint32_t) -1) {
-		return true;
-	}
-
 	zend_object *zobj = Z_OBJ_P(&hooked_iter->it.data);
-	if (!zobj->properties || zho_num_backed_props(zobj) == zobj->properties->nNumUsed) {
-		hooked_iter->dynamic_props_done = true;
-		return false;
-	}
-
-	hooked_iter->dynamic_prop_it = zend_hash_iterator_add(zobj->properties, zho_num_backed_props(zobj));
-	return true;
+	zend_array *properties = zobj->handlers->get_properties(zobj);
+	hooked_iter->dynamic_props_done = false;
+	hooked_iter->dynamic_prop_it = zend_hash_iterator_add(properties, zho_num_backed_props(zobj));
 }
 
 static void zho_it_get_current_key(zend_object_iterator *iter, zval *key);
@@ -120,9 +139,8 @@ static void zho_declared_it_fetch_current(zend_object_iterator *iter)
 	zend_object *zobj = Z_OBJ_P(&iter->data);
 	zend_array *properties = Z_ARR(hooked_iter->declared_props);
 
-	zval *property = zend_hash_get_current_data(properties);
-	if (Z_TYPE_P(property) == IS_PTR) {
-		zend_property_info *prop_info = Z_PTR_P(property);
+	zend_property_info *prop_info = Z_PTR_P(zend_hash_get_current_data(properties));
+	if (prop_info->hooks) {
 		zend_function *get = prop_info->hooks[ZEND_PROPERTY_HOOK_GET];
 		if (!get && (prop_info->flags & ZEND_ACC_VIRTUAL)) {
 			return;
@@ -134,13 +152,22 @@ static void zho_declared_it_fetch_current(zend_object_iterator *iter)
 				ZSTR_VAL(zobj->ce->name), zend_get_unmangled_property_name(prop_info->name));
 			return;
 		}
-		zval *value = zend_read_property_ex(prop_info->ce, zobj, prop_info->name, /* silent */ true, &hooked_iter->current_data);
+		zend_string *unmangled_name = prop_info->name;
+		if (ZSTR_VAL(unmangled_name)[0] == '\0') {
+			const char *tmp = zend_get_unmangled_property_name(unmangled_name);
+			unmangled_name = zend_string_init(tmp, strlen(tmp), false);
+		}
+		zval *value = zend_read_property_ex(prop_info->ce, zobj, unmangled_name, /* silent */ true, &hooked_iter->current_data);
+		if (unmangled_name != prop_info->name) {
+			zend_string_release(unmangled_name);
+		}
 		if (value == &EG(uninitialized_zval)) {
 			return;
 		} else if (value != &hooked_iter->current_data) {
 			ZVAL_COPY(&hooked_iter->current_data, value);
 		}
 	} else {
+		zval *property = OBJ_PROP(zobj, prop_info->offset);
 		ZVAL_DEINDIRECT(property);
 		if (Z_TYPE_P(property) == IS_UNDEF) {
 			return;
@@ -148,29 +175,51 @@ static void zho_declared_it_fetch_current(zend_object_iterator *iter)
 		if (!hooked_iter->by_ref) {
 			ZVAL_DEREF(property);
 		} else if (Z_TYPE_P(property) != IS_REFERENCE) {
+			if (UNEXPECTED(prop_info->flags & ZEND_ACC_READONLY)) {
+				zend_throw_error(NULL,
+					"Cannot acquire reference to readonly property %s::$%s",
+					ZSTR_VAL(prop_info->ce->name), zend_get_unmangled_property_name(prop_info->name));
+				return;
+			}
 			ZVAL_MAKE_REF(property);
-
-			zend_property_info *prop_info = zend_get_property_info_for_slot(zobj, property);
 			if (ZEND_TYPE_IS_SET(prop_info->type)) {
 				ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(property), prop_info);
 			}
 		}
 		ZVAL_COPY(&hooked_iter->current_data, property);
 	}
-	zend_hash_get_current_key_zval(properties, &hooked_iter->current_key);
+
+	if (ZSTR_VAL(prop_info->name)[0] == '\0') {
+		const char *tmp = zend_get_unmangled_property_name(prop_info->name);
+		ZVAL_STR(&hooked_iter->current_key, zend_string_init(tmp, strlen(tmp), false));
+	} else {
+		ZVAL_STR_COPY(&hooked_iter->current_key, prop_info->name);
+	}
 }
 
 static void zho_dynamic_it_fetch_current(zend_object_iterator *iter)
 {
 	zend_hooked_object_iterator *hooked_iter = (zend_hooked_object_iterator*)iter;
-	ZEND_ASSERT(hooked_iter->dynamic_prop_it != (uint32_t) -1);
-
 	zend_array *properties = Z_OBJ(iter->data)->properties;
 	HashPosition pos = zend_hash_iterator_pos(hooked_iter->dynamic_prop_it, properties);
 
+	if (pos >= properties->nNumUsed) {
+		hooked_iter->dynamic_props_done = true;
+		return;
+	}
+
 	Bucket *bucket = properties->arData + pos;
+
+	if (UNEXPECTED(Z_TYPE(bucket->val) == IS_UNDEF)) {
+		return;
+	}
+
+	zend_object *zobj = Z_OBJ_P(&hooked_iter->it.data);
+	if (bucket->key && zend_check_property_access(zobj, bucket->key, true) != SUCCESS) {
+		return;
+	}
+
 	if (hooked_iter->by_ref && Z_TYPE(bucket->val) != IS_REFERENCE) {
-		ZEND_ASSERT(Z_TYPE(bucket->val) != IS_UNDEF);
 		ZVAL_MAKE_REF(&bucket->val);
 	}
 	ZVAL_COPY(&hooked_iter->current_data, &bucket->val);
@@ -192,7 +241,7 @@ static void zho_it_fetch_current(zend_object_iterator *iter)
 	while (true) {
 		if (!hooked_iter->declared_props_done) {
 			zho_declared_it_fetch_current(iter);
-		} else if (!hooked_iter->dynamic_props_done && zho_dynamic_it_init(hooked_iter)) {
+		} else if (!hooked_iter->dynamic_props_done) {
 			zho_dynamic_it_fetch_current(iter);
 		} else {
 			break;
@@ -211,9 +260,7 @@ static void zho_it_dtor(zend_object_iterator *iter)
 	zval_ptr_dtor(&hooked_iter->declared_props);
 	zval_ptr_dtor_nogc(&hooked_iter->current_key);
 	zval_ptr_dtor(&hooked_iter->current_data);
-	if (hooked_iter->dynamic_prop_it != (uint32_t) -1) {
-		zend_hash_iterator_del(hooked_iter->dynamic_prop_it);
-	}
+	zend_hash_iterator_del(hooked_iter->dynamic_prop_it);
 }
 
 static zend_result zho_it_valid(zend_object_iterator *iter)
@@ -252,14 +299,11 @@ static void zho_it_move_forward(zend_object_iterator *iter)
 		if (zend_hash_has_more_elements(properties) != SUCCESS) {
 			hooked_iter->declared_props_done = true;
 		}
-	} else if (!hooked_iter->dynamic_props_done && zho_dynamic_it_init(hooked_iter)) {
+	} else if (!hooked_iter->dynamic_props_done) {
 		zend_array *properties = Z_OBJ(iter->data)->properties;
 		HashPosition pos = zend_hash_iterator_pos(hooked_iter->dynamic_prop_it, properties);
 		pos++;
 		EG(ht_iterators)[hooked_iter->dynamic_prop_it].pos = pos;
-		if (pos >= properties->nNumUsed) {
-			hooked_iter->dynamic_props_done = true;
-		}
 	}
 }
 
@@ -272,13 +316,11 @@ static void zho_it_rewind(zend_object_iterator *iter)
 	zval_ptr_dtor_nogc(&hooked_iter->current_key);
 	ZVAL_UNDEF(&hooked_iter->current_key);
 
-	hooked_iter->declared_props_done = false;
 	zend_array *properties = Z_ARR(hooked_iter->declared_props);
 	zend_hash_internal_pointer_reset(properties);
+	hooked_iter->declared_props_done = !zend_hash_num_elements(properties);
 	hooked_iter->dynamic_props_done = false;
-	if (hooked_iter->dynamic_prop_it != (uint32_t) -1) {
-		EG(ht_iterators)[hooked_iter->dynamic_prop_it].pos = zho_num_backed_props(Z_OBJ(iter->data));
-	}
+	EG(ht_iterators)[hooked_iter->dynamic_prop_it].pos = zho_num_backed_props(Z_OBJ(iter->data));
 }
 
 static HashTable *zho_it_get_gc(zend_object_iterator *iter, zval **table, int *n)
@@ -305,17 +347,24 @@ static const zend_object_iterator_funcs zend_hooked_object_it_funcs = {
 
 ZEND_API zend_object_iterator *zend_hooked_object_get_iterator(zend_class_entry *ce, zval *object, int by_ref)
 {
+	zend_object *zobj = Z_OBJ_P(object);
+	if (UNEXPECTED(zend_lazy_object_must_init(zobj))) {
+		zobj = zend_lazy_object_init(zobj);
+		if (UNEXPECTED(!zobj)) {
+			return NULL;
+		}
+	}
+
 	zend_hooked_object_iterator *iterator = emalloc(sizeof(zend_hooked_object_iterator));
 	zend_iterator_init(&iterator->it);
 
-	ZVAL_OBJ_COPY(&iterator->it.data, Z_OBJ_P(object));
+	ZVAL_OBJ_COPY(&iterator->it.data, zobj);
 	iterator->it.funcs = &zend_hooked_object_it_funcs;
 	iterator->by_ref = by_ref;
-	iterator->declared_props_done = false;
-	zend_array *properties = zho_build_properties_ex(Z_OBJ_P(object), true, false);
+	zend_array *properties = zho_build_properties_ex(zobj, true, true, false);
 	ZVAL_ARR(&iterator->declared_props, properties);
-	iterator->dynamic_props_done = false;
-	iterator->dynamic_prop_it = (uint32_t) -1;
+	iterator->declared_props_done = !zend_hash_num_elements(properties);
+	zho_dynamic_it_init(iterator);
 	ZVAL_UNDEF(&iterator->current_key);
 	ZVAL_UNDEF(&iterator->current_data);
 
diff --git a/Zend/zend_string.c b/Zend/zend_string.c
index 7a00171d2c84d..dfe059359aa53 100644
--- a/Zend/zend_string.c
+++ b/Zend/zend_string.c
@@ -402,32 +402,32 @@ ZEND_API bool ZEND_FASTCALL I_REPLACE_SONAME_FNNAME_ZU(NONE,zend_string_equal_va
 ZEND_API zend_never_inline NOIPA bool ZEND_FASTCALL zend_string_equal_val(const zend_string *s1, const zend_string *s2)
 {
 	const char *ptr = ZSTR_VAL(s1);
-	size_t delta = (const char*)s2 - (const char*)s1;
+	uintptr_t delta = (uintptr_t) s2 - (uintptr_t) s1;
 	size_t len = ZSTR_LEN(s1);
 	zend_ulong ret;
 
 	__asm__ (
-		".LL0%=:\n\t"
+		"0:\n\t"
 		"movl (%2,%3), %0\n\t"
 		"xorl (%2), %0\n\t"
-		"jne .LL1%=\n\t"
+		"jne 1f\n\t"
 		"addl $0x4, %2\n\t"
 		"subl $0x4, %1\n\t"
-		"ja .LL0%=\n\t"
+		"ja 0b\n\t"
 		"movl $0x1, %0\n\t"
-		"jmp .LL3%=\n\t"
-		".LL1%=:\n\t"
+		"jmp 3f\n\t"
+		"1:\n\t"
 		"cmpl $0x4,%1\n\t"
-		"jb .LL2%=\n\t"
+		"jb 2f\n\t"
 		"xorl %0, %0\n\t"
-		"jmp .LL3%=\n\t"
-		".LL2%=:\n\t"
+		"jmp 3f\n\t"
+		"2:\n\t"
 		"negl %1\n\t"
 		"lea 0x20(,%1,8), %1\n\t"
 		"shll %b1, %0\n\t"
 		"sete %b0\n\t"
 		"movzbl %b0, %0\n\t"
-		".LL3%=:\n"
+		"3:\n"
 		: "=&a"(ret),
 		  "+c"(len),
 		  "+r"(ptr)
@@ -440,32 +440,32 @@ ZEND_API zend_never_inline NOIPA bool ZEND_FASTCALL zend_string_equal_val(const
 ZEND_API zend_never_inline NOIPA bool ZEND_FASTCALL zend_string_equal_val(const zend_string *s1, const zend_string *s2)
 {
 	const char *ptr = ZSTR_VAL(s1);
-	size_t delta = (const char*)s2 - (const char*)s1;
+	uintptr_t delta = (uintptr_t) s2 - (uintptr_t) s1;
 	size_t len = ZSTR_LEN(s1);
 	zend_ulong ret;
 
 	__asm__ (
-		".LL0%=:\n\t"
+		"0:\n\t"
 		"movq (%2,%3), %0\n\t"
 		"xorq (%2), %0\n\t"
-		"jne .LL1%=\n\t"
+		"jne 1f\n\t"
 		"addq $0x8, %2\n\t"
 		"subq $0x8, %1\n\t"
-		"ja .LL0%=\n\t"
+		"ja 0b\n\t"
 		"movq $0x1, %0\n\t"
-		"jmp .LL3%=\n\t"
-		".LL1%=:\n\t"
+		"jmp 3f\n\t"
+		"1:\n\t"
 		"cmpq $0x8,%1\n\t"
-		"jb .LL2%=\n\t"
+		"jb 2f\n\t"
 		"xorq %0, %0\n\t"
-		"jmp .LL3%=\n\t"
-		".LL2%=:\n\t"
+		"jmp 3f\n\t"
+		"2:\n\t"
 		"negq %1\n\t"
 		"lea 0x40(,%1,8), %1\n\t"
 		"shlq %b1, %0\n\t"
 		"sete %b0\n\t"
 		"movzbq %b0, %0\n\t"
-		".LL3%=:\n"
+		"3:\n"
 		: "=&a"(ret),
 		  "+c"(len),
 		  "+r"(ptr)
diff --git a/Zend/zend_string.h b/Zend/zend_string.h
index ad6c5e1ee38bf..88263d5d7a5d3 100644
--- a/Zend/zend_string.h
+++ b/Zend/zend_string.h
@@ -560,6 +560,8 @@ EMPTY_SWITCH_DEFAULT_CASE()
 #endif
 }
 
+// When adding a new string here, please also update build/gen_stub.php to the
+// known strings to be used in property registration; see gh-15751
 #define ZEND_KNOWN_STRINGS(_) \
 	_(ZEND_STR_FILE,                   "file") \
 	_(ZEND_STR_LINE,                   "line") \
@@ -634,7 +636,7 @@ EMPTY_SWITCH_DEFAULT_CASE()
 	_(ZEND_STR_COUNT,                  "count") \
 	_(ZEND_STR_SENSITIVEPARAMETER,     "SensitiveParameter") \
 	_(ZEND_STR_CONST_EXPR_PLACEHOLDER, "[constant expression]") \
-	_(ZEND_STR_DEPRECATED,             "Deprecated") \
+	_(ZEND_STR_DEPRECATED_CAPITALIZED, "Deprecated") \
 	_(ZEND_STR_SINCE,                  "since") \
 	_(ZEND_STR_GET,                    "get") \
 	_(ZEND_STR_SET,                    "set") \
diff --git a/Zend/zend_strtod.c b/Zend/zend_strtod.c
index 6a358bb1128eb..8115e041c0c3e 100644
--- a/Zend/zend_strtod.c
+++ b/Zend/zend_strtod.c
@@ -292,10 +292,6 @@ static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
 #define DBL_MAX 1.7014118346046923e+38
 #endif
 
-#ifndef LONG_MAX
-#define LONG_MAX 2147483647
-#endif
-
 #else /* ifndef Bad_float_h */
 #include "float.h"
 #endif /* Bad_float_h */
@@ -3609,11 +3605,11 @@ rv_alloc(i) int i;
 rv_alloc(int i)
 #endif
 {
-	int j, k, *r;
+	int k, *r;
 
-	j = sizeof(ULong);
+	size_t j = sizeof(ULong);
 	for(k = 0;
-		sizeof(Bigint) - sizeof(ULong) - sizeof(int) + (size_t)j <= (size_t)i;
+		sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (size_t)i;
 		j <<= 1)
 			k++;
 	r = (int*)Balloc(k);
diff --git a/Zend/zend_verify_type_inference.h b/Zend/zend_verify_type_inference.h
index 20a4c37608743..0add01933495f 100644
--- a/Zend/zend_verify_type_inference.h
+++ b/Zend/zend_verify_type_inference.h
@@ -46,7 +46,7 @@ static void zend_verify_type_inference(zval *value, uint32_t type_mask, uint8_t
 
 	if (Z_TYPE_P(value) == IS_INDIRECT) {
 		if (!(type_mask & MAY_BE_INDIRECT)) {
-			ZEND_VERIFY_TYPE_INFERENCE_ERROR("mask 0x%x mising MAY_BE_INDIRECT", type_mask);
+			ZEND_VERIFY_TYPE_INFERENCE_ERROR("mask 0x%x missing MAY_BE_INDIRECT", type_mask);
 		}
 		value = Z_INDIRECT_P(value);
 	}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 1934ba4afa604..e19c503379319 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -1012,6 +1012,7 @@ ZEND_VM_HANDLER(28, ZEND_ASSIGN_OBJ_OP, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, OP)
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -1049,14 +1050,13 @@ ZEND_VM_C_LABEL(assign_op_object):
 				break;
 			}
 		}
-		cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -1069,11 +1069,7 @@ ZEND_VM_C_LABEL(assign_op_object):
 						}
 					}
 
-					if (OP2_TYPE == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -1113,7 +1109,8 @@ ZEND_VM_HANDLER(29, ZEND_ASSIGN_STATIC_PROP_OP, ANY, ANY, OP)
 
 	SAVE_OPLINE();
 
-	if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+	prop = zend_fetch_static_property_address(&prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		UNDEF_RESULT();
 		FREE_OP_DATA();
 		HANDLE_EXCEPTION();
@@ -1286,6 +1283,7 @@ ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACH
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -1321,18 +1319,14 @@ ZEND_VM_C_LABEL(pre_incdec_object):
 				break;
 			}
 		}
-		cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if (OP2_TYPE == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -1359,6 +1353,7 @@ ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CAC
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -1394,17 +1389,12 @@ ZEND_VM_C_LABEL(post_incdec_object):
 				break;
 			}
 		}
-		cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if (OP2_TYPE == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -1434,7 +1424,8 @@ ZEND_VM_HANDLER(38, ZEND_PRE_INC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
 	}
@@ -1460,7 +1451,8 @@ ZEND_VM_HANDLER(40, ZEND_POST_INC_STATIC_PROP, ANY, ANY, CACHE_SLOT)
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
 	}
@@ -1840,14 +1832,17 @@ ZEND_VM_HANDLER(89, ZEND_FETCH_IS, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
 }
 
 /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
-ZEND_VM_HELPER(zend_fetch_static_prop_helper, ANY, ANY, int type)
+ZEND_VM_INLINE_HELPER(zend_fetch_static_prop_helper, ANY, ANY, int type)
 {
 	USE_OPLINE
 	zval *prop;
 
 	SAVE_OPLINE();
 
-	if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+	prop = zend_fetch_static_property_address(
+		NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type,
+		type == BP_VAR_W ? opline->extended_value : 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		ZEND_ASSERT(EG(exception) || (type == BP_VAR_IS));
 		prop = &EG(uninitialized_zval);
 	}
@@ -1881,10 +1876,11 @@ ZEND_VM_HANDLER(175, ZEND_FETCH_STATIC_PROP_RW, ANY, CLASS_FETCH, CACHE_SLOT)
 /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
 ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, ANY, CLASS_FETCH, FETCH_REF|CACHE_SLOT)
 {
-	int fetch_type =
-		(UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
-			BP_VAR_W : BP_VAR_R;
-	ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, fetch_type);
+	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+		ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_STATIC_PROP_W);
+	} else {
+		ZEND_VM_DISPATCH_TO_HANDLER(ZEND_FETCH_STATIC_PROP_R);
+	}
 }
 
 /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
@@ -2217,7 +2213,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH
 	zend_fetch_property_address(
 		result, container, OP1_TYPE, property, OP2_TYPE,
 		((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 	FREE_OP2();
 	if (OP1_TYPE == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -2234,7 +2230,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACH
 	container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW);
 	property = GET_OP2_ZVAL_PTR(BP_VAR_R);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 	FREE_OP2();
 	if (OP1_TYPE == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -2389,7 +2385,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C
 	container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_UNSET);
 	property = GET_OP2_ZVAL_PTR(BP_VAR_R);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 	FREE_OP2();
 	if (OP1_TYPE == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -2595,7 +2591,8 @@ ZEND_VM_HANDLER(25, ZEND_ASSIGN_STATIC_PROP, ANY, ANY, CACHE_SLOT, SPEC(OP_DATA=
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		FREE_OP_DATA();
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
@@ -2889,7 +2886,8 @@ ZEND_VM_HANDLER(33, ZEND_ASSIGN_STATIC_PROP_REF, ANY, ANY, CACHE_SLOT|SRC)
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		FREE_OP_DATA();
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
@@ -6832,6 +6830,14 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
 	} else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		zend_object *zobj = Z_OBJ_P(array_ptr);
 		if (!zobj->ce->get_iterator) {
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+					FREE_OP1_IF_VAR();
+					HANDLE_EXCEPTION();
+				}
+			}
 			HashTable *properties = zobj->properties;
 			if (properties) {
 				if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
@@ -6920,7 +6926,16 @@ ZEND_VM_COLD_CONST_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR)
 		ZEND_VM_NEXT_OPCODE();
 	} else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
+			zend_object *zobj = Z_OBJ_P(array_ptr);
 			HashTable *properties;
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+					FREE_OP1_IF_VAR();
+					HANDLE_EXCEPTION();
+				}
+			}
 			if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
 				if (array_ptr == array_ref) {
 					ZVAL_NEW_REF(array_ref, array_ref);
@@ -7441,18 +7456,17 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, ANY, CLASS_FETCH, ISSET|CAC
 {
 	USE_OPLINE
 	zval *value;
-	zend_result fetch_result;
 	bool result;
 
 	SAVE_OPLINE();
 
-	fetch_result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC);
+	value = zend_fetch_static_property_address(NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (!(opline->extended_value & ZEND_ISEMPTY)) {
-		result = fetch_result == SUCCESS && Z_TYPE_P(value) > IS_NULL &&
+		result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
 		    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
 	} else {
-		result = fetch_result != SUCCESS || !i_zend_is_true(value);
+		result = value == NULL || !i_zend_is_true(value);
 	}
 
 	ZEND_VM_SMART_BRANCH(result, 1);
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index faf761c1c395e..af9ea669b6b4f 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -776,7 +776,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_OP_SPEC_HAN
 
 	SAVE_OPLINE();
 
-	if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+	prop = zend_fetch_static_property_address(&prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		UNDEF_RESULT();
 		FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
 		HANDLE_EXCEPTION();
@@ -819,7 +820,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_HANDL
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
 	}
@@ -839,7 +841,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_HAND
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
 	}
@@ -851,14 +854,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_HAND
 }
 
 /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CONST|VAR) */
-static zend_never_inline ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC(int type ZEND_OPCODE_HANDLER_ARGS_DC)
+static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_fetch_static_prop_helper_SPEC(int type ZEND_OPCODE_HANDLER_ARGS_DC)
 {
 	USE_OPLINE
 	zval *prop;
 
 	SAVE_OPLINE();
 
-	if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) {
+	prop = zend_fetch_static_property_address(
+		NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type,
+		type == BP_VAR_W ? opline->extended_value : 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		ZEND_ASSERT(EG(exception) || (type == BP_VAR_IS));
 		prop = &EG(uninitialized_zval);
 	}
@@ -892,10 +898,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_RW_SPEC_HAND
 /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_FUNC_ARG_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-	int fetch_type =
-		(UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ?
-			BP_VAR_W : BP_VAR_R;
-	ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC(fetch_type ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC));
+	if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) {
+		ZEND_VM_TAIL_CALL(ZEND_FETCH_STATIC_PROP_W_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+	} else {
+		ZEND_VM_TAIL_CALL(ZEND_FETCH_STATIC_PROP_R_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+	}
 }
 
 /* No specialization for op_types (CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR) */
@@ -943,7 +950,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
@@ -979,7 +987,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
@@ -1015,7 +1024,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
@@ -1051,7 +1061,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_OP_DAT
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
@@ -1087,7 +1098,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_HA
 
 	SAVE_OPLINE();
 
-	if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) {
+	prop = zend_fetch_static_property_address(&prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC);
+	if (UNEXPECTED(!prop)) {
 		FREE_OP((opline+1)->op1_type, (opline+1)->op1.var);
 		UNDEF_RESULT();
 		HANDLE_EXCEPTION();
@@ -3008,18 +3020,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
 {
 	USE_OPLINE
 	zval *value;
-	zend_result fetch_result;
 	bool result;
 
 	SAVE_OPLINE();
 
-	fetch_result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC);
+	value = zend_fetch_static_property_address(NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC);
 
 	if (!(opline->extended_value & ZEND_ISEMPTY)) {
-		result = fetch_result == SUCCESS && Z_TYPE_P(value) > IS_NULL &&
+		result = value != NULL && Z_TYPE_P(value) > IS_NULL &&
 		    (!Z_ISREF_P(value) || Z_TYPE_P(Z_REFVAL_P(value)) != IS_NULL);
 	} else {
-		result = fetch_result != SUCCESS || !i_zend_is_true(value);
+		result = value == NULL || !i_zend_is_true(value);
 	}
 
 	ZEND_VM_SMART_BRANCH(result, 1);
@@ -5411,6 +5422,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
 	} else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		zend_object *zobj = Z_OBJ_P(array_ptr);
 		if (!zobj->ce->get_iterator) {
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+
+					HANDLE_EXCEPTION();
+				}
+			}
 			HashTable *properties = zobj->properties;
 			if (properties) {
 				if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
@@ -5497,7 +5516,16 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_
 		ZEND_VM_NEXT_OPCODE();
 	} else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
+			zend_object *zobj = Z_OBJ_P(array_ptr);
 			HashTable *properties;
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+
+					HANDLE_EXCEPTION();
+				}
+			}
 			if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
 				if (array_ptr == array_ref) {
 					ZVAL_NEW_REF(array_ref, array_ref);
@@ -20117,6 +20145,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
 	} else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		zend_object *zobj = Z_OBJ_P(array_ptr);
 		if (!zobj->ce->get_iterator) {
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+
+					HANDLE_EXCEPTION();
+				}
+			}
 			HashTable *properties = zobj->properties;
 			if (properties) {
 				if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
@@ -20204,7 +20240,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z
 		ZEND_VM_NEXT_OPCODE();
 	} else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
+			zend_object *zobj = Z_OBJ_P(array_ptr);
 			HashTable *properties;
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+
+					HANDLE_EXCEPTION();
+				}
+			}
 			if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
 				if (array_ptr == array_ref) {
 					ZVAL_NEW_REF(array_ref, array_ref);
@@ -22769,6 +22814,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
 	} else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		zend_object *zobj = Z_OBJ_P(array_ptr);
 		if (!zobj->ce->get_iterator) {
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+					zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+					HANDLE_EXCEPTION();
+				}
+			}
 			HashTable *properties = zobj->properties;
 			if (properties) {
 				if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
@@ -22857,7 +22910,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z
 		ZEND_VM_NEXT_OPCODE();
 	} else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
+			zend_object *zobj = Z_OBJ_P(array_ptr);
 			HashTable *properties;
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+					zval_ptr_dtor_nogc(EX_VAR(opline->op1.var));
+					HANDLE_EXCEPTION();
+				}
+			}
 			if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
 				if (array_ptr == array_ref) {
 					ZVAL_NEW_REF(array_ref, array_ref);
@@ -23427,6 +23489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST_H
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -23464,14 +23527,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST_H
 				break;
 			}
 		}
-		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -23484,11 +23546,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CONST_H
 						}
 					}
 
-					if (IS_CONST == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -23653,6 +23711,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HAN
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -23688,18 +23747,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HAN
 				break;
 			}
 		}
-		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if (IS_CONST == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -23720,6 +23775,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HA
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -23755,17 +23811,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HA
 				break;
 			}
 		}
-		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if (IS_CONST == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -23857,7 +23908,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN
 	zend_fetch_property_address(
 		result, container, IS_VAR, property, IS_CONST,
 		((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -23874,7 +23925,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -23908,7 +23959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -26424,6 +26475,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -26461,14 +26513,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_
 				break;
 			}
 		}
-		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -26481,11 +26532,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_TMPVAR_
 						}
 					}
 
-					if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -26652,6 +26699,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR_HA
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -26687,18 +26735,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR_HA
 				break;
 			}
 		}
-		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -26720,6 +26764,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_H
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -26755,17 +26800,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_H
 				break;
 			}
 		}
-		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -26858,7 +26898,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA
 	zend_fetch_property_address(
 		result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR),
 		(((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -26875,7 +26915,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -26909,7 +26949,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -30793,6 +30833,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV_HAND
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -30830,14 +30871,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV_HAND
 				break;
 			}
 		}
-		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -30850,11 +30890,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_VAR_CV_HAND
 						}
 					}
 
-					if (IS_CV == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -31019,6 +31055,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLE
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -31054,18 +31091,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLE
 				break;
 			}
 		}
-		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if (IS_CV == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -31086,6 +31119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDL
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -31121,17 +31155,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDL
 				break;
 			}
 		}
-		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if (IS_CV == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -31223,7 +31252,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE
 	zend_fetch_property_address(
 		result, container, IS_VAR, property, IS_CV,
 		((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -31240,7 +31269,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -31274,7 +31303,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA
 	container = _get_zval_ptr_ptr_var(opline->op1.var EXECUTE_DATA_CC);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_VAR == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -33473,6 +33502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONS
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -33510,14 +33540,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONS
 				break;
 			}
 		}
-		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -33530,11 +33559,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CONS
 						}
 					}
 
-					if (IS_CONST == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -33569,6 +33594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -33604,18 +33630,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_
 				break;
 			}
 		}
-		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if (IS_CONST == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -33636,6 +33658,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -33671,17 +33694,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST
 				break;
 			}
 		}
-		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if (IS_CONST == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -33882,7 +33900,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_
 	zend_fetch_property_address(
 		result, container, IS_UNUSED, property, IS_CONST,
 		((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -33899,7 +33917,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST
 	container = &EX(This);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -34054,7 +34072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO
 	container = &EX(This);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -35655,6 +35673,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPV
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -35692,14 +35711,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPV
 				break;
 			}
 		}
-		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -35712,11 +35730,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_TMPV
 						}
 					}
 
-					if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -35751,6 +35765,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -35786,18 +35801,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR
 				break;
 			}
 		}
-		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -35819,6 +35830,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVA
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -35854,17 +35866,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVA
 				break;
 			}
 		}
-		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -36061,7 +36068,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR
 	zend_fetch_property_address(
 		result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR),
 		(((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -36078,7 +36085,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA
 	container = &EX(This);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -36233,7 +36240,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM
 	container = &EX(This);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -38314,6 +38321,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV_H
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -38351,14 +38359,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV_H
 				break;
 			}
 		}
-		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -38371,11 +38378,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_UNUSED_CV_H
 						}
 					}
 
-					if (IS_CV == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -38410,6 +38413,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HAN
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -38445,18 +38449,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HAN
 				break;
 			}
 		}
-		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if (IS_CV == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -38477,6 +38477,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HA
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -38512,17 +38513,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HA
 				break;
 			}
 		}
-		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if (IS_CV == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -38718,7 +38714,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN
 	zend_fetch_property_address(
 		result, container, IS_UNUSED, property, IS_CV,
 		((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -38735,7 +38731,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA
 	container = &EX(This);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -38890,7 +38886,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV
 	container = &EX(This);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_UNUSED == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -41133,6 +41129,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
 	} else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		zend_object *zobj = Z_OBJ_P(array_ptr);
 		if (!zobj->ce->get_iterator) {
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+
+					HANDLE_EXCEPTION();
+				}
+			}
 			HashTable *properties = zobj->properties;
 			if (properties) {
 				if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
@@ -41219,7 +41223,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE
 		ZEND_VM_NEXT_OPCODE();
 	} else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
 		if (!Z_OBJCE_P(array_ptr)->get_iterator) {
+			zend_object *zobj = Z_OBJ_P(array_ptr);
 			HashTable *properties;
+			if (UNEXPECTED(zend_object_is_lazy(zobj))) {
+				zobj = zend_lazy_object_init(zobj);
+				if (UNEXPECTED(EG(exception))) {
+					UNDEF_RESULT();
+
+					HANDLE_EXCEPTION();
+				}
+			}
 			if (IS_CV == IS_VAR || IS_CV == IS_CV) {
 				if (array_ptr == array_ref) {
 					ZVAL_NEW_REF(array_ref, array_ref);
@@ -42461,6 +42474,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_CONST_HA
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -42498,14 +42512,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_CONST_HA
 				break;
 			}
 		}
-		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -42518,11 +42531,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_CONST_HA
 						}
 					}
 
-					if (IS_CONST == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -42687,6 +42696,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HAND
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -42722,18 +42732,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HAND
 				break;
 			}
 		}
-		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if (IS_CONST == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -42754,6 +42760,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CONST_HAN
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -42789,17 +42796,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CONST_HAN
 				break;
 			}
 		}
-		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if (IS_CONST == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -43112,7 +43114,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND
 	zend_fetch_property_address(
 		result, container, IS_CV, property, IS_CONST,
 		((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -43129,7 +43131,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN
 	container = EX_VAR(opline->op1.var);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -43284,7 +43286,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_
 	container = EX_VAR(opline->op1.var);
 	property = RT_CONSTANT(opline, opline->op2);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -46425,6 +46427,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR_H
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -46462,14 +46465,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR_H
 				break;
 			}
 		}
-		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -46482,11 +46484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_TMPVAR_H
 						}
 					}
 
-					if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -46653,6 +46651,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR_HAN
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -46688,18 +46687,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR_HAN
 				break;
 			}
 		}
-		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -46721,6 +46716,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HA
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -46756,17 +46752,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HA
 				break;
 			}
 		}
-		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -47075,7 +47066,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN
 	zend_fetch_property_address(
 		result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR),
 		(((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -47092,7 +47083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA
 	container = EX_VAR(opline->op1.var);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -47247,7 +47238,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR
 	container = EX_VAR(opline->op1.var);
 	property = _get_zval_ptr_var(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 	zval_ptr_dtor_nogc(EX_VAR(opline->op2.var));
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -51939,6 +51930,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_CV_HANDL
 	zval *property;
 	zval *value;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -51976,14 +51968,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_CV_HANDL
 				break;
 			}
 		}
-		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL;
+		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				zval *orig_zptr = zptr;
 				zend_reference *ref;
 
 				do {
@@ -51996,11 +51987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_OP_SPEC_CV_CV_HANDL
 						}
 					}
 
-					if (IS_CV == IS_CONST) {
-						prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-					} else {
-						prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
-					}
+					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 					if (prop_info) {
 						/* special case for typed properties */
 						zend_binary_assign_op_typed_prop(prop_info, zptr, value OPLINE_CC EXECUTE_DATA_CC);
@@ -52165,6 +52152,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -52200,18 +52188,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER
 				break;
 			}
 		}
-		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
 					ZVAL_NULL(EX_VAR(opline->result.var));
 				}
 			} else {
-				if (IS_CV == IS_CONST) {
-					prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
+				prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2);
 				zend_pre_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -52232,6 +52216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLE
 	zval *object;
 	zval *property;
 	zval *zptr;
+	void *_cache_slot[3] = {0};
 	void **cache_slot;
 	zend_property_info *prop_info;
 	zend_object *zobj;
@@ -52267,17 +52252,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLE
 				break;
 			}
 		}
-		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL;
+		cache_slot = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : _cache_slot;
 		if (EXPECTED((zptr = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_RW, cache_slot)) != NULL)) {
 			if (UNEXPECTED(Z_ISERROR_P(zptr))) {
 				ZVAL_NULL(EX_VAR(opline->result.var));
 			} else {
-				if (IS_CV == IS_CONST) {
-					prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
-				} else {
-					prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), zptr);
-				}
-
+				prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
 				zend_post_incdec_property_zval(zptr, prop_info OPLINE_CC EXECUTE_DATA_CC);
 			}
 		} else {
@@ -52585,7 +52565,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER
 	zend_fetch_property_address(
 		result, container, IS_CV, property, IS_CV,
 		((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL),
-		BP_VAR_W, opline->extended_value OPLINE_CC EXECUTE_DATA_CC);
+		BP_VAR_W, opline->extended_value, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -52602,7 +52582,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE
 	container = EX_VAR(opline->op1.var);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_RW, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
@@ -52757,7 +52737,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN
 	container = EX_VAR(opline->op1.var);
 	property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC);
 	result = EX_VAR(opline->result.var);
-	zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0 OPLINE_CC EXECUTE_DATA_CC);
+	zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_UNSET, 0, NULL OPLINE_CC EXECUTE_DATA_CC);
 
 	if (IS_CV == IS_VAR) {
 		FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(opline->op1.var);
diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c
index aea46e493410e..cf363cd12595c 100644
--- a/Zend/zend_weakrefs.c
+++ b/Zend/zend_weakrefs.c
@@ -183,6 +183,13 @@ ZEND_API zend_result zend_weakrefs_hash_del(HashTable *ht, zend_object *key) {
 	return FAILURE;
 }
 
+ZEND_API void zend_weakrefs_hash_clean(HashTable *ht) {
+	zend_ulong obj_key;
+	ZEND_HASH_FOREACH_NUM_KEY(ht, obj_key) {
+		zend_weakrefs_hash_del(ht, zend_weakref_key_to_object(obj_key));
+	} ZEND_HASH_FOREACH_END();
+}
+
 void zend_weakrefs_init(void) {
 	zend_hash_init(&EG(weakrefs), 8, NULL, NULL, 0);
 }
@@ -642,6 +649,10 @@ static void zend_weakmap_iterator_get_current_key(zend_object_iterator *obj_iter
 	zend_string *string_key;
 	zend_ulong num_key;
 	int key_type = zend_hash_get_current_key_ex(&wm->ht, &string_key, &num_key, pos);
+	if (key_type == HASH_KEY_NON_EXISTENT) {
+		ZVAL_NULL(key);
+		return;
+	}
 	if (key_type != HASH_KEY_IS_LONG) {
 		ZEND_ASSERT(0 && "Must have integer key");
 	}
diff --git a/Zend/zend_weakrefs.h b/Zend/zend_weakrefs.h
index 5b1c8ea1c325d..00d4fbcc6bc4c 100644
--- a/Zend/zend_weakrefs.h
+++ b/Zend/zend_weakrefs.h
@@ -41,6 +41,12 @@ static zend_always_inline void *zend_weakrefs_hash_add_ptr(HashTable *ht, zend_o
 		return NULL;
 	}
 }
+ZEND_API void zend_weakrefs_hash_clean(HashTable *ht);
+static zend_always_inline void zend_weakrefs_hash_destroy(HashTable *ht) {
+	zend_weakrefs_hash_clean(ht);
+	ZEND_ASSERT(zend_hash_num_elements(ht) == 0);
+	zend_hash_destroy(ht);
+}
 
 /* Because php uses the raw numbers as a hash function, raw pointers will lead to hash collisions.
  * We have a guarantee that the lowest ZEND_MM_ALIGNED_OFFSET_LOG2 bits of a pointer are zero.
diff --git a/build/Makefile.global b/build/Makefile.global
index 37b48ba2980ea..321b0ed4ff3fc 100644
--- a/build/Makefile.global
+++ b/build/Makefile.global
@@ -117,7 +117,7 @@ clean:
 	find . -name \*.la -o -name \*.a | xargs rm -f
 	find . -name \*.so | xargs rm -f
 	find . -name .libs -a -type d|xargs rm -rf
-	rm -f libphp.la $(SAPI_CLI_PATH) $(SAPI_CGI_PATH) $(SAPI_LITESPEED_PATH) $(SAPI_FPM_PATH) $(OVERALL_TARGET) modules/* libs/*
+	rm -f libphp.la $(SAPI_CLI_PATH) $(SAPI_CGI_PATH) $(SAPI_LITESPEED_PATH) $(SAPI_FPM_PATH) $(SAPI_PHPDBG_PATH) $(SAPI_PHPDBG_SHARED_PATH) $(OVERALL_TARGET) modules/* libs/*
 	rm -f ext/opcache/jit/ir/gen_ir_fold_hash
 	rm -f ext/opcache/jit/ir/minilua
 	rm -f ext/opcache/jit/ir/ir_fold_hash.h
@@ -143,7 +143,7 @@ prof-clean:
 	find . -name \*.lo -o -name \*.o | xargs rm -f
 	find . -name \*.la -o -name \*.a | xargs rm -f
 	find . -name \*.so | xargs rm -f
-	rm -f libphp.la $(SAPI_CLI_PATH) $(SAPI_CGI_PATH) $(SAPI_LITESPEED_PATH) $(SAPI_FPM_PATH) $(OVERALL_TARGET) modules/* libs/*
+	rm -f libphp.la $(SAPI_CLI_PATH) $(SAPI_CGI_PATH) $(SAPI_LITESPEED_PATH) $(SAPI_FPM_PATH) $(SAPI_PHPDBG_PATH) $(SAPI_PHPDBG_SHARED_PATH) $(OVERALL_TARGET) modules/* libs/*
 
 prof-use:
 	CCACHE_DISABLE=1 $(MAKE) PROF_FLAGS=-fprofile-use all
diff --git a/build/gen_stub.php b/build/gen_stub.php
index 8bdc64051cacd..c3f6330ae3637 100755
--- a/build/gen_stub.php
+++ b/build/gen_stub.php
@@ -83,14 +83,9 @@ function processStubFile(string $stubFile, Context $context, bool $includeOnly =
             }
         }
 
-        /* Because exit() and die() are proper token/keywords we need to hack-around */
-        $hasSpecialExitAsFunctionHandling = str_ends_with($stubFile, 'zend_builtin_functions.stub.php');
         if (!$fileInfo = $context->parsedFiles[$stubFile] ?? null) {
             initPhpParser();
             $stubContent = $stubCode ?? file_get_contents($stubFile);
-            if ($hasSpecialExitAsFunctionHandling) {
-                $stubContent = str_replace(['exit', 'die'], ['exit_dummy', 'die_dummy'], $stubContent);
-            }
             $fileInfo = parseStubFile($stubContent);
             $context->parsedFiles[$stubFile] = $fileInfo;
 
@@ -124,9 +119,6 @@ function processStubFile(string $stubFile, Context $context, bool $includeOnly =
             $context->allConstInfos,
             $stubHash
         );
-        if ($hasSpecialExitAsFunctionHandling) {
-            $arginfoCode = str_replace(['exit_dummy', 'die_dummy'], ['exit', 'die'], $arginfoCode);
-        }
         if (($context->forceRegeneration || $stubHash !== $oldStubHash) && file_put_contents($arginfoFile, $arginfoCode)) {
             echo "Saved $arginfoFile\n";
         }
@@ -1291,6 +1283,9 @@ public function __construct(
         $this->attributes = $attributes;
         $this->framelessFunctionInfos = $framelessFunctionInfos;
         $this->exposedDocComment = $exposedDocComment;
+        if ($return->tentativeReturnType && $this->isFinalMethod()) {
+            throw new Exception("Tentative return inapplicable for final method");
+        }
     }
 
     public function isMethod(): bool
@@ -2918,6 +2913,100 @@ class PropertyInfo extends VariableLike
     public bool $isDocReadonly;
     public bool $isVirtual;
 
+    // Map possible variable names to the known string constant, see
+    // ZEND_KNOWN_STRINGS
+    private const PHP_80_KNOWN = [
+        "file" => "ZEND_STR_FILE",
+        "line" => "ZEND_STR_LINE",
+        "function" => "ZEND_STR_FUNCTION",
+        "class" => "ZEND_STR_CLASS",
+        "object" => "ZEND_STR_OBJECT",
+        "type" => "ZEND_STR_TYPE",
+        // ZEND_STR_OBJECT_OPERATOR and ZEND_STR_PAAMAYIM_NEKUDOTAYIM are
+        // not valid variable names
+        "args" => "ZEND_STR_ARGS",
+        "unknown" => "ZEND_STR_UNKNOWN",
+        "eval" => "ZEND_STR_EVAL",
+        "include" => "ZEND_STR_INCLUDE",
+        "require" => "ZEND_STR_REQUIRE",
+        "include_once" => "ZEND_STR_INCLUDE_ONCE",
+        "require_once" => "ZEND_STR_REQUIRE_ONCE",
+        "scalar" => "ZEND_STR_SCALAR",
+        "error_reporting" => "ZEND_STR_ERROR_REPORTING",
+        "static" => "ZEND_STR_STATIC",
+        // ZEND_STR_THIS cannot be used since $this cannot be reassigned
+        "value" => "ZEND_STR_VALUE",
+        "key" => "ZEND_STR_KEY",
+        "__invoke" => "ZEND_STR_MAGIC_INVOKE",
+        "previous" => "ZEND_STR_PREVIOUS",
+        "code" => "ZEND_STR_CODE",
+        "message" => "ZEND_STR_MESSAGE",
+        "severity" => "ZEND_STR_SEVERITY",
+        "string" => "ZEND_STR_STRING",
+        "trace" => "ZEND_STR_TRACE",
+        "scheme" => "ZEND_STR_SCHEME",
+        "host" => "ZEND_STR_HOST",
+        "port" => "ZEND_STR_PORT",
+        "user" => "ZEND_STR_USER",
+        "pass" => "ZEND_STR_PASS",
+        "path" => "ZEND_STR_PATH",
+        "query" => "ZEND_STR_QUERY",
+        "fragment" => "ZEND_STR_FRAGMENT",
+        "NULL" => "ZEND_STR_NULL",
+        "boolean" => "ZEND_STR_BOOLEAN",
+        "integer" => "ZEND_STR_INTEGER",
+        "double" => "ZEND_STR_DOUBLE",
+        "array" => "ZEND_STR_ARRAY",
+        "resource" => "ZEND_STR_RESOURCE",
+        // ZEND_STR_CLOSED_RESOURCE has a space in it
+        "name" => "ZEND_STR_NAME",
+        // ZEND_STR_ARGV and ZEND_STR_ARGC are superglobals that wouldn't be
+        // variable names
+        "Array" => "ZEND_STR_ARRAY_CAPITALIZED",
+        "bool" => "ZEND_STR_BOOL",
+        "int" => "ZEND_STR_INT",
+        "float" => "ZEND_STR_FLOAT",
+        "callable" => "ZEND_STR_CALLABLE",
+        "iterable" => "ZEND_STR_ITERABLE",
+        "void" => "ZEND_STR_VOID",
+        "false" => "ZEND_STR_FALSE",
+        "null" => "ZEND_STR_NULL_LOWERCASE",
+        "mixed" => "ZEND_STR_MIXED",
+    ];
+
+    // NEW in 8.1
+    private const PHP_81_KNOWN = [
+        "Unknown" => "ZEND_STR_UNKNOWN_CAPITALIZED",
+        "never" => "ZEND_STR_NEVER",
+        "__sleep" => "ZEND_STR_SLEEP",
+        "__wakeup" => "ZEND_STR_WAKEUP",
+        "cases" => "ZEND_STR_CASES",
+        "from" => "ZEND_STR_FROM",
+        "tryFrom" => "ZEND_STR_TRYFROM",
+        "tryfrom" => "ZEND_STR_TRYFROM_LOWERCASE",
+        // Omit ZEND_STR_AUTOGLOBAL_(SERVER|ENV|REQUEST)
+    ];
+
+    // NEW in 8.2
+    private const PHP_82_KNOWN = [
+        "true" => "ZEND_STR_TRUE",
+        "Traversable" => "ZEND_STR_TRAVERSABLE",
+        "count" => "ZEND_STR_COUNT",
+        "SensitiveParameter" => "ZEND_STR_SENSITIVEPARAMETER",
+    ];
+
+    // Only new string in 8.3 is ZEND_STR_CONST_EXPR_PLACEHOLDER which is
+    // not a valid variable name ("[constant expression]")
+
+    // NEW in 8.4
+    private const PHP_84_KNOWN = [
+        "exit" => "ZEND_STR_EXIT",
+        "Deprecated" => "ZEND_STR_DEPRECATED_CAPITALIZED",
+        "since" => "ZEND_STR_SINCE",
+        "get" => "ZEND_STR_GET",
+        "set" => "ZEND_STR_SET",
+    ];
+
     /**
      * @var AttributeInfo[] $attributes
      */
@@ -3003,8 +3092,8 @@ public function getDeclaration(array $allConstInfos): string {
             $code .= $defaultValue->initializeZval($zvalName);
         }
 
-        $code .= "\tzend_string *property_{$propertyName}_name = zend_string_init(\"$propertyName\", sizeof(\"$propertyName\") - 1, 1);\n";
-        $nameCode = "property_{$propertyName}_name";
+        [$stringInit, $nameCode, $stringRelease] = $this->getString($propertyName);
+        $code .= $stringInit;
 
         if ($this->exposedDocComment) {
             $commentCode = "property_{$propertyName}_comment";
@@ -3035,11 +3124,61 @@ public function getDeclaration(array $allConstInfos): string {
         );
         $code .= implode("", $flagsCode);
 
-        $code .= "\tzend_string_release(property_{$propertyName}_name);\n";
+        $code .= $stringRelease;
 
         return $code;
     }
 
+    /**
+     * Get an array of three strings:
+     *   - declaration of zend_string, if needed, or empty otherwise
+     *   - usage of that zend_string, or usage with ZSTR_KNOWN()
+     *   - freeing the zend_string, if needed
+     *
+     * @param string $propName
+     * @return string[]
+     */
+    private function getString(string $propName): array {
+        // Generally strings will not be known
+        $nameCode = "property_{$propName}_name";
+        $result = [
+            "\tzend_string *$nameCode = zend_string_init(\"$propName\", sizeof(\"$propName\") - 1, 1);\n",
+            $nameCode,
+            "\tzend_string_release($nameCode);\n"
+        ];
+        // If not set, use the current latest version
+        $allVersions = ALL_PHP_VERSION_IDS;
+        $minPhp = $phpVersionIdMinimumCompatibility ?? end($allVersions);
+        if ($minPhp < PHP_80_VERSION_ID) {
+            // No known strings in 7.0
+            return $result;
+        }
+        $include = self::PHP_80_KNOWN;
+        switch ($minPhp) {
+            case PHP_84_VERSION_ID:
+                $include = array_merge($include, self::PHP_84_KNOWN);
+                // Intentional fall through
+
+            case PHP_83_VERSION_ID:
+            case PHP_82_VERSION_ID:
+                $include = array_merge($include, self::PHP_82_KNOWN);
+                // Intentional fall through
+
+            case PHP_81_VERSION_ID:
+                $include = array_merge($include, self::PHP_81_KNOWN);
+                break;
+        }
+        if (array_key_exists($propName,$include)) {
+            $knownStr = $include[$propName];
+            return [
+                '',
+                "ZSTR_KNOWN($knownStr)",
+                '',
+            ];
+        }
+        return $result;
+    }
+
     /**
      * @return array
      */
@@ -3142,7 +3281,7 @@ public function generateCode(string $invocation, string $nameSuffix, array $allC
             $knowns["SensitiveParameter"] = "ZEND_STR_SENSITIVEPARAMETER";
         }
         if ($php84MinimumCompatibility) {
-            $knowns["Deprecated"] = "ZEND_STR_DEPRECATED";
+            $knowns["Deprecated"] = "ZEND_STR_DEPRECATED_CAPITALIZED";
             $knowns["since"] = "ZEND_STR_SINCE";
         }
 
@@ -6005,7 +6144,7 @@ function initPhpParser() {
     }
 
     $isInitialized = true;
-    $version = "5.0.0";
+    $version = "5.3.1";
     $phpParserDir = __DIR__ . "/PHP-Parser-$version";
     if (!is_dir($phpParserDir)) {
         installPhpParser($version, $phpParserDir);
diff --git a/build/php.m4 b/build/php.m4
index 176d4d414476f..e45b22b7665fc 100644
--- a/build/php.m4
+++ b/build/php.m4
@@ -2533,3 +2533,15 @@ AS_VAR_IF([php_var], [yes],
     [Define to 1 if the compiler supports the '$1' variable attribute.])])
 AS_VAR_POPDEF([php_var])
 ])
+
+dnl
+dnl PHP_REMOVE_OPTIMIZATION_FLAGS
+dnl
+dnl Removes known compiler optimization flags like -O, -O0, -O1, ..., -Ofast
+dnl from CFLAGS and CXXFLAGS.
+dnl
+AC_DEFUN([PHP_REMOVE_OPTIMIZATION_FLAGS], [
+  sed_script='s/\([[\t ]]\|^\)-O\([[0-9gsz]]\|fast\|\)\([[\t ]]\|$\)/\1/g'
+  CFLAGS=$(echo "$CFLAGS" | $SED -e "$sed_script")
+  CXXFLAGS=$(echo "$CXXFLAGS" | $SED -e "$sed_script")
+])
diff --git a/configure.ac b/configure.ac
index c7e36ca70c9fe..56c22f1a80f5d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,7 @@ dnl Basic autoconf initialization, generation of config.nice.
 dnl ----------------------------------------------------------------------------
 
 AC_PREREQ([2.68])
-AC_INIT([PHP],[8.4.0-dev],[https://github.com/php/php-src/issues],[php],[https://www.php.net])
+AC_INIT([PHP],[8.5.0-dev],[https://github.com/php/php-src/issues],[php],[https://www.php.net])
 AC_CONFIG_SRCDIR([main/php_version.h])
 AC_CONFIG_AUX_DIR([build])
 AC_PRESERVE_HELP_ORDER
@@ -664,28 +664,25 @@ AS_VAR_IF([php_cv_func_getaddrinfo], [yes],
 dnl on FreeBSD, copy_file_range() works only with the undocumented flag 0x01000000;
 dnl until the problem is fixed properly, copy_file_range() is used only on Linux
 AC_CACHE_CHECK([for copy_file_range], [php_cv_func_copy_file_range],
-[AC_RUN_IFELSE([AC_LANG_SOURCE([
-#ifdef __linux__
+[AC_COMPILE_IFELSE([AC_LANG_SOURCE([
+#ifndef __linux__
+# error "unsupported platform"
+#endif
 #ifndef _GNU_SOURCE
-#define _GNU_SOURCE
+# define _GNU_SOURCE
 #endif
 #include 
-#include 
-
-int main(void) {
-(void)copy_file_range(-1, 0, -1, 0, 0, 0);
 #if LINUX_VERSION_CODE < KERNEL_VERSION(5,3,0)
-#error "kernel too old"
-#else
-return 0;
+# error "kernel too old"
 #endif
+#include 
+int main(void)
+{
+  (void)copy_file_range(-1, 0, -1, 0, 0, 0);
+  return 0;
 }
-#else
-#error "unsupported platform"
-#endif
 ])],
 [php_cv_func_copy_file_range=yes],
-[php_cv_func_copy_file_range=no],
 [php_cv_func_copy_file_range=no])
 ])
 AS_VAR_IF([php_cv_func_copy_file_range], [yes],
@@ -785,11 +782,7 @@ AS_VAR_IF([PHP_GCOV], [yes], [
   PHP_ADD_MAKEFILE_FRAGMENT([$abs_srcdir/build/Makefile.gcov], [$abs_srcdir])
 
   dnl Remove all optimization flags from CFLAGS.
-  changequote({,})
-  dnl Discard known '-O...' flags, including just '-O', but do not remove only '-O' in '-Ounknown'
-  CFLAGS=$(echo "$CFLAGS" | $SED -e 's/-O\([0-9gsz]\|fast\|\)\([\t ]\|$\)//g')
-  CXXFLAGS=$(echo "$CXXFLAGS" | $SED -e 's/-O\([0-9gsz]\|fast\|\)\([\t ]\|$\)//g')
-  changequote([,])
+  PHP_REMOVE_OPTIMIZATION_FLAGS
 
   dnl Add the special gcc flags.
   CFLAGS="$CFLAGS -O0 -fprofile-arcs -ftest-coverage"
@@ -806,11 +799,7 @@ PHP_ARG_ENABLE([debug],
 AS_VAR_IF([PHP_DEBUG], [yes], [
   PHP_DEBUG=1
   ZEND_DEBUG=yes
-  changequote({,})
-  dnl Discard known '-O...' flags, including just '-O', but do not remove only '-O' in '-Ounknown'
-  CFLAGS=$(echo "$CFLAGS" | $SED -e 's/-O\([0-9gsz]\|fast\|\)\([\t ]\|$\)//g')
-  CXXFLAGS=$(echo "$CXXFLAGS" | $SED -e 's/-O\([0-9gsz]\|fast\|\)\([\t ]\|$\)//g')
-  changequote([,])
+  PHP_REMOVE_OPTIMIZATION_FLAGS
   dnl Add -O0 only if GCC or ICC is used.
   if test "$GCC" = "yes" || test "$ICC" = "yes"; then
     CFLAGS="$CFLAGS -O0"
@@ -1537,11 +1526,12 @@ AS_VAR_IF([PHP_UNDEFINED_SANITIZER], [yes],
     AC_CACHE_CHECK([whether to add -fno-sanitize=function],
     [php_cv_ubsan_no_function],
     [AC_RUN_IFELSE([AC_LANG_SOURCE([
-void foo(char *string) {}
-int main(void) {
-  void (*f)(void *) = (void (*)(void *))foo;
-  f("foo");
-}
+      void foo(char *string) { (void)string; }
+      int main(void) {
+        void (*f)(void *) = (void (*)(void *))foo;
+        f("foo");
+        return 0;
+      }
     ])],
     [php_cv_ubsan_no_function=no],
     [php_cv_ubsan_no_function=yes],
diff --git a/ext/bcmath/bcmath.c b/ext/bcmath/bcmath.c
index b7fef270c93d3..c7c5aeb700fbe 100644
--- a/ext/bcmath/bcmath.c
+++ b/ext/bcmath/bcmath.c
@@ -434,6 +434,61 @@ PHP_FUNCTION(bcmod)
 }
 /* }}} */
 
+PHP_FUNCTION(bcdivmod)
+{
+	zend_string *left, *right;
+	zend_long scale_param;
+	bool scale_param_is_null = 1;
+	bc_num first = NULL, second = NULL, quot = NULL, rem = NULL;
+	int scale = BCG(bc_precision);
+
+	ZEND_PARSE_PARAMETERS_START(2, 3)
+		Z_PARAM_STR(left)
+		Z_PARAM_STR(right)
+		Z_PARAM_OPTIONAL
+		Z_PARAM_LONG_OR_NULL(scale_param, scale_param_is_null)
+	ZEND_PARSE_PARAMETERS_END();
+
+	if (scale_param_is_null) {
+		scale = BCG(bc_precision);
+	} else if (bcmath_check_scale(scale_param, 3) == FAILURE) {
+		RETURN_THROWS();
+	} else {
+		scale = (int) scale_param;
+	}
+
+	BC_ARENA_SETUP;
+
+	if (php_str2num(&first, left) == FAILURE) {
+		zend_argument_value_error(1, "is not well-formed");
+		goto cleanup;
+	}
+
+	if (php_str2num(&second, right) == FAILURE) {
+		zend_argument_value_error(2, "is not well-formed");
+		goto cleanup;
+	}
+
+	if (!bc_divmod(first, second, ", &rem, scale)) {
+		zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero");
+		goto cleanup;
+	}
+
+	zval z_quot, z_rem;
+	ZVAL_STR(&z_quot, bc_num2str_ex(quot, 0));
+	ZVAL_STR(&z_rem, bc_num2str_ex(rem, scale));
+
+	RETVAL_ARR(zend_new_pair(&z_quot, &z_rem));
+
+	cleanup: {
+		bc_free_num(&first);
+		bc_free_num(&second);
+		bc_free_num(");
+		bc_free_num(&rem);
+		BC_ARENA_TEARDOWN;
+	};
+}
+
 /* {{{ Returns the value of an arbitrary precision number raised to the power of another reduced by a modulus */
 PHP_FUNCTION(bcpowmod)
 {
@@ -802,6 +857,7 @@ static int bcmath_number_compare(zval *op1, zval *op2);
 #else
 #  define CHECK_RET_SCALE_OVERFLOW(scale, origin_scale) (scale > INT_MAX || scale < origin_scale)
 #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)
 {
@@ -1119,10 +1175,10 @@ static zend_result bcmath_number_parse_num(zval *zv, zend_object **obj, zend_str
 
 			case IS_NULL:
 				*lval = 0;
-				return SUCCESS;
+				return FAILURE;
 
 			default:
-				return zend_parse_arg_str_or_long_slow(zv, str, lval, 1 /* dummy */) ? SUCCESS : FAILURE;
+				return zend_parse_arg_long_slow(zv, lval, 1 /* dummy */) ? SUCCESS : FAILURE;
 		}
 	}
 }
@@ -1178,9 +1234,17 @@ static zend_result bcmath_number_do_operation(uint8_t opcode, zval *ret_val, zva
 	bc_num n2 = NULL;
 	size_t n1_full_scale;
 	size_t n2_full_scale;
-	if (UNEXPECTED(bc_num_from_obj_or_str_or_long(&n1, &n1_full_scale, obj1, str1, lval1) == FAILURE ||
-		bc_num_from_obj_or_str_or_long(&n2, &n2_full_scale, obj2, str2, lval2) == FAILURE)) {
-		zend_value_error("Number is not well-formed");
+	if (UNEXPECTED(bc_num_from_obj_or_str_or_long(&n1, &n1_full_scale, obj1, str1, lval1) == FAILURE)) {
+		zend_value_error("Left string operand cannot be converted to BcMath\\Number");
+		goto fail;
+	}
+	if (UNEXPECTED(bc_num_from_obj_or_str_or_long(&n2, &n2_full_scale, obj2, str2, lval2) == FAILURE)) {
+		zend_value_error("Right string operand cannot be converted to BcMath\\Number");
+		goto fail;
+	}
+
+	if (UNEXPECTED(CHECK_SCALE_OVERFLOW(n1_full_scale) || CHECK_SCALE_OVERFLOW(n2_full_scale))) {
+		zend_value_error("scale must be between 0 and %d", INT_MAX);
 		goto fail;
 	}
 
@@ -1256,21 +1320,31 @@ static int bcmath_number_compare(zval *op1, zval *op2)
 	bc_num n1 = NULL;
 	bc_num n2 = NULL;
 
+	int ret = ZEND_UNCOMPARABLE;
+
 	if (UNEXPECTED(bcmath_number_parse_num(op1, &obj1, &str1, &lval1) == FAILURE)) {
-		goto fallback;
+		goto failure;
 	}
 
 	if (UNEXPECTED(bcmath_number_parse_num(op2, &obj2, &str2, &lval2) == FAILURE)) {
-		goto fallback;
+		goto failure;
 	}
 
-	if (UNEXPECTED(bc_num_from_obj_or_str_or_long(&n1, NULL, obj1, str1, lval1) == FAILURE ||
-		bc_num_from_obj_or_str_or_long(&n2, NULL, obj2, str2, lval2) == FAILURE)) {
-		goto fallback;
+	size_t n1_full_scale;
+	size_t n2_full_scale;
+	if (UNEXPECTED(bc_num_from_obj_or_str_or_long(&n1, &n1_full_scale, obj1, str1, lval1) == FAILURE ||
+		bc_num_from_obj_or_str_or_long(&n2, &n2_full_scale, obj2, str2, lval2) == FAILURE)) {
+		goto failure;
+	}
+
+	if (UNEXPECTED(CHECK_SCALE_OVERFLOW(n1_full_scale) || CHECK_SCALE_OVERFLOW(n2_full_scale))) {
+		zend_value_error("scale must be between 0 and %d", INT_MAX);
+		goto failure;
 	}
 
-	bcmath_compare_result ret = bc_compare(n1, n2, MAX(n1->n_scale, n2->n_scale));
+	ret = bc_compare(n1, n2, MAX(n1->n_scale, n2->n_scale));
 
+failure:
 	if (Z_TYPE_P(op1) != IS_OBJECT) {
 		bc_free_num(&n1);
 	}
@@ -1278,10 +1352,7 @@ static int bcmath_number_compare(zval *op1, zval *op2)
 		bc_free_num(&n2);
 	}
 
-	return (int) ret;
-
-fallback:
-	return zend_std_compare_objects(op1, op2);
+	return ret;
 }
 
 #define BCMATH_PARAM_NUMBER_OR_STR_OR_LONG(dest_obj, ce, dest_str, dest_long) \
@@ -1297,10 +1368,18 @@ static int bcmath_number_compare(zval *op1, zval *op2)
 static zend_always_inline zend_result bc_num_from_obj_or_str_or_long_with_err(
 	bc_num *num, size_t *scale, zend_object *obj, zend_string *str, zend_long lval, uint32_t arg_num)
 {
-	if (UNEXPECTED(bc_num_from_obj_or_str_or_long(num, scale, obj, str, lval) == FAILURE)) {
+	size_t full_scale = 0;
+	if (UNEXPECTED(bc_num_from_obj_or_str_or_long(num, &full_scale, obj, str, lval) == FAILURE)) {
 		zend_argument_value_error(arg_num, "is not well-formed");
 		return FAILURE;
 	}
+	if (UNEXPECTED(CHECK_SCALE_OVERFLOW(full_scale))) {
+		zend_argument_value_error(arg_num, "must be between 0 and %d", INT_MAX);
+		return FAILURE;
+	}
+	if (scale != NULL) {
+		*scale = full_scale;
+	}
 	return SUCCESS;
 }
 
@@ -1320,7 +1399,7 @@ PHP_METHOD(BcMath_Number, __construct)
 	}
 
 	bc_num num = NULL;
-	size_t scale;
+	size_t scale = 0;
 	if (bc_num_from_obj_or_str_or_long_with_err(&num, &scale, NULL, str, lval, 1) == FAILURE) {
 		bc_free_num(&num);
 		RETURN_THROWS();
@@ -1345,7 +1424,7 @@ static void bcmath_number_calc_method(INTERNAL_FUNCTION_PARAMETERS, uint8_t opco
 	ZEND_PARSE_PARAMETERS_END();
 
 	bc_num num = NULL;
-	size_t num_full_scale;
+	size_t num_full_scale = 0;
 	if (bc_num_from_obj_or_str_or_long_with_err(&num, &num_full_scale, num_obj, num_str, num_lval, 1) == FAILURE) {
 		goto fail;
 	}
@@ -1431,6 +1510,65 @@ PHP_METHOD(BcMath_Number, pow)
 	bcmath_number_calc_method(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_POW);
 }
 
+PHP_METHOD(BcMath_Number, divmod)
+{
+	zend_object *num_obj = NULL;
+	zend_string *num_str = NULL;
+	zend_long num_lval = 0;
+	zend_long scale_lval = 0;
+	bool scale_is_null = true;
+
+	ZEND_PARSE_PARAMETERS_START(1, 2)
+		BCMATH_PARAM_NUMBER_OR_STR_OR_LONG(num_obj, bcmath_number_ce, num_str, num_lval);
+		Z_PARAM_OPTIONAL
+		Z_PARAM_LONG_OR_NULL(scale_lval, scale_is_null);
+	ZEND_PARSE_PARAMETERS_END();
+
+	bc_num num = NULL;
+	size_t num_full_scale;
+	if (bc_num_from_obj_or_str_or_long_with_err(&num, &num_full_scale, num_obj, num_str, num_lval, 1) == FAILURE) {
+		goto fail;
+	}
+	if (bcmath_check_scale(scale_lval, 2) == FAILURE) {
+		goto fail;
+	}
+
+	bc_num quot = NULL;
+	bc_num rem = NULL;
+	size_t scale = scale_lval;
+	bcmath_number_obj_t *intern = get_bcmath_number_from_zval(ZEND_THIS);
+
+	if (scale_is_null) {
+		scale = MAX(intern->scale, num_full_scale);
+	}
+
+	if (!bc_divmod(intern->num, num, ", &rem, scale)) {
+		zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero");
+		goto fail;
+	}
+	bc_rm_trailing_zeros(quot);
+	bc_rm_trailing_zeros(rem);
+
+	if (num_obj == NULL) {
+		bc_free_num(&num);
+	}
+
+	bcmath_number_obj_t *quot_intern = bcmath_number_new_obj(quot, 0);
+	bcmath_number_obj_t *rem_intern = bcmath_number_new_obj(rem, scale);
+
+	zval z_quot, z_rem;
+	ZVAL_OBJ(&z_quot, "_intern->std);
+	ZVAL_OBJ(&z_rem, &rem_intern->std);
+
+	RETURN_ARR(zend_new_pair(&z_quot, &z_rem));
+
+fail:
+	if (num_obj == NULL) {
+		bc_free_num(&num);
+	}
+	RETURN_THROWS();
+}
+
 PHP_METHOD(BcMath_Number, powmod)
 {
 	zend_object *exponent_obj = NULL;
@@ -1570,7 +1708,7 @@ PHP_METHOD(BcMath_Number, compare)
 	ZEND_PARSE_PARAMETERS_END();
 
 	bc_num num = NULL;
-	size_t num_full_scale;
+	size_t num_full_scale = 0;
 	if (bc_num_from_obj_or_str_or_long_with_err(&num, &num_full_scale, num_obj, num_str, num_lval, 1) == FAILURE) {
 		goto fail;
 	}
@@ -1704,8 +1842,8 @@ PHP_METHOD(BcMath_Number, __unserialize)
 	}
 
 	bc_num num = NULL;
-	size_t scale;
-	if (php_str2num_ex(&num, Z_STR_P(zv), &scale) == FAILURE) {
+	size_t scale = 0;
+	if (php_str2num_ex(&num, Z_STR_P(zv), &scale) == FAILURE || CHECK_SCALE_OVERFLOW(scale)) {
 		bc_free_num(&num);
 		goto fail;
 	}
diff --git a/ext/bcmath/bcmath.stub.php b/ext/bcmath/bcmath.stub.php
index 79c1569e8462a..854a1d35497bc 100644
--- a/ext/bcmath/bcmath.stub.php
+++ b/ext/bcmath/bcmath.stub.php
@@ -19,6 +19,12 @@ function bcdiv(string $num1, string $num2, ?int $scale = null): string {}
     /** @refcount 1 */
     function bcmod(string $num1, string $num2, ?int $scale = null): string {}
 
+    /**
+     * @return string[]
+     * @refcount 1
+     */
+    function bcdivmod(string $num1, string $num2, ?int $scale = null): array {}
+
     /** @refcount 1 */
     function bcpowmod(string $num, string $exponent, string $modulus, ?int $scale = null): string {}
 
@@ -64,6 +70,9 @@ public function div(Number|string|int $num, ?int $scale = null): Number {}
 
         public function mod(Number|string|int $num, ?int $scale = null): Number {}
 
+        /** @return Number[] */
+        public function divmod(Number|string|int $num, ?int $scale = null): array {}
+
         public function powmod(Number|string|int $exponent, Number|string|int $modulus, ?int $scale = null): Number {}
 
         public function pow(Number|string|int $exponent, ?int $scale = null): Number {}
diff --git a/ext/bcmath/bcmath_arginfo.h b/ext/bcmath/bcmath_arginfo.h
index 12a0fa6800e0c..9edfd5cd65760 100644
--- a/ext/bcmath/bcmath_arginfo.h
+++ b/ext/bcmath/bcmath_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: f3101bbd25da90d97801d53ea673789d1ce4f6a1 */
+ * Stub hash: 687d6fb392a9b0c1329152cc0f62341a73e427f4 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcadd, 0, 2, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, num1, IS_STRING, 0)
@@ -15,6 +15,12 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_bcmod arginfo_bcadd
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcdivmod, 0, 2, IS_ARRAY, 0)
+	ZEND_ARG_TYPE_INFO(0, num1, IS_STRING, 0)
+	ZEND_ARG_TYPE_INFO(0, num2, IS_STRING, 0)
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, scale, IS_LONG, 1, "null")
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_bcpowmod, 0, 3, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, num, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, exponent, IS_STRING, 0)
@@ -72,6 +78,11 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_BcMath_Number_mod arginfo_class_BcMath_Number_add
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_BcMath_Number_divmod, 0, 1, IS_ARRAY, 0)
+	ZEND_ARG_OBJ_TYPE_MASK(0, num, BcMath\\\116umber, MAY_BE_STRING|MAY_BE_LONG, NULL)
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, scale, IS_LONG, 1, "null")
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_BcMath_Number_powmod, 0, 2, BcMath\\\116umber, 0)
 	ZEND_ARG_OBJ_TYPE_MASK(0, exponent, BcMath\\\116umber, MAY_BE_STRING|MAY_BE_LONG, NULL)
 	ZEND_ARG_OBJ_TYPE_MASK(0, modulus, BcMath\\\116umber, MAY_BE_STRING|MAY_BE_LONG, NULL)
@@ -117,6 +128,7 @@ ZEND_FUNCTION(bcsub);
 ZEND_FUNCTION(bcmul);
 ZEND_FUNCTION(bcdiv);
 ZEND_FUNCTION(bcmod);
+ZEND_FUNCTION(bcdivmod);
 ZEND_FUNCTION(bcpowmod);
 ZEND_FUNCTION(bcpow);
 ZEND_FUNCTION(bcsqrt);
@@ -131,6 +143,7 @@ ZEND_METHOD(BcMath_Number, sub);
 ZEND_METHOD(BcMath_Number, mul);
 ZEND_METHOD(BcMath_Number, div);
 ZEND_METHOD(BcMath_Number, mod);
+ZEND_METHOD(BcMath_Number, divmod);
 ZEND_METHOD(BcMath_Number, powmod);
 ZEND_METHOD(BcMath_Number, pow);
 ZEND_METHOD(BcMath_Number, sqrt);
@@ -148,6 +161,7 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(bcmul, arginfo_bcmul)
 	ZEND_FE(bcdiv, arginfo_bcdiv)
 	ZEND_FE(bcmod, arginfo_bcmod)
+	ZEND_FE(bcdivmod, arginfo_bcdivmod)
 	ZEND_FE(bcpowmod, arginfo_bcpowmod)
 	ZEND_FE(bcpow, arginfo_bcpow)
 	ZEND_FE(bcsqrt, arginfo_bcsqrt)
@@ -166,6 +180,7 @@ static const zend_function_entry class_BcMath_Number_methods[] = {
 	ZEND_ME(BcMath_Number, mul, arginfo_class_BcMath_Number_mul, ZEND_ACC_PUBLIC)
 	ZEND_ME(BcMath_Number, div, arginfo_class_BcMath_Number_div, ZEND_ACC_PUBLIC)
 	ZEND_ME(BcMath_Number, mod, arginfo_class_BcMath_Number_mod, ZEND_ACC_PUBLIC)
+	ZEND_ME(BcMath_Number, divmod, arginfo_class_BcMath_Number_divmod, ZEND_ACC_PUBLIC)
 	ZEND_ME(BcMath_Number, powmod, arginfo_class_BcMath_Number_powmod, ZEND_ACC_PUBLIC)
 	ZEND_ME(BcMath_Number, pow, arginfo_class_BcMath_Number_pow, ZEND_ACC_PUBLIC)
 	ZEND_ME(BcMath_Number, sqrt, arginfo_class_BcMath_Number_sqrt, ZEND_ACC_PUBLIC)
@@ -189,9 +204,7 @@ static zend_class_entry *register_class_BcMath_Number(zend_class_entry *class_en
 
 	zval property_value_default_value;
 	ZVAL_UNDEF(&property_value_default_value);
-	zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1);
-	zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_value_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_VALUE), &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_scale_default_value;
 	ZVAL_UNDEF(&property_scale_default_value);
diff --git a/ext/bcmath/libbcmath/src/bcmath.h b/ext/bcmath/libbcmath/src/bcmath.h
index daf4642e6a323..f346624b09ed5 100644
--- a/ext/bcmath/libbcmath/src/bcmath.h
+++ b/ext/bcmath/libbcmath/src/bcmath.h
@@ -74,11 +74,6 @@ typedef struct bc_struct {
 #define MAX(a, b)      ((a)>(b)?(a):(b))
 #define MIN(a, b)      ((a)>(b)?(b):(a))
 
-#ifndef LONG_MAX
-#define LONG_MAX 0x7fffffff
-#endif
-
-
 /* Function Prototypes */
 
 void bc_init_numbers(void);
@@ -150,6 +145,8 @@ bc_num bc_multiply(bc_num n1, bc_num n2, size_t scale);
 	*(result) = mul_ex;                             \
 } while (0)
 
+bc_num bc_square(bc_num n1, size_t scale);
+
 bool bc_divide(bc_num n1, bc_num n2, bc_num *quot, size_t scale);
 
 bool bc_modulo(bc_num num1, bc_num num2, bc_num *resul, size_t scale);
diff --git a/ext/bcmath/libbcmath/src/raise.c b/ext/bcmath/libbcmath/src/raise.c
index a503e77a1a4a4..162f84a830538 100644
--- a/ext/bcmath/libbcmath/src/raise.c
+++ b/ext/bcmath/libbcmath/src/raise.c
@@ -34,13 +34,16 @@
 #include 
 #include 
 
+void bc_square_ex(bc_num n1, bc_num *result, size_t scale_min) {
+	bc_num square_ex = bc_square(n1, scale_min);
+	bc_free_num(result);
+	*(result) = square_ex;
+}
 
 /* Raise NUM1 to the NUM2 power.  The result is placed in RESULT.
    Maximum exponent is LONG_MAX.  If a NUM2 is not an integer,
    only the integer part is used.  */
-
-void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale)
-{
+void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale) {
 	bc_num temp, power;
 	size_t rscale;
 	size_t pwrscale;
@@ -69,7 +72,7 @@ void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale)
 	pwrscale = num1->n_scale;
 	while ((exponent & 1) == 0) {
 		pwrscale = 2 * pwrscale;
-		bc_multiply_ex(power, power, &power, pwrscale);
+		bc_square_ex(power, &power, pwrscale);
 		exponent = exponent >> 1;
 	}
 	temp = bc_copy_num(power);
@@ -79,7 +82,7 @@ void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale)
 	/* Do the calculation. */
 	while (exponent > 0) {
 		pwrscale = 2 * pwrscale;
-		bc_multiply_ex(power, power, &power, pwrscale);
+		bc_square_ex(power, &power, pwrscale);
 		if ((exponent & 1) == 1) {
 			calcscale = pwrscale + calcscale;
 			bc_multiply_ex(temp, power, &temp, calcscale);
@@ -100,8 +103,7 @@ void bc_raise(bc_num num1, long exponent, bc_num *result, size_t scale)
 }
 
 /* This is used internally by BCMath */
-void bc_raise_bc_exponent(bc_num base, bc_num expo, bc_num *result, size_t scale)
-{
+void bc_raise_bc_exponent(bc_num base, bc_num expo, bc_num *result, size_t scale) {
 	/* Exponent must not have fractional part */
 	assert(expo->n_scale == 0);
 
diff --git a/ext/bcmath/libbcmath/src/recmul.c b/ext/bcmath/libbcmath/src/recmul.c
index 3341396236e67..b92a1045ac3b5 100644
--- a/ext/bcmath/libbcmath/src/recmul.c
+++ b/ext/bcmath/libbcmath/src/recmul.c
@@ -72,6 +72,64 @@ static inline void bc_fast_mul(bc_num n1, size_t n1len, bc_num n2, size_t n2len,
 	}
 }
 
+/*
+ * Equivalent of bc_fast_mul for small numbers to perform computations
+ * without using array.
+ */
+static inline void bc_fast_square(bc_num n1, size_t n1len, bc_num *prod)
+{
+	const char *n1end = n1->n_value + n1len - 1;
+
+	BC_VECTOR n1_vector = bc_partial_convert_to_vector(n1end, n1len);
+	BC_VECTOR prod_vector = n1_vector * n1_vector;
+
+	size_t prodlen = n1len + n1len;
+	*prod = bc_new_num_nonzeroed(prodlen, 0);
+	char *pptr = (*prod)->n_value;
+	char *pend = pptr + prodlen - 1;
+
+	while (pend >= pptr) {
+		*pend-- = prod_vector % BASE;
+		prod_vector /= BASE;
+	}
+}
+
+/* Common part of functions bc_standard_mul and bc_standard_square
+ * that takes a vector and converts it to a bc_num 	*/
+static inline void bc_mul_finish_from_vector(BC_VECTOR *prod_vector, size_t prod_arr_size, size_t prodlen, bc_num *prod) {
+	/*
+	 * Move a value exceeding 4/8 digits by carrying to the next digit.
+	 * However, the last digit does nothing.
+	 */
+	bc_mul_carry_calc(prod_vector, prod_arr_size);
+
+	/* Convert to bc_num */
+	*prod = bc_new_num_nonzeroed(prodlen, 0);
+	char *pptr = (*prod)->n_value;
+	char *pend = pptr + prodlen - 1;
+	size_t i = 0;
+	while (i < prod_arr_size - 1) {
+#if BC_VECTOR_SIZE == 4
+		bc_write_bcd_representation(prod_vector[i], pend - 3);
+		pend -= 4;
+#else
+		bc_write_bcd_representation(prod_vector[i] / 10000, pend - 7);
+		bc_write_bcd_representation(prod_vector[i] % 10000, pend - 3);
+		pend -= 8;
+#endif
+		i++;
+	}
+
+	/*
+	 * The last digit may carry over.
+	 * Also need to fill it to the end with zeros, so loop until the end of the string.
+	 */
+	while (pend >= pptr) {
+		*pend-- = prod_vector[i] % BASE;
+		prod_vector[i] /= BASE;
+	}
+}
+
 /*
  * Converts the BCD of bc_num by 4 (32 bits) or 8 (64 bits) digits to an array of BC_VECTOR.
  * The array is generated starting with the smaller digits.
@@ -128,42 +186,57 @@ static void bc_standard_mul(bc_num n1, size_t n1len, bc_num n2, size_t n2len, bc
 		}
 	}
 
-	/*
-	 * Move a value exceeding 4/8 digits by carrying to the next digit.
-	 * However, the last digit does nothing.
-	 */
-	bc_mul_carry_calc(prod_vector, prod_arr_size);
+	bc_mul_finish_from_vector(prod_vector, prod_arr_size, prodlen, prod);
 
-	/* Convert to bc_num */
-	*prod = bc_new_num_nonzeroed(prodlen, 0);
-	char *pptr = (*prod)->n_value;
-	char *pend = pptr + prodlen - 1;
-	i = 0;
-	while (i < prod_arr_size - 1) {
-#if BC_VECTOR_SIZE == 4
-		bc_write_bcd_representation(prod_vector[i], pend - 3);
-		pend -= 4;
-#else
-		bc_write_bcd_representation(prod_vector[i] / 10000, pend - 7);
-		bc_write_bcd_representation(prod_vector[i] % 10000, pend - 3);
-		pend -= 8;
-#endif
-		i++;
+	efree(buf);
+}
+
+/** This is bc_standard_mul implementation for square */
+static void bc_standard_square(bc_num n1, size_t n1len, bc_num *prod)
+{
+	size_t i;
+	const char *n1end = n1->n_value + n1len - 1;
+	size_t prodlen = n1len + n1len;
+
+	size_t n1_arr_size = (n1len + BC_VECTOR_SIZE - 1) / BC_VECTOR_SIZE;
+	size_t prod_arr_size = (prodlen + BC_VECTOR_SIZE - 1) / BC_VECTOR_SIZE;
+
+	BC_VECTOR *buf = safe_emalloc(n1_arr_size + n1_arr_size + prod_arr_size, sizeof(BC_VECTOR), 0);
+
+	BC_VECTOR *n1_vector = buf;
+	BC_VECTOR *prod_vector = n1_vector + n1_arr_size + n1_arr_size;
+
+	for (i = 0; i < prod_arr_size; i++) {
+		prod_vector[i] = 0;
 	}
 
-	/*
-	 * The last digit may carry over.
-	 * Also need to fill it to the end with zeros, so loop until the end of the string.
-	 */
-	while (pend >= pptr) {
-		*pend-- = prod_vector[i] % BASE;
-		prod_vector[i] /= BASE;
+	/* Convert to BC_VECTOR[] */
+	bc_convert_to_vector(n1_vector, n1end, n1len);
+
+	/* Multiplication and addition */
+	size_t count = 0;
+	for (i = 0; i < n1_arr_size; i++) {
+		/*
+		 * This calculation adds the result multiple times to the array entries.
+		 * When multiplying large numbers of digits, there is a possibility of
+		 * overflow, so digit adjustment is performed beforehand.
+		 */
+		if (UNEXPECTED(count >= BC_VECTOR_NO_OVERFLOW_ADD_COUNT)) {
+			bc_mul_carry_calc(prod_vector, prod_arr_size);
+			count = 0;
+		}
+		count++;
+		for (size_t j = 0; j < n1_arr_size; j++) {
+			prod_vector[i + j] += n1_vector[i] * n1_vector[j];
+		}
 	}
 
+	bc_mul_finish_from_vector(prod_vector, prod_arr_size, prodlen, prod);
+
 	efree(buf);
 }
 
-/* The multiply routine.  N2 times N1 is put int PROD with the scale of
+/* The multiply routine. N2 times N1 is put int PROD with the scale of
    the result being MIN(N2 scale+N1 scale, MAX (SCALE, N2 scale, N1 scale)).
    */
 
@@ -194,3 +267,25 @@ bc_num bc_multiply(bc_num n1, bc_num n2, size_t scale)
 	}
 	return prod;
 }
+
+bc_num bc_square(bc_num n1, size_t scale)
+{
+	bc_num prod;
+
+	size_t len1 = n1->n_len + n1->n_scale;
+	size_t full_scale = n1->n_scale + n1->n_scale;
+	size_t prod_scale = MIN(full_scale, MAX(scale, n1->n_scale));
+
+	if (len1 <= BC_VECTOR_SIZE) {
+		bc_fast_square(n1, len1, &prod);
+	} else {
+		bc_standard_square(n1, len1, &prod);
+	}
+
+	prod->n_sign = PLUS;
+	prod->n_len -= full_scale;
+	prod->n_scale = prod_scale;
+	_bc_rm_leading_zeros(prod);
+
+	return prod;
+}
diff --git a/ext/bcmath/tests/bcdivmod.phpt b/ext/bcmath/tests/bcdivmod.phpt
new file mode 100644
index 0000000000000..d69248c1ca4d4
--- /dev/null
+++ b/ext/bcmath/tests/bcdivmod.phpt
@@ -0,0 +1,46 @@
+--TEST--
+bcdivmod() function
+--EXTENSIONS--
+bcmath
+--INI--
+bcmath.scale=0
+--FILE--
+
+--EXPECT--
+done!
diff --git a/ext/bcmath/tests/bcdivmod_by_zero.phpt b/ext/bcmath/tests/bcdivmod_by_zero.phpt
new file mode 100644
index 0000000000000..4cf8111fc4918
--- /dev/null
+++ b/ext/bcmath/tests/bcdivmod_by_zero.phpt
@@ -0,0 +1,66 @@
+--TEST--
+bcdivmod() function div by zero
+--EXTENSIONS--
+bcmath
+--INI--
+bcmath.scale=0
+--FILE--
+getMessage() === 'Division by zero' ? 'OK' :'NG';
+            echo "\n";
+        }
+    }
+}
+?>
+--EXPECT--
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
diff --git a/ext/bcmath/tests/gh15968.phpt b/ext/bcmath/tests/gh15968.phpt
new file mode 100644
index 0000000000000..aa91534e7738d
--- /dev/null
+++ b/ext/bcmath/tests/gh15968.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GH-15968 BCMath\Number operators may typecast operand
+--EXTENSIONS--
+bcmath
+--FILE--
+getMessage();
+}
+?>
+--EXPECT--
+Unsupported operand types: BcMath\Number + MyString
diff --git a/ext/bcmath/tests/number/methods/div_mod_by_zero.phpt b/ext/bcmath/tests/number/methods/div_mod_by_zero.phpt
new file mode 100644
index 0000000000000..3dc76e207125c
--- /dev/null
+++ b/ext/bcmath/tests/number/methods/div_mod_by_zero.phpt
@@ -0,0 +1,157 @@
+--TEST--
+BcMath\Number div(), mod(), divmod() by zero
+--EXTENSIONS--
+bcmath
+--FILE--
+div($value2);
+            echo "NG\n";
+        } catch (Error $e) {
+            echo $e->getMessage() === 'Division by zero' ? 'OK' :'NG';
+            echo "\n";
+        }
+
+        echo "mod: ";
+        try {
+            $num->mod($value2);
+            echo "NG\n";
+        } catch (Error $e) {
+            echo $e->getMessage() === 'Modulo by zero' ? 'OK' :'NG';
+            echo "\n";
+        }
+
+        echo "divmod: ";
+        try {
+            $num->divmod($value2);
+            echo "NG\n";
+        } catch (Error $e) {
+            echo $e->getMessage() === 'Division by zero' ? 'OK' :'NG';
+            echo "\n";
+        }
+        echo "\n";
+    }
+}
+?>
+--EXPECT--
+100 and 0: int
+div: OK
+mod: OK
+divmod: OK
+
+100 and 0: int
+div: OK
+mod: OK
+divmod: OK
+
+100 and 0: string
+div: OK
+mod: OK
+divmod: OK
+
+100 and -0: string
+div: OK
+mod: OK
+divmod: OK
+
+100 and 0.000: string
+div: OK
+mod: OK
+divmod: OK
+
+100 and -0.000: string
+div: OK
+mod: OK
+divmod: OK
+
+100 and 0: object
+div: OK
+mod: OK
+divmod: OK
+
+100 and 0: object
+div: OK
+mod: OK
+divmod: OK
+
+100 and 0.000: object
+div: OK
+mod: OK
+divmod: OK
+
+100 and 0.000: object
+div: OK
+mod: OK
+divmod: OK
+
+-100 and 0: int
+div: OK
+mod: OK
+divmod: OK
+
+-100 and 0: int
+div: OK
+mod: OK
+divmod: OK
+
+-100 and 0: string
+div: OK
+mod: OK
+divmod: OK
+
+-100 and -0: string
+div: OK
+mod: OK
+divmod: OK
+
+-100 and 0.000: string
+div: OK
+mod: OK
+divmod: OK
+
+-100 and -0.000: string
+div: OK
+mod: OK
+divmod: OK
+
+-100 and 0: object
+div: OK
+mod: OK
+divmod: OK
+
+-100 and 0: object
+div: OK
+mod: OK
+divmod: OK
+
+-100 and 0.000: object
+div: OK
+mod: OK
+divmod: OK
+
+-100 and 0.000: object
+div: OK
+mod: OK
+divmod: OK
diff --git a/ext/bcmath/tests/number/methods/divmod.phpt b/ext/bcmath/tests/number/methods/divmod.phpt
new file mode 100644
index 0000000000000..a8070188aff44
--- /dev/null
+++ b/ext/bcmath/tests/number/methods/divmod.phpt
@@ -0,0 +1,226 @@
+--TEST--
+BcMath\Number divmod()
+--EXTENSIONS--
+bcmath
+--FILE--
+divmod($value2);
+        var_dump($quot, $rem);
+        echo "\n";
+    }
+}
+?>
+--EXPECT--
+100.012 divmod 100: int
+object(BcMath\Number)#4 (2) {
+  ["value"]=>
+  string(1) "1"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#5 (2) {
+  ["value"]=>
+  string(5) "0.012"
+  ["scale"]=>
+  int(3)
+}
+
+100.012 divmod -30: int
+object(BcMath\Number)#6 (2) {
+  ["value"]=>
+  string(2) "-3"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#7 (2) {
+  ["value"]=>
+  string(6) "10.012"
+  ["scale"]=>
+  int(3)
+}
+
+100.012 divmod -20: string
+object(BcMath\Number)#5 (2) {
+  ["value"]=>
+  string(2) "-5"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#4 (2) {
+  ["value"]=>
+  string(5) "0.012"
+  ["scale"]=>
+  int(3)
+}
+
+100.012 divmod 0.01: string
+object(BcMath\Number)#7 (2) {
+  ["value"]=>
+  string(5) "10001"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#6 (2) {
+  ["value"]=>
+  string(5) "0.002"
+  ["scale"]=>
+  int(3)
+}
+
+100.012 divmod -0.40: string
+object(BcMath\Number)#4 (2) {
+  ["value"]=>
+  string(4) "-250"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#5 (2) {
+  ["value"]=>
+  string(5) "0.012"
+  ["scale"]=>
+  int(3)
+}
+
+100.012 divmod 80.3: object
+object(BcMath\Number)#6 (2) {
+  ["value"]=>
+  string(1) "1"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#7 (2) {
+  ["value"]=>
+  string(6) "19.712"
+  ["scale"]=>
+  int(3)
+}
+
+100.012 divmod -50.6: object
+object(BcMath\Number)#5 (2) {
+  ["value"]=>
+  string(2) "-1"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#4 (2) {
+  ["value"]=>
+  string(6) "49.412"
+  ["scale"]=>
+  int(3)
+}
+
+-100.012 divmod 100: int
+object(BcMath\Number)#3 (2) {
+  ["value"]=>
+  string(2) "-1"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#6 (2) {
+  ["value"]=>
+  string(6) "-0.012"
+  ["scale"]=>
+  int(3)
+}
+
+-100.012 divmod -30: int
+object(BcMath\Number)#4 (2) {
+  ["value"]=>
+  string(1) "3"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#5 (2) {
+  ["value"]=>
+  string(7) "-10.012"
+  ["scale"]=>
+  int(3)
+}
+
+-100.012 divmod -20: string
+object(BcMath\Number)#6 (2) {
+  ["value"]=>
+  string(1) "5"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#3 (2) {
+  ["value"]=>
+  string(6) "-0.012"
+  ["scale"]=>
+  int(3)
+}
+
+-100.012 divmod 0.01: string
+object(BcMath\Number)#5 (2) {
+  ["value"]=>
+  string(6) "-10001"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#4 (2) {
+  ["value"]=>
+  string(6) "-0.002"
+  ["scale"]=>
+  int(3)
+}
+
+-100.012 divmod -0.40: string
+object(BcMath\Number)#3 (2) {
+  ["value"]=>
+  string(3) "250"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#6 (2) {
+  ["value"]=>
+  string(6) "-0.012"
+  ["scale"]=>
+  int(3)
+}
+
+-100.012 divmod 80.3: object
+object(BcMath\Number)#4 (2) {
+  ["value"]=>
+  string(2) "-1"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#5 (2) {
+  ["value"]=>
+  string(7) "-19.712"
+  ["scale"]=>
+  int(3)
+}
+
+-100.012 divmod -50.6: object
+object(BcMath\Number)#6 (2) {
+  ["value"]=>
+  string(1) "1"
+  ["scale"]=>
+  int(0)
+}
+object(BcMath\Number)#3 (2) {
+  ["value"]=>
+  string(7) "-49.412"
+  ["scale"]=>
+  int(3)
+}
diff --git a/ext/bcmath/tests/number/methods/divmod_with_scale.phpt b/ext/bcmath/tests/number/methods/divmod_with_scale.phpt
new file mode 100644
index 0000000000000..7ff4227b1807c
--- /dev/null
+++ b/ext/bcmath/tests/number/methods/divmod_with_scale.phpt
@@ -0,0 +1,43 @@
+--TEST--
+BcMath\Number divmod() with scale
+--EXTENSIONS--
+bcmath
+--FILE--
+divmod($value2, $scale);
+            if ($method_quot->compare($func_quot) !== 0) {
+                echo "Quot is incorrect.\n";
+                var_dump($value1, $value2, $scale, $func_quot, $method_quot);
+            }
+            if ($method_rem->compare($func_rem) !== 0) {
+                echo "Rem is incorrect.\n";
+                var_dump($value1, $value2, $scale, $func_rem, $method_rem);
+            }
+        }
+    }
+}
+echo 'done!';
+?>
+--EXPECT--
+done!
diff --git a/ext/bcmath/tests/number/operators/calc_non_numeric_string.phpt b/ext/bcmath/tests/number/operators/calc_non_numeric_string.phpt
index 5add03ffff326..d9fe499d921de 100644
--- a/ext/bcmath/tests/number/operators/calc_non_numeric_string.phpt
+++ b/ext/bcmath/tests/number/operators/calc_non_numeric_string.phpt
@@ -43,9 +43,9 @@ try {
 }
 ?>
 --EXPECT--
-Number is not well-formed
-Number is not well-formed
-Number is not well-formed
-Number is not well-formed
-Number is not well-formed
-Number is not well-formed
+Right string operand cannot be converted to BcMath\Number
+Right string operand cannot be converted to BcMath\Number
+Right string operand cannot be converted to BcMath\Number
+Right string operand cannot be converted to BcMath\Number
+Right string operand cannot be converted to BcMath\Number
+Right string operand cannot be converted to BcMath\Number
diff --git a/ext/bcmath/tests/number/operators/calc_null.phpt b/ext/bcmath/tests/number/operators/calc_null.phpt
new file mode 100644
index 0000000000000..a5745dc5e762b
--- /dev/null
+++ b/ext/bcmath/tests/number/operators/calc_null.phpt
@@ -0,0 +1,51 @@
+--TEST--
+BcMath\Number calc undefined var by operator
+--EXTENSIONS--
+bcmath
+--FILE--
+getMessage() . "\n";
+}
+
+try {
+    $num - null;
+} catch (Error $e) {
+    echo $e->getMessage() . "\n";
+}
+
+try {
+    $num * null;
+} catch (Error $e) {
+    echo $e->getMessage() . "\n";
+}
+
+try {
+    $num / null;
+} catch (Error $e) {
+    echo $e->getMessage() . "\n";
+}
+
+try {
+    $num % null;
+} catch (Error $e) {
+    echo $e->getMessage() . "\n";
+}
+
+try {
+    $num ** null;
+} catch (Error $e) {
+    echo $e->getMessage() . "\n";
+}
+?>
+--EXPECT--
+Unsupported operand types: BcMath\Number + null
+Unsupported operand types: BcMath\Number - null
+Unsupported operand types: BcMath\Number * null
+Unsupported operand types: BcMath\Number / null
+Unsupported operand types: BcMath\Number % null
+Unsupported operand types: BcMath\Number ** null
diff --git a/ext/bcmath/tests/number/operators/calc_undef.phpt b/ext/bcmath/tests/number/operators/calc_undef.phpt
index 7b05809c0568a..f7b188a8d2112 100644
--- a/ext/bcmath/tests/number/operators/calc_undef.phpt
+++ b/ext/bcmath/tests/number/operators/calc_undef.phpt
@@ -44,15 +44,19 @@ try {
 ?>
 --EXPECTF--
 Warning: Undefined variable $undef in %s
+Unsupported operand types: BcMath\Number + null
 
 Warning: Undefined variable $undef in %s
+Unsupported operand types: BcMath\Number - null
 
 Warning: Undefined variable $undef in %s
+Unsupported operand types: BcMath\Number * null
 
 Warning: Undefined variable $undef in %s
-Division by zero
+Unsupported operand types: BcMath\Number / null
 
 Warning: Undefined variable $undef in %s
-Modulo by zero
+Unsupported operand types: BcMath\Number % null
 
 Warning: Undefined variable $undef in %s
+Unsupported operand types: BcMath\Number ** null
diff --git a/ext/bcmath/tests/number/operators/compare_with_invalid_types.phpt b/ext/bcmath/tests/number/operators/compare_with_invalid_types.phpt
new file mode 100644
index 0000000000000..c03daf1a026b2
--- /dev/null
+++ b/ext/bcmath/tests/number/operators/compare_with_invalid_types.phpt
@@ -0,0 +1,105 @@
+--TEST--
+BcMath\Number compare by operator with non-sense
+--EXTENSIONS--
+bcmath
+--FILE--
+  {$type2}: " . ($value1 > $value2 ? 'true' : 'false') . "\n";
+    echo "{$value1} >= {$type2}: " . ($value1 >= $value2 ? 'true' : 'false') . "\n";
+    echo "{$value1} == {$type2}: " . ($value1 == $value2 ? 'true' : 'false') . "\n";
+    echo "{$value1} <= {$type2}: " . ($value1 <= $value2 ? 'true' : 'false') . "\n";
+    echo "{$value1} <  {$type2}: " . ($value1 < $value2 ? 'true' : 'false') . "\n";
+
+    echo "\ninversion\n";
+    echo "{$type2} >  {$value1}: " . ($value2 > $value1 ? 'true' : 'false') . "\n";
+    echo "{$type2} >= {$value1}: " . ($value2 >= $value1 ? 'true' : 'false') . "\n";
+    echo "{$type2} == {$value1}: " . ($value2 == $value1 ? 'true' : 'false') . "\n";
+    echo "{$type2} <= {$value1}: " . ($value2 <= $value1 ? 'true' : 'false') . "\n";
+    echo "{$type2} <  {$value1}: " . ($value2 < $value1 ? 'true' : 'false') . "\n";
+
+    echo "\n";
+}
+?>
+--EXPECT--
+========== with null ==========
+100.0000 >  null: true
+100.0000 >= null: true
+100.0000 == null: false
+100.0000 <= null: false
+100.0000 <  null: false
+
+inversion
+null >  100.0000: false
+null >= 100.0000: false
+null == 100.0000: false
+null <= 100.0000: true
+null <  100.0000: true
+
+========== with string ==========
+100.0000 >  string: false
+100.0000 >= string: false
+100.0000 == string: false
+100.0000 <= string: false
+100.0000 <  string: false
+
+inversion
+string >  100.0000: false
+string >= 100.0000: false
+string == 100.0000: false
+string <= 100.0000: false
+string <  100.0000: false
+
+========== with object ==========
+100.0000 >  object: false
+100.0000 >= object: false
+100.0000 == object: false
+100.0000 <= object: false
+100.0000 <  object: false
+
+inversion
+object >  100.0000: false
+object >= 100.0000: false
+object == 100.0000: false
+object <= 100.0000: false
+object <  100.0000: false
+
+========== with array ==========
+100.0000 >  array: false
+100.0000 >= array: false
+100.0000 == array: false
+100.0000 <= array: false
+100.0000 <  array: false
+
+inversion
+array >  100.0000: false
+array >= 100.0000: false
+array == 100.0000: false
+array <= 100.0000: false
+array <  100.0000: false
+
+========== with resource ==========
+100.0000 >  resource: false
+100.0000 >= resource: false
+100.0000 == resource: false
+100.0000 <= resource: false
+100.0000 <  resource: false
+
+inversion
+resource >  100.0000: false
+resource >= 100.0000: false
+resource == 100.0000: false
+resource <= 100.0000: false
+resource <  100.0000: false
diff --git a/ext/bz2/bz2.c b/ext/bz2/bz2.c
index 86de6a5ca5f2d..d95a4d5036800 100644
--- a/ext/bz2/bz2.c
+++ b/ext/bz2/bz2.c
@@ -439,40 +439,40 @@ PHP_FUNCTION(bzerror)
 /* {{{ Compresses a string into BZip2 encoded data */
 PHP_FUNCTION(bzcompress)
 {
-	char             *source;          /* Source data to compress */
-	zend_long              zblock_size = 0; /* Optional block size to use */
-	zend_long              zwork_factor = 0;/* Optional work factor to use */
-	zend_string      *dest = NULL;     /* Destination to place the compressed data into */
-	int               error,           /* Error Container */
-					  block_size  = 4, /* Block size for compression algorithm */
-					  work_factor = 0, /* Work factor for compression algorithm */
-					  argc = ZEND_NUM_ARGS(); /* Argument count */
-	size_t               source_len;      /* Length of the source data */
-	unsigned int      dest_len;        /* Length of the destination buffer */
-
-	if (zend_parse_parameters(argc, "s|ll", &source, &source_len, &zblock_size, &zwork_factor) == FAILURE) {
+	char        *source;           /* Source data to compress */
+	zend_long    zblock_size = 4;  /* Block size for compression algorithm */
+	zend_long    zwork_factor = 0; /* Work factor for compression algorithm */
+	zend_string *dest = NULL;      /* Destination to place the compressed data into */
+	size_t       source_len;       /* Length of the source data */
+	unsigned int dest_len;         /* Length of the destination buffer */
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|ll", &source, &source_len, &zblock_size, &zwork_factor) == FAILURE) {
 		RETURN_THROWS();
 	}
 
+	if (zblock_size < 1 || zblock_size > 9) {
+		zend_argument_value_error(2, "must be between 1 and 9");
+		RETURN_THROWS();
+	}
+	int block_size = (int) zblock_size;
+
+	if (zwork_factor < 0 || zwork_factor > 250) {
+		zend_argument_value_error(3, "must be between 0 and 250");
+		RETURN_THROWS();
+	}
+	int work_factor = (int) zwork_factor;
+
 	/* Assign them to easy to use variables, dest_len is initially the length of the data
 	   + .01 x length of data + 600 which is the largest size the results of the compression
 	   could possibly be, at least that's what the libbz2 docs say (thanks to jeremy@nirvani.net
 	   for pointing this out).  */
+	// TODO Check source string length fits in unsigned int
 	dest_len = (unsigned int) (source_len + (0.01 * source_len) + 600);
 
 	/* Allocate the destination buffer */
 	dest = zend_string_alloc(dest_len, 0);
 
-	/* Handle the optional arguments */
-	if (argc > 1) {
-		block_size = zblock_size;
-	}
-
-	if (argc > 2) {
-		work_factor = zwork_factor;
-	}
-
-	error = BZ2_bzBuffToBuffCompress(ZSTR_VAL(dest), &dest_len, source, source_len, block_size, 0, work_factor);
+	int error = BZ2_bzBuffToBuffCompress(ZSTR_VAL(dest), &dest_len, source, source_len, block_size, 0, work_factor);
 	if (error != BZ_OK) {
 		zend_string_efree(dest);
 		RETURN_LONG(error);
@@ -512,6 +512,7 @@ PHP_FUNCTION(bzdecompress)
 		RETURN_FALSE;
 	}
 
+	// TODO Check source string length fits in unsigned int
 	bzs.next_in = source;
 	bzs.avail_in = source_len;
 
diff --git a/ext/bz2/tests/005.phpt b/ext/bz2/tests/005.phpt
index 769cace33fb7c..d32d5b687f0f5 100644
--- a/ext/bz2/tests/005.phpt
+++ b/ext/bz2/tests/005.phpt
@@ -11,10 +11,6 @@ Getting lost within myself
 Nothing matters no one else";
 
 var_dump(bzcompress(1,1,1));
-var_dump(bzcompress($string, 100));
-var_dump(bzcompress($string, 100, -1));
-var_dump(bzcompress($string, 100, 1000));
-var_dump(bzcompress($string, -1, 1));
 
 $data = bzcompress($string);
 $data2 = bzcompress($string, 1, 10);
@@ -35,10 +31,6 @@ echo "Done\n";
 ?>
 --EXPECTF--
 string(%d) "BZ%a"
-int(-2)
-int(-2)
-int(-2)
-int(-2)
 int(-5)
 int(-5)
 int(-5)
diff --git a/ext/bz2/tests/bzcompress_programming_errors.phpt b/ext/bz2/tests/bzcompress_programming_errors.phpt
new file mode 100644
index 0000000000000..59c2643f66d2b
--- /dev/null
+++ b/ext/bz2/tests/bzcompress_programming_errors.phpt
@@ -0,0 +1,39 @@
+--TEST--
+bzcompress(): providing invalid options
+--EXTENSIONS--
+bz2
+--FILE--
+getMessage(), PHP_EOL;
+}
+try {
+    var_dump(bzcompress($string, 100));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+try {
+    var_dump(bzcompress($string, work_factor: -1));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+try {
+    var_dump(bzcompress($string, work_factor: 255));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: bzcompress(): Argument #2 ($block_size) must be between 1 and 9
+ValueError: bzcompress(): Argument #2 ($block_size) must be between 1 and 9
+ValueError: bzcompress(): Argument #3 ($work_factor) must be between 0 and 250
+ValueError: bzcompress(): Argument #3 ($work_factor) must be between 0 and 250
diff --git a/ext/calendar/cal_unix.c b/ext/calendar/cal_unix.c
index 78a08fdef0aa5..c3fe5557d244e 100644
--- a/ext/calendar/cal_unix.c
+++ b/ext/calendar/cal_unix.c
@@ -60,13 +60,13 @@ PHP_FUNCTION(jdtounix)
 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &uday) == FAILURE) {
 		RETURN_THROWS();
 	}
-	uday -= 2440588 /* J.D. of 1.1.1970 */;
-
-	if (uday < 0 || uday > ZEND_LONG_MAX / SECS_PER_DAY) { /* before beginning of unix epoch or greater than representable */
+	if (uday < 2440588 || (uday - 2440588) > (ZEND_LONG_MAX / SECS_PER_DAY)) { /* before beginning of unix epoch or greater than representable */
 		zend_value_error("jday must be between 2440588 and " ZEND_LONG_FMT, ZEND_LONG_MAX / SECS_PER_DAY + 2440588);
 		RETURN_THROWS();
 	}
 
+	uday -= 2440588 /* J.D. of 1.1.1970 */;
+
 	RETURN_LONG(uday * SECS_PER_DAY);
 }
 /* }}} */
diff --git a/ext/calendar/calendar.c b/ext/calendar/calendar.c
index f9212f621f7ea..a0503dab0600f 100644
--- a/ext/calendar/calendar.c
+++ b/ext/calendar/calendar.c
@@ -398,7 +398,7 @@ static char *heb_number_to_chars(int n, int fl, char **ret)
 		n -= 400;
 	}
 
-/* meot (hundreads) case */
+/* meot (hundreds) case */
 	if (n >= 100) {
 		*p = alef_bet[18 + n / 100];
 		p++;
diff --git a/ext/calendar/dow.c b/ext/calendar/dow.c
index 38da7e157c279..079dd6c15ada4 100644
--- a/ext/calendar/dow.c
+++ b/ext/calendar/dow.c
@@ -33,14 +33,7 @@
 int DayOfWeek(
 				 zend_long sdn)
 {
-	int dow;
-
-	dow = (sdn + 1) % 7;
-	if (dow >= 0) {
-		return (dow);
-	} else {
-		return (dow + 7);
-	}
+	return (int)(sdn % 7 + 8) % 7;
 }
 
 const char * const DayNameShort[7] =
diff --git a/ext/calendar/easter.c b/ext/calendar/easter.c
index d6ff54fa0f618..72c52e0fcff78 100644
--- a/ext/calendar/easter.c
+++ b/ext/calendar/easter.c
@@ -33,6 +33,7 @@ static void _cal_easter(INTERNAL_FUNCTION_PARAMETERS, bool gm)
 	struct tm te;
 	zend_long year, golden, solar, lunar, pfm, dom, tmp, easter, result;
 	zend_long method = CAL_EASTER_DEFAULT;
+	const zend_long max_year = (zend_long)(ZEND_LONG_MAX / 5) * 4;
 	bool year_is_null = 1;
 
 	if (zend_parse_parameters(ZEND_NUM_ARGS(),
@@ -53,6 +54,11 @@ static void _cal_easter(INTERNAL_FUNCTION_PARAMETERS, bool gm)
 		}
 	}
 
+	if (year <= 0 || year > max_year) {
+		zend_argument_value_error(1, "must be between 1 and " ZEND_LONG_FMT, max_year);
+		RETURN_THROWS();
+	}
+
 	#ifdef ZEND_ENABLE_ZVAL_LONG64
 	/* Compiling for 64bit, allow years between 1970 and 2.000.000.000 */
 	if (gm && year < 1970) {
diff --git a/ext/calendar/jewish.c b/ext/calendar/jewish.c
index 6e6232b45fc92..d86cb57067368 100644
--- a/ext/calendar/jewish.c
+++ b/ext/calendar/jewish.c
@@ -429,16 +429,31 @@ static void MoladOfMetonicCycle(
 								   zend_long *pMoladHalakim)
 {
 	register zend_ulong r1, r2, d1, d2;
+	zend_long chk;
 
 	/* Start with the time of the first molad after creation. */
 	r1 = NEW_MOON_OF_CREATION;
+	chk = (zend_long)metonicCycle;
+
+	if (chk > (ZEND_LONG_MAX - NEW_MOON_OF_CREATION) / (HALAKIM_PER_METONIC_CYCLE & 0xFFFF)) {
+		*pMoladDay = 0;
+		*pMoladHalakim = 0;
+		return;
+	}
 
 	/* Calculate metonicCycle * HALAKIM_PER_METONIC_CYCLE.  The upper 32
 	 * bits of the result will be in r2 and the lower 16 bits will be
 	 * in r1. */
-	r1 += metonicCycle * (HALAKIM_PER_METONIC_CYCLE & 0xFFFF);
+	r1 += chk * (HALAKIM_PER_METONIC_CYCLE & 0xFFFF);
+
+	if (chk > (ZEND_LONG_MAX - (r1 >> 16)) / ((HALAKIM_PER_METONIC_CYCLE >> 16) & 0xFFFF)) {
+		*pMoladDay = 0;
+		*pMoladHalakim = 0;
+		return;
+	}
+
 	r2 = r1 >> 16;
-	r2 += metonicCycle * ((HALAKIM_PER_METONIC_CYCLE >> 16) & 0xFFFF);
+	r2 += chk * ((HALAKIM_PER_METONIC_CYCLE >> 16) & 0xFFFF);
 
 	/* Calculate r2r1 / HALAKIM_PER_DAY.  The remainder will be in r1, the
 	 * upper 16 bits of the quotient will be in d2 and the lower 16 bits
diff --git a/ext/calendar/julian.c b/ext/calendar/julian.c
index ac580aa08e061..baff0771532ef 100644
--- a/ext/calendar/julian.c
+++ b/ext/calendar/julian.c
@@ -67,7 +67,7 @@
  *     the Julian calendar.
  *
  *     The details are unknown, but the lengths of the months were adjusted
- *     until they finally stablized in 8 A.D. with their current lengths:
+ *     until they finally stabilized in 8 A.D. with their current lengths:
  *
  *         January          31
  *         February         28/29
diff --git a/ext/calendar/tests/gh16228.phpt b/ext/calendar/tests/gh16228.phpt
new file mode 100644
index 0000000000000..9ce80688195ba
--- /dev/null
+++ b/ext/calendar/tests/gh16228.phpt
@@ -0,0 +1,26 @@
+--TEST--
+GH-16228 (easter_days, Overflow on year argument)
+--EXTENSIONS--
+calendar
+--FILE--
+getMessage() . PHP_EOL;
+}
+try {
+	easter_days(-1, 0);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	easter_date(PHP_INT_MAX, 0);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+?>
+--EXPECTF--
+easter_days(): Argument #1 ($year) must be between 1 and %d
+easter_days(): Argument #1 ($year) must be between 1 and %d
+easter_date(): Argument #1 ($year) must be between 1 and %d
diff --git a/ext/calendar/tests/gh16231.phpt b/ext/calendar/tests/gh16231.phpt
new file mode 100644
index 0000000000000..89b09dd3f63ae
--- /dev/null
+++ b/ext/calendar/tests/gh16231.phpt
@@ -0,0 +1,21 @@
+--TEST--
+GH-16231 (jdtounix argument overflow)
+--EXTENSIONS--
+calendar
+--FILE--
+getMessage() . PHP_EOL;
+}
+
+try {
+	jdtounix(240587);
+} catch (\ValueError $e) {
+	echo $e->getMessage();
+}
+?>
+--EXPECTF--
+jday must be between 2440588 and %d
+jday must be between 2440588 and %d
diff --git a/ext/calendar/tests/gh16234.phpt b/ext/calendar/tests/gh16234.phpt
new file mode 100644
index 0000000000000..03777986dc8c3
--- /dev/null
+++ b/ext/calendar/tests/gh16234.phpt
@@ -0,0 +1,11 @@
+--TEST--
+GH-16234 jewishtojd overflow on year argument
+--EXTENSIONS--
+calendar
+--FILE--
+
+--EXPECT--
+DONE
diff --git a/ext/calendar/tests/gh16258.phpt b/ext/calendar/tests/gh16258.phpt
new file mode 100644
index 0000000000000..9f2b70fac542b
--- /dev/null
+++ b/ext/calendar/tests/gh16258.phpt
@@ -0,0 +1,12 @@
+--TEST--
+GH-16258 (jddayofweek overflow on argument)
+--EXTENSIONS--
+calendar
+--FILE--
+
+--EXPECT--
+DONE
diff --git a/ext/com_dotnet/com_extension.c b/ext/com_dotnet/com_extension.c
index 1f18d2a8573ab..df8314fa7613e 100644
--- a/ext/com_dotnet/com_extension.c
+++ b/ext/com_dotnet/com_extension.c
@@ -182,6 +182,7 @@ PHP_MINIT_FUNCTION(com_dotnet)
 
 	php_com_saproxy_class_entry = register_class_com_safearray_proxy();
 /*	php_com_saproxy_class_entry->constructor->common.fn_flags |= ZEND_ACC_PROTECTED; */
+	php_com_saproxy_class_entry->create_object = php_com_saproxy_create_object;
 	php_com_saproxy_class_entry->default_object_handlers = &php_com_saproxy_handlers;
 	php_com_saproxy_class_entry->get_iterator = php_com_saproxy_iter_get;
 
diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c
index c68001b1b311f..ea0e9e47a13d9 100644
--- a/ext/com_dotnet/com_saproxy.c
+++ b/ext/com_dotnet/com_saproxy.c
@@ -57,6 +57,14 @@ typedef struct {
 
 #define SA_FETCH(zv)			(php_com_saproxy*)Z_OBJ_P(zv)
 
+zend_object *php_com_saproxy_create_object(zend_class_entry *class_type)
+{
+	php_com_saproxy *intern = emalloc(sizeof(*intern));
+	memset(intern, 0, sizeof(*intern));
+	zend_object_std_init(&intern->std, class_type);
+	return &intern->std;
+}
+
 static inline void clone_indices(php_com_saproxy *dest, php_com_saproxy *src, int ndims)
 {
 	int i;
@@ -317,7 +325,7 @@ static zend_function *saproxy_method_get(zend_object **object, zend_string *name
 
 static zend_function *saproxy_constructor_get(zend_object *object)
 {
-	/* user cannot instantiate */
+	zend_throw_error(NULL, "Cannot directly construct com_safeproxy_array; it is for internal usage only");
 	return NULL;
 }
 
@@ -365,7 +373,9 @@ static void saproxy_free_storage(zend_object *object)
 //???		}
 //???	}
 
-	OBJ_RELEASE(&proxy->obj->zo);
+	if (proxy->obj != NULL) {
+		OBJ_RELEASE(&proxy->obj->zo);
+	}
 
 	zend_object_std_dtor(object);
 
diff --git a/ext/com_dotnet/com_variant.c b/ext/com_dotnet/com_variant.c
index 0a6cc5e169f76..2e254e51a6c56 100644
--- a/ext/com_dotnet/com_variant.c
+++ b/ext/com_dotnet/com_variant.c
@@ -26,8 +26,7 @@
 
 /* create an automation SafeArray from a PHP array.
  * Only creates a single-dimensional array of variants.
- * The keys of the PHP hash MUST be numeric.  If the array
- * is sparse, then the gaps will be filled with NULL variants */
+ * The keys of the PHP hash MUST be numeric. */
 static void safe_array_from_zval(VARIANT *v, zval *z, int codepage)
 {
 	SAFEARRAY *sa = NULL;
@@ -71,7 +70,9 @@ static void safe_array_from_zval(VARIANT *v, zval *z, int codepage)
 			break;
 		}
 		zend_hash_get_current_key_ex(Z_ARRVAL_P(z), &strindex, &intindex, &pos);
-		php_com_variant_from_zval(&va[intindex], item, codepage);
+		if (intindex < bound.cElements) {
+			php_com_variant_from_zval(&va[intindex], item, codepage);
+		}
 	}
 
 	/* Unlock it and stuff it into our variant */
diff --git a/ext/com_dotnet/com_wrapper.c b/ext/com_dotnet/com_wrapper.c
index e505dc654026f..42698a2e651f5 100644
--- a/ext/com_dotnet/com_wrapper.c
+++ b/ext/com_dotnet/com_wrapper.c
@@ -258,9 +258,11 @@ static HRESULT STDMETHODCALLTYPE disp_invokeex(
 		 * and expose it as a COM exception */
 
 		if (wFlags & DISPATCH_PROPERTYGET) {
-			retval = zend_read_property(Z_OBJCE(disp->object), Z_OBJ(disp->object), Z_STRVAL_P(name), Z_STRLEN_P(name)+1, 1, &rv);
+			retval = zend_read_property(Z_OBJCE(disp->object), Z_OBJ(disp->object), Z_STRVAL_P(name), Z_STRLEN_P(name), 1, &rv);
+			ret = S_OK;
 		} else if (wFlags & DISPATCH_PROPERTYPUT) {
 			zend_update_property(Z_OBJCE(disp->object), Z_OBJ(disp->object), Z_STRVAL_P(name), Z_STRLEN_P(name), ¶ms[0]);
+			ret = S_OK;
 		} else if (wFlags & DISPATCH_METHOD) {
 			zend_try {
 				retval = &rv;
@@ -305,7 +307,7 @@ static HRESULT STDMETHODCALLTYPE disp_invokeex(
 				VariantInit(pvarRes);
 				php_com_variant_from_zval(pvarRes, retval, COMG(code_page));
 			}
-			zval_ptr_dtor(retval);
+			// zval_ptr_dtor(retval); // TODO needed for function calls?
 		} else if (pvarRes) {
 			VariantInit(pvarRes);
 		}
@@ -425,7 +427,7 @@ static void generate_dispids(php_dispatchex *disp)
 	zend_string *name = NULL;
 	zval *tmp, tmp2;
 	int keytype;
-	zend_ulong pid;
+	zend_long pid;
 
 	if (disp->dispid_to_name == NULL) {
 		ALLOC_HASHTABLE(disp->dispid_to_name);
@@ -458,8 +460,8 @@ static void generate_dispids(php_dispatchex *disp)
 
 			/* add the mappings */
 			ZVAL_STR_COPY(&tmp2, name);
-			pid = zend_hash_next_free_element(disp->dispid_to_name);
-			zend_hash_index_update(disp->dispid_to_name, pid, &tmp2);
+			zend_hash_next_index_insert(disp->dispid_to_name, &tmp2);
+			pid = zend_hash_next_free_element(disp->dispid_to_name) - 1;
 
 			ZVAL_LONG(&tmp2, pid);
 			zend_hash_update(disp->name_to_dispid, name, &tmp2);
@@ -493,8 +495,8 @@ static void generate_dispids(php_dispatchex *disp)
 
 			/* add the mappings */
 			ZVAL_STR_COPY(&tmp2, name);
-			pid = zend_hash_next_free_element(disp->dispid_to_name);
-			zend_hash_index_update(disp->dispid_to_name, pid, &tmp2);
+			zend_hash_next_index_insert(disp->dispid_to_name, &tmp2);
+			pid = zend_hash_next_free_element(disp->dispid_to_name) - 1;
 
 			ZVAL_LONG(&tmp2, pid);
 			zend_hash_update(disp->name_to_dispid, name, &tmp2);
diff --git a/ext/com_dotnet/php_com_dotnet_internal.h b/ext/com_dotnet/php_com_dotnet_internal.h
index 6735afba94289..90c3ab2d40e41 100644
--- a/ext/com_dotnet/php_com_dotnet_internal.h
+++ b/ext/com_dotnet/php_com_dotnet_internal.h
@@ -76,6 +76,7 @@ extern zend_object_handlers php_com_object_handlers;
 void php_com_object_enable_event_sink(php_com_dotnet_object *obj, bool enable);
 
 /* com_saproxy.c */
+zend_object *php_com_saproxy_create_object(zend_class_entry *class_type);
 zend_object_iterator *php_com_saproxy_iter_get(zend_class_entry *ce, zval *object, int by_ref);
 void php_com_saproxy_create(zend_object *com_object, zval *proxy_out, zval *index);
 extern zend_object_handlers php_com_saproxy_handlers;
diff --git a/ext/com_dotnet/tests/gh8778.phpt b/ext/com_dotnet/tests/gh8778.phpt
index 7198f2add4bee..72f89f506e853 100644
--- a/ext/com_dotnet/tests/gh8778.phpt
+++ b/ext/com_dotnet/tests/gh8778.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug GH-8778 (Integer arithmethic with large number variants fails)
+Bug GH-8778 (Integer arithmetic with large number variants fails)
 --EXTENSIONS--
 com_dotnet
 --SKIPIF--
diff --git a/ext/com_dotnet/tests/saproxy_instantiate.phpt b/ext/com_dotnet/tests/saproxy_instantiate.phpt
new file mode 100644
index 0000000000000..303305add09e2
--- /dev/null
+++ b/ext/com_dotnet/tests/saproxy_instantiate.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Manual instantiation of com_safearray_proxy is not allowed
+--EXTENSIONS--
+com_dotnet
+--FILE--
+getMessage(), PHP_EOL;
+}
+?>
+--EXPECT--
+Cannot directly construct com_safeproxy_array; it is for internal usage only
diff --git a/ext/com_dotnet/tests/variant_variation.phpt b/ext/com_dotnet/tests/variant_variation.phpt
new file mode 100644
index 0000000000000..c1f821715a14d
--- /dev/null
+++ b/ext/com_dotnet/tests/variant_variation.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Testing variant arrays
+--EXTENSIONS--
+com_dotnet
+--FILE--
+ [2 => 1, 1 => 2, 0 => 3],
+    "off" => [2 => 1, 1 => 2, 3],
+    "negative" => [-1 => 42],
+];
+foreach ($arrays as $desc => $array) {
+    echo "-- $desc --\n";
+    $v = new variant($array);
+    foreach ($v as $val) {
+        var_dump($val);
+    }
+}
+?>
+--EXPECTF--
+-- order --
+int(3)
+int(2)
+int(1)
+-- off --
+NULL
+int(2)
+int(1)
+-- negative --
+%ANULL
diff --git a/ext/com_dotnet/tests/variant_variation2.phpt b/ext/com_dotnet/tests/variant_variation2.phpt
new file mode 100644
index 0000000000000..5a93967b26383
--- /dev/null
+++ b/ext/com_dotnet/tests/variant_variation2.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Testing reading and writing of properties
+--EXTENSIONS--
+com_dotnet
+--FILE--
+foo);
+var_dump($v->bar);
+$v->foo = "new foo";
+var_dump($v->foo instanceof variant);
+var_dump((string) $v->foo);
+var_dump($o->foo instanceof variant);
+var_dump((string) $o->foo);
+$v->bar = "new bar";
+var_dump($v->bar);
+var_dump($o->bar);
+?>
+--EXPECT--
+string(3) "foo"
+string(3) "bar"
+bool(true)
+string(7) "new foo"
+bool(true)
+string(7) "new foo"
+string(7) "new bar"
+string(7) "new bar"
diff --git a/ext/ctype/tests/ctype_xdigit_variation1.phpt b/ext/ctype/tests/ctype_xdigit_variation1.phpt
index 3dbd7cec37667..0db93fd7db25f 100644
--- a/ext/ctype/tests/ctype_xdigit_variation1.phpt
+++ b/ext/ctype/tests/ctype_xdigit_variation1.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Test ctype_xdigit() function : usage variations - different data typse as $c arg
+Test ctype_xdigit() function : usage variations - different data types as $c arg
 --EXTENSIONS--
 ctype
 --FILE--
diff --git a/ext/curl/curl.stub.php b/ext/curl/curl.stub.php
index e6245aab073e2..8a20231da562b 100644
--- a/ext/curl/curl.stub.php
+++ b/ext/curl/curl.stub.php
@@ -486,6 +486,48 @@
  */
 const CURLOPT_XFERINFOFUNCTION = UNKNOWN;
 
+/**
+ * @var int
+ * @cvalue CURLOPT_DEBUGFUNCTION
+ */
+const CURLOPT_DEBUGFUNCTION = UNKNOWN;
+
+/**
+ * @var int
+ * @cvalue CURLINFO_TEXT
+ */
+const CURLINFO_TEXT = UNKNOWN;
+
+/**
+ * @var int
+ * @cvalue CURLINFO_HEADER_IN
+ */
+const CURLINFO_HEADER_IN = UNKNOWN;
+
+/**
+ * @var int
+ * @cvalue CURLINFO_DATA_IN
+ */
+const CURLINFO_DATA_IN = UNKNOWN;
+
+/**
+ * @var int
+ * @cvalue CURLINFO_DATA_OUT
+ */
+const CURLINFO_DATA_OUT = UNKNOWN;
+
+/**
+ * @var int
+ * @cvalue CURLINFO_SSL_DATA_OUT
+ */
+const CURLINFO_SSL_DATA_OUT = UNKNOWN;
+
+/**
+ * @var int
+ * @cvalue CURLINFO_SSL_DATA_IN
+ */
+const CURLINFO_SSL_DATA_IN = UNKNOWN;
+
 /* */
 /**
  * @var int
@@ -3012,6 +3054,13 @@
  * @cvalue CURLINFO_TOTAL_TIME_T
  */
 const CURLINFO_TOTAL_TIME_T = UNKNOWN;
+#if LIBCURL_VERSION_NUM >= 0x080a00 /* Available since 8.10.0 */
+/**
+ * @var int
+ * @cvalue CURLINFO_POSTTRANSFER_TIME_T
+ */
+const CURLINFO_POSTTRANSFER_TIME_T = UNKNOWN;
+#endif
 /**
  * @var int
  * @cvalue CURLOPT_DISALLOW_USERNAME_IN_URL
@@ -3653,6 +3702,8 @@ function curl_upkeep(CurlHandle $handle): bool {}
 
 function curl_multi_add_handle(CurlMultiHandle $multi_handle, CurlHandle $handle): int {}
 
+function curl_multi_get_handles(CurlMultiHandle $multi_handle): array {}
+
 function curl_multi_close(CurlMultiHandle $multi_handle): void {}
 
 function curl_multi_errno(CurlMultiHandle $multi_handle): int {}
diff --git a/ext/curl/curl_arginfo.h b/ext/curl/curl_arginfo.h
index 99db69c3f7856..664cda7d32a97 100644
--- a/ext/curl/curl_arginfo.h
+++ b/ext/curl/curl_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 5aa5f230880f8373ef8ec378f7e600247332136e */
+ * Stub hash: e2800e5ecc33f092576c7afcdb98d89825809669 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_close, 0, 1, IS_VOID, 0)
 	ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
@@ -60,6 +60,10 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_add_handle, 0, 2, IS_
 	ZEND_ARG_OBJ_INFO(0, handle, CurlHandle, 0)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_get_handles, 0, 1, IS_ARRAY, 0)
+	ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_curl_multi_close, 0, 1, IS_VOID, 0)
 	ZEND_ARG_OBJ_INFO(0, multi_handle, CurlMultiHandle, 0)
 ZEND_END_ARG_INFO()
@@ -153,6 +157,7 @@ ZEND_FUNCTION(curl_init);
 ZEND_FUNCTION(curl_upkeep);
 #endif
 ZEND_FUNCTION(curl_multi_add_handle);
+ZEND_FUNCTION(curl_multi_get_handles);
 ZEND_FUNCTION(curl_multi_close);
 ZEND_FUNCTION(curl_multi_errno);
 ZEND_FUNCTION(curl_multi_exec);
@@ -190,6 +195,7 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(curl_upkeep, arginfo_curl_upkeep)
 #endif
 	ZEND_FE(curl_multi_add_handle, arginfo_curl_multi_add_handle)
+	ZEND_FE(curl_multi_get_handles, arginfo_curl_multi_get_handles)
 	ZEND_FE(curl_multi_close, arginfo_curl_multi_close)
 	ZEND_FE(curl_multi_errno, arginfo_curl_multi_errno)
 	ZEND_FE(curl_multi_exec, arginfo_curl_multi_exec)
@@ -312,6 +318,13 @@ static void register_curl_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("CURLOPT_WRITEFUNCTION", CURLOPT_WRITEFUNCTION, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("CURLOPT_WRITEHEADER", CURLOPT_WRITEHEADER, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("CURLOPT_XFERINFOFUNCTION", CURLOPT_XFERINFOFUNCTION, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CURLOPT_DEBUGFUNCTION", CURLOPT_DEBUGFUNCTION, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CURLINFO_TEXT", CURLINFO_TEXT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CURLINFO_HEADER_IN", CURLINFO_HEADER_IN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CURLINFO_DATA_IN", CURLINFO_DATA_IN, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CURLINFO_DATA_OUT", CURLINFO_DATA_OUT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CURLINFO_SSL_DATA_OUT", CURLINFO_SSL_DATA_OUT, CONST_PERSISTENT);
+	REGISTER_LONG_CONSTANT("CURLINFO_SSL_DATA_IN", CURLINFO_SSL_DATA_IN, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("CURLE_ABORTED_BY_CALLBACK", CURLE_ABORTED_BY_CALLBACK, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("CURLE_BAD_CALLING_ORDER", CURLE_BAD_CALLING_ORDER, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("CURLE_BAD_CONTENT_ENCODING", CURLE_BAD_CONTENT_ENCODING, CONST_PERSISTENT);
@@ -792,6 +805,9 @@ static void register_curl_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("CURLINFO_REDIRECT_TIME_T", CURLINFO_REDIRECT_TIME_T, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("CURLINFO_STARTTRANSFER_TIME_T", CURLINFO_STARTTRANSFER_TIME_T, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("CURLINFO_TOTAL_TIME_T", CURLINFO_TOTAL_TIME_T, CONST_PERSISTENT);
+#if LIBCURL_VERSION_NUM >= 0x080a00 /* Available since 8.10.0 */
+	REGISTER_LONG_CONSTANT("CURLINFO_POSTTRANSFER_TIME_T", CURLINFO_POSTTRANSFER_TIME_T, CONST_PERSISTENT);
+#endif
 	REGISTER_LONG_CONSTANT("CURLOPT_DISALLOW_USERNAME_IN_URL", CURLOPT_DISALLOW_USERNAME_IN_URL, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("CURLOPT_PROXY_TLS13_CIPHERS", CURLOPT_PROXY_TLS13_CIPHERS, CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("CURLOPT_TLS13_CIPHERS", CURLOPT_TLS13_CIPHERS, CONST_PERSISTENT);
diff --git a/ext/curl/curl_file_arginfo.h b/ext/curl/curl_file_arginfo.h
index bbf6900546a15..e409c6e772513 100644
--- a/ext/curl/curl_file_arginfo.h
+++ b/ext/curl/curl_file_arginfo.h
@@ -60,9 +60,7 @@ static zend_class_entry *register_class_CURLFile(void)
 
 	zval property_name_default_value;
 	ZVAL_EMPTY_STRING(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_mime_default_value;
 	ZVAL_EMPTY_STRING(&property_mime_default_value);
diff --git a/ext/curl/curl_private.h b/ext/curl/curl_private.h
index 011c4874e6140..8e8e9586db587 100644
--- a/ext/curl/curl_private.h
+++ b/ext/curl/curl_private.h
@@ -68,6 +68,7 @@ typedef struct {
 	zend_fcall_info_cache progress;
 	zend_fcall_info_cache xferinfo;
 	zend_fcall_info_cache fnmatch;
+	zend_fcall_info_cache debug;
 #if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
 	zend_fcall_info_cache prereq;
 #endif
@@ -88,7 +89,7 @@ struct _php_curl_send_headers {
 struct _php_curl_free {
 	zend_llist post;
 	zend_llist stream;
-	HashTable *slist;
+	HashTable slist;
 };
 
 typedef struct {
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index 3006b67dfce6d..677eaa8703af0 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -61,7 +61,7 @@
 
 #ifdef __GNUC__
 /* don't complain about deprecated CURLOPT_* we're exposing to PHP; we
-   need to keep using those to avoid breaking PHP API compatibiltiy */
+   need to keep using those to avoid breaking PHP API compatibility */
 # pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 #endif
 
@@ -504,6 +504,10 @@ static HashTable *curl_get_gc(zend_object *object, zval **table, int *n)
 		zend_get_gc_buffer_add_fcc(gc_buffer, &curl->handlers.fnmatch);
 	}
 
+	if (ZEND_FCC_INITIALIZED(curl->handlers.debug)) {
+		zend_get_gc_buffer_add_fcc(gc_buffer, &curl->handlers.debug);
+	}
+
 #if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
 	if (ZEND_FCC_INITIALIZED(curl->handlers.prereq)) {
 		zend_get_gc_buffer_add_fcc(gc_buffer, &curl->handlers.prereq);
@@ -915,18 +919,46 @@ static size_t curl_write_header(char *data, size_t size, size_t nmemb, void *ctx
 }
 /* }}} */
 
-static int curl_debug(CURL *cp, curl_infotype type, char *buf, size_t buf_len, void *ctx) /* {{{ */
+static int curl_debug(CURL *handle, curl_infotype type, char *data, size_t size, void *clientp) /* {{{ */
 {
-	php_curl *ch = (php_curl *)ctx;
+	php_curl *ch = (php_curl *)clientp;
 
-	if (type == CURLINFO_HEADER_OUT) {
-		if (ch->header.str) {
-			zend_string_release_ex(ch->header.str, 0);
-		}
-		ch->header.str = zend_string_init(buf, buf_len, 0);
-	}
+    #if PHP_CURL_DEBUG
+    	fprintf(stderr, "curl_debug() called\n");
+    	fprintf(stderr, "type = %d, data = %s\n", type, data);
+    #endif
+
+	// Implicitly store the headers for compatibility with CURLINFO_HEADER_OUT
+	// used as a Curl option. Previously, setting CURLINFO_HEADER_OUT set curl_debug
+	// as the CURLOPT_DEBUGFUNCTION and stored the debug data when type is set to
+	// CURLINFO_HEADER_OUT. For backward compatibility, we now store the headers
+	// but also call the user-callback function if available.
+    if (type == CURLINFO_HEADER_OUT) {
+    	if (ch->header.str) {
+    		zend_string_release_ex(ch->header.str, 0);
+    	}
+    	ch->header.str = zend_string_init(data, size, 0);
+    }
+
+    if (!ZEND_FCC_INITIALIZED(ch->handlers.debug)) {
+       	return 0;
+    }
+
+    zval args[3];
 
-	return 0;
+    GC_ADDREF(&ch->std);
+    ZVAL_OBJ(&args[0], &ch->std);
+    ZVAL_LONG(&args[1], type);
+    ZVAL_STRINGL(&args[2], data, size);
+
+    ch->in_callback = true;
+    zend_call_known_fcc(&ch->handlers.debug, NULL, /* param_count */ 3, args, /* named_params */ NULL);
+    ch->in_callback = false;
+
+    zval_ptr_dtor(&args[0]);
+    zval_ptr_dtor(&args[2]);
+
+    return 0;
 }
 /* }}} */
 
@@ -1096,6 +1128,7 @@ void init_curl_handle(php_curl *ch)
 	ch->handlers.progress = empty_fcall_info_cache;
 	ch->handlers.xferinfo = empty_fcall_info_cache;
 	ch->handlers.fnmatch = empty_fcall_info_cache;
+	ch->handlers.debug = empty_fcall_info_cache;
 #if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
 	ch->handlers.prereq = empty_fcall_info_cache;
 #endif
@@ -1110,8 +1143,7 @@ void init_curl_handle(php_curl *ch)
 	zend_llist_init(&ch->to_free->post,  sizeof(struct HttpPost *), (llist_dtor_func_t)curl_free_post,   0);
 	zend_llist_init(&ch->to_free->stream, sizeof(struct mime_data_cb_arg *), (llist_dtor_func_t)curl_free_cb_arg, 0);
 
-	ch->to_free->slist = emalloc(sizeof(HashTable));
-	zend_hash_init(ch->to_free->slist, 4, NULL, curl_free_slist, 0);
+	zend_hash_init(&ch->to_free->slist, 4, NULL, curl_free_slist, 0);
 	ZVAL_UNDEF(&ch->postfields);
 }
 
@@ -1269,6 +1301,7 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source)
 	php_curl_copy_fcc_with_option(ch, CURLOPT_PROGRESSDATA, &ch->handlers.progress, &source->handlers.progress);
 	php_curl_copy_fcc_with_option(ch, CURLOPT_XFERINFODATA, &ch->handlers.xferinfo, &source->handlers.xferinfo);
 	php_curl_copy_fcc_with_option(ch, CURLOPT_FNMATCH_DATA, &ch->handlers.fnmatch, &source->handlers.fnmatch);
+	php_curl_copy_fcc_with_option(ch, CURLOPT_DEBUGDATA, &ch->handlers.debug, &source->handlers.debug);
 #if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
 	php_curl_copy_fcc_with_option(ch, CURLOPT_PREREQDATA, &ch->handlers.prereq, &source->handlers.prereq);
 #endif
@@ -1278,7 +1311,6 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source)
 
 	ZVAL_COPY(&ch->private_data, &source->private_data);
 
-	efree(ch->to_free->slist);
 	efree(ch->to_free);
 	ch->to_free = source->to_free;
 	efree(ch->clone);
@@ -1597,12 +1629,17 @@ static bool php_curl_set_callable_handler(zend_fcall_info_cache *const handler_f
 }
 
 
-#define HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER(curl_ptr, constant_no_function, handler_type) \
+#define HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER(curl_ptr, constant_no_function, handler_type, default_method) \
 	case constant_no_function##FUNCTION: { \
 		bool result = php_curl_set_callable_handler(&curl_ptr->handlers.handler_type->fcc, zvalue, is_array_config, #constant_no_function "FUNCTION"); \
 		if (!result) { \
+			curl_ptr->handlers.handler_type->method = default_method; \
 			return FAILURE; \
 		} \
+		if (!ZEND_FCC_INITIALIZED(curl_ptr->handlers.handler_type->fcc)) { \
+			curl_ptr->handlers.handler_type->method = default_method; \
+			return SUCCESS; \
+		} \
 		curl_ptr->handlers.handler_type->method = PHP_CURL_USER; \
 		break; \
 	}
@@ -1625,13 +1662,15 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
 
 	switch (option) {
 		/* Callable options */
-		HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER(ch, CURLOPT_WRITE, write);
-		HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER(ch, CURLOPT_HEADER, write_header);
-		HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER(ch, CURLOPT_READ, read);
+		HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER(ch, CURLOPT_WRITE, write, PHP_CURL_STDOUT);
+		HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER(ch, CURLOPT_HEADER, write_header, PHP_CURL_IGNORE);
+		HANDLE_CURL_OPTION_CALLABLE_PHP_CURL_USER(ch, CURLOPT_READ, read, PHP_CURL_DIRECT);
 
 		HANDLE_CURL_OPTION_CALLABLE(ch, CURLOPT_PROGRESS, handlers.progress, curl_progress);
 		HANDLE_CURL_OPTION_CALLABLE(ch, CURLOPT_XFERINFO, handlers.xferinfo, curl_xferinfo);
 		HANDLE_CURL_OPTION_CALLABLE(ch, CURLOPT_FNMATCH_, handlers.fnmatch, curl_fnmatch);
+		HANDLE_CURL_OPTION_CALLABLE(ch, CURLOPT_DEBUG, handlers.debug, curl_debug);
+
 #if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
 		HANDLE_CURL_OPTION_CALLABLE(ch, CURLOPT_PREREQ, handlers.prereq, curl_prereqfunction);
 #endif
@@ -2124,9 +2163,9 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
 
 			if (slist) {
 				if ((*ch->clone) == 1) {
-					zend_hash_index_update_ptr(ch->to_free->slist, option, slist);
+					zend_hash_index_update_ptr(&ch->to_free->slist, option, slist);
 				} else {
-					zend_hash_next_index_insert_ptr(ch->to_free->slist, slist);
+					zend_hash_next_index_insert_ptr(&ch->to_free->slist, slist);
 				}
 			}
 
@@ -2216,6 +2255,11 @@ static zend_result _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue
 		}
 
 		case CURLINFO_HEADER_OUT:
+			if (ZEND_FCC_INITIALIZED(ch->handlers.debug)) {
+                zend_value_error("CURLINFO_HEADER_OUT option must not be set when the CURLOPT_DEBUGFUNCTION option is set");
+                return FAILURE;
+            }
+
 			if (zend_is_true(zvalue)) {
 				curl_easy_setopt(ch->cp, CURLOPT_DEBUGFUNCTION, curl_debug);
 				curl_easy_setopt(ch->cp, CURLOPT_DEBUGDATA, (void *)ch);
@@ -2557,6 +2601,11 @@ PHP_FUNCTION(curl_getinfo)
 		if (curl_easy_getinfo(ch->cp, CURLINFO_STARTTRANSFER_TIME_T, &co) == CURLE_OK) {
 			CAAL("starttransfer_time_us", co);
 		}
+#if LIBCURL_VERSION_NUM >= 0x080a00 /* Available since 8.10.0 */
+		if (curl_easy_getinfo(ch->cp, CURLINFO_POSTTRANSFER_TIME_T, &co) == CURLE_OK) {
+			CAAL("posttransfer_time_us", co);
+		}
+#endif
 		if (curl_easy_getinfo(ch->cp, CURLINFO_TOTAL_TIME_T, &co) == CURLE_OK) {
 			CAAL("total_time_us", co);
 		}
@@ -2757,8 +2806,7 @@ static void curl_free_obj(zend_object *object)
 		zend_llist_clean(&ch->to_free->post);
 		zend_llist_clean(&ch->to_free->stream);
 
-		zend_hash_destroy(ch->to_free->slist);
-		efree(ch->to_free->slist);
+		zend_hash_destroy(&ch->to_free->slist);
 		efree(ch->to_free);
 		efree(ch->clone);
 	}
@@ -2795,6 +2843,9 @@ static void curl_free_obj(zend_object *object)
 	if (ZEND_FCC_INITIALIZED(ch->handlers.fnmatch)) {
 		zend_fcc_dtor(&ch->handlers.fnmatch);
 	}
+	if (ZEND_FCC_INITIALIZED(ch->handlers.debug)) {
+		zend_fcc_dtor(&ch->handlers.debug);
+	}
 #if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
 	if (ZEND_FCC_INITIALIZED(ch->handlers.prereq)) {
 		zend_fcc_dtor(&ch->handlers.prereq);
@@ -2878,6 +2929,10 @@ static void _php_curl_reset_handlers(php_curl *ch)
 	if (ZEND_FCC_INITIALIZED(ch->handlers.fnmatch)) {
 		zend_fcc_dtor(&ch->handlers.fnmatch);
 	}
+
+	if (ZEND_FCC_INITIALIZED(ch->handlers.debug)) {
+		zend_fcc_dtor(&ch->handlers.debug);
+	}
 #if LIBCURL_VERSION_NUM >= 0x075000 /* Available since 7.80.0 */
 	if (ZEND_FCC_INITIALIZED(ch->handlers.prereq)) {
 		zend_fcc_dtor(&ch->handlers.prereq);
diff --git a/ext/curl/multi.c b/ext/curl/multi.c
index 275de581ae106..6456cf6f813e4 100644
--- a/ext/curl/multi.c
+++ b/ext/curl/multi.c
@@ -97,12 +97,14 @@ PHP_FUNCTION(curl_multi_add_handle)
 
 	_php_curl_cleanup_handle(ch);
 
-	Z_ADDREF_P(z_ch);
-	zend_llist_add_element(&mh->easyh, z_ch);
-
 	error = curl_multi_add_handle(mh->multi, ch->cp);
 	SAVE_CURLM_ERROR(mh, error);
 
+	if (error == CURLM_OK) {
+		Z_ADDREF_P(z_ch);
+		zend_llist_add_element(&mh->easyh, z_ch);
+	}
+
 	RETURN_LONG((zend_long) error);
 }
 /* }}} */
@@ -164,12 +166,37 @@ PHP_FUNCTION(curl_multi_remove_handle)
 	error = curl_multi_remove_handle(mh->multi, ch->cp);
 	SAVE_CURLM_ERROR(mh, error);
 
-	RETVAL_LONG((zend_long) error);
-	zend_llist_del_element(&mh->easyh, z_ch, (int (*)(void *, void *))curl_compare_objects);
+	if (error == CURLM_OK) {
+		zend_llist_del_element(&mh->easyh, z_ch, (int (*)(void *, void *))curl_compare_objects);
+	}
 
+	RETURN_LONG((zend_long) error);
 }
 /* }}} */
 
+PHP_FUNCTION(curl_multi_get_handles)
+{
+	zval      *z_mh;
+	php_curlm *mh;
+
+	ZEND_PARSE_PARAMETERS_START(1, 1)
+		Z_PARAM_OBJECT_OF_CLASS(z_mh, curl_multi_ce)
+	ZEND_PARSE_PARAMETERS_END();
+
+	mh = Z_CURL_MULTI_P(z_mh);
+
+	array_init(return_value);
+	zend_llist_position pos;
+	zval	*pz_ch;
+
+	for (pz_ch = (zval *)zend_llist_get_first_ex(&mh->easyh, &pos); pz_ch;
+		pz_ch = (zval *)zend_llist_get_next_ex(&mh->easyh, &pos)) {
+
+		Z_TRY_ADDREF_P(pz_ch);
+		add_next_index_zval(return_value, pz_ch);
+	}
+}
+
 /* {{{ Get all the sockets associated with the cURL extension, which can then be "selected" */
 PHP_FUNCTION(curl_multi_select)
 {
diff --git a/ext/curl/sync-constants.php b/ext/curl/sync-constants.php
index 8f35f7b05fa38..87868bb5b31d9 100755
--- a/ext/curl/sync-constants.php
+++ b/ext/curl/sync-constants.php
@@ -18,6 +18,7 @@
     'CURLOPT_PROGRESSDATA',
     'CURLOPT_XFERINFODATA',
     'CURLOPT_PREREQDATA',
+    'CURLOPT_DEBUGDATA',
 ];
 
 const IGNORED_PHP_CONSTANTS = [
diff --git a/ext/curl/tests/bug48203_multi.phpt b/ext/curl/tests/bug48203_multi.phpt
index 19077147a611e..ec9748517ab85 100644
--- a/ext/curl/tests/bug48203_multi.phpt
+++ b/ext/curl/tests/bug48203_multi.phpt
@@ -2,6 +2,13 @@
 Variation of bug #48203 with curl_multi_exec (Crash when file pointers passed to curl are closed before calling curl_multi_exec)
 --EXTENSIONS--
 curl
+--SKIPIF--
+
 --FILE--
 
 --FILE--
 
 --EXTENSIONS--
 curl
+--SKIPIF--
+
 --FILE--
 = 8.10.0");
+?>
+--FILE--
+ 0);
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+
diff --git a/ext/curl/tests/curl_multi_add_handle_lifecycle.phpt b/ext/curl/tests/curl_multi_add_handle_lifecycle.phpt
new file mode 100644
index 0000000000000..3027f0c331521
--- /dev/null
+++ b/ext/curl/tests/curl_multi_add_handle_lifecycle.phpt
@@ -0,0 +1,49 @@
+--TEST--
+curl_multi_add_handle does not hold onto the handle on failure
+--EXTENSIONS--
+curl
+--FILE--
+ $ch) {
+    curl_multi_remove_handle($mh, $ch);
+    unset($ch);
+    unset($toRemove[$i]);
+}
+echo "Removed", PHP_EOL;
+
+?>
+--EXPECTF--
+Removing
+MyClass::__destruct
+MyClass::__destruct
+Removed
diff --git a/ext/curl/tests/curl_multi_get_handles.phpt b/ext/curl/tests/curl_multi_get_handles.phpt
new file mode 100644
index 0000000000000..41413ac098489
--- /dev/null
+++ b/ext/curl/tests/curl_multi_get_handles.phpt
@@ -0,0 +1,71 @@
+--TEST--
+array curl_multi_get_handles ( CurlMultiHandle $mh );
+--EXTENSIONS--
+curl
+--FILE--
+
+--EXPECTF--
+Initializing %scurl_testdata1.txt.
+1 handles are attached
+Initializing %scurl_testdata2.txt.
+2 handles are attached
+Request to %scurl_testdata%d.txt finished.
+2 handles are attached
+1 handles are attached
+Success.
+Request to %scurl_testdata%d.txt finished.
+1 handles are attached
+0 handles are attached
+Success.
+0 handles are attached
diff --git a/ext/curl/tests/curl_multi_getcontent_basic3.phpt b/ext/curl/tests/curl_multi_getcontent_basic3.phpt
index 4e4f0fd21e71c..79002a56430d2 100644
--- a/ext/curl/tests/curl_multi_getcontent_basic3.phpt
+++ b/ext/curl/tests/curl_multi_getcontent_basic3.phpt
@@ -5,6 +5,13 @@ Rein Velt (rein@velt.org)
 #TestFest Utrecht 20090509
 --EXTENSIONS--
 curl
+--SKIPIF--
+
 --FILE--
 getMessage());
+}
+$chCopy = curl_copy_handle($ch);
+try {
+    var_dump(curl_setopt($chCopy, CURLINFO_HEADER_OUT, true));
+}
+catch (\ValueError $e) {
+    var_dump($e->getMessage());
+}
+var_dump(curl_setopt($chCopy, CURLOPT_DEBUGFUNCTION, null));
+var_dump(curl_setopt($chCopy, CURLINFO_HEADER_OUT, true));
+
+echo "\n===Test attempting to set CURLOPT_DEBUGFUNCTION while CURLINFO_HEADER_OUT does not throw===\n";
+$ch = curl_init();
+var_dump(curl_setopt($ch, CURLINFO_HEADER_OUT, true));
+var_dump(curl_setopt($ch, CURLOPT_DEBUGFUNCTION, null));
+var_dump(curl_setopt($ch, CURLINFO_HEADER_OUT, true));
+var_dump(curl_setopt($ch, CURLOPT_DEBUGFUNCTION, 'strlen'));
+$chCopy = curl_copy_handle($ch);
+var_dump(curl_setopt($ch, CURLOPT_DEBUGFUNCTION, 'strlen'));
+var_dump(curl_setopt($chCopy, CURLOPT_DEBUGFUNCTION, null));
+var_dump(curl_setopt($chCopy, CURLINFO_HEADER_OUT, 1));
+
+echo "\n===Test CURLOPT_DEBUGFUNCTION=null works===\n";
+$ch = curl_init("{$host}/get.inc?test=file");
+var_dump(curl_setopt($ch, CURLOPT_DEBUGFUNCTION, null));
+curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+var_dump(curl_exec($ch));
+
+echo "\n===Test CURLINFO_HEADER_OUT works while CURLOPT_DEBUGFUNCTION in effect===\n";
+$ch = curl_init("{$host}/get.inc?test=file");
+curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT));
+var_dump(curl_setopt($ch, CURLINFO_HEADER_OUT, true));
+var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT));
+var_dump(curl_setopt($ch, CURLOPT_DEBUGFUNCTION, static function() {}));
+var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT));
+var_dump($result = curl_exec($ch));
+var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT));
+
+echo "\n===Test CURLOPT_DEBUGFUNCTION can throw within callback===\n";
+$ch = curl_init("{$host}/get.inc?test=file");
+curl_setopt($ch, CURLOPT_DEBUGFUNCTION, static function() {
+    throw new \RuntimeException('This should get caught after verbose=true');
+});
+var_dump(curl_exec($ch));
+curl_setopt($ch, CURLOPT_VERBOSE, true);
+try {
+    var_dump($result = curl_exec($ch));
+}
+catch (\RuntimeException $e) {
+    var_dump($e->getMessage());
+}
+var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT));
+
+echo "\n===Test CURLOPT_DEBUGFUNCTION on shared handles work===\n";
+$ch = curl_init("{$host}/get.inc?test=file");
+$called = false;
+curl_setopt_array($ch, [
+    CURLOPT_VERBOSE => true,
+    CURLOPT_DEBUGFUNCTION => static function() use (&$called) {
+        $called = true;
+    },
+]);
+var_dump($called);
+curl_exec($ch);
+var_dump($called);
+$called = false;
+$ch2 = curl_copy_handle($ch);
+curl_exec($ch2);
+var_dump($called);
+var_dump(curl_getinfo($ch2, CURLINFO_HEADER_OUT));
+
+echo "\nDone";
+?>
+--EXPECTF--
+int(20094)
+
+===Testing with regular CURLOPT_VERBOSE with verbose=false===
+bool(true)
+
+===Testing with regular CURLOPT_VERBOSE on stderr===
+bool(true)
+
+===Testing with CURLOPT_DEBUGFUNCTION happy path===
+bool(true)
+Received stderr empty:
+string(0) ""
+string(0) ""
+bool(true)
+
+===Test attempting to set CURLINFO_HEADER_OUT while CURLOPT_DEBUGFUNCTION in effect throws===
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+string(87) "CURLINFO_HEADER_OUT option must not be set when the CURLOPT_DEBUGFUNCTION option is set"
+string(87) "CURLINFO_HEADER_OUT option must not be set when the CURLOPT_DEBUGFUNCTION option is set"
+bool(true)
+bool(true)
+
+===Test attempting to set CURLOPT_DEBUGFUNCTION while CURLINFO_HEADER_OUT does not throw===
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+bool(true)
+
+===Test CURLOPT_DEBUGFUNCTION=null works===
+bool(true)
+string(0) ""
+
+===Test CURLINFO_HEADER_OUT works while CURLOPT_DEBUGFUNCTION in effect===
+bool(false)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+string(0) ""
+string(%d) "GET /get.inc?test=file HTTP/%s
+Host: %s:%d
+Accept: */*
+
+"
+
+===Test CURLOPT_DEBUGFUNCTION can throw within callback===
+bool(true)
+string(41) "This should get caught after verbose=true"
+string(%d) "GET /get.inc?test=file HTTP/%s
+Host: %s:%d
+Accept: */*
+
+"
+
+===Test CURLOPT_DEBUGFUNCTION on shared handles work===
+bool(false)
+bool(true)
+bool(true)
+string(71) "GET /get.inc?test=file HTTP/%s
+Host: %s:%d
+Accept: */*
+
+"
+
+Done
diff --git a/ext/curl/tests/curl_setopt_callables.phpt b/ext/curl/tests/curl_setopt_callables.phpt
index 6cde8fef6d9c7..aaa83102afac9 100644
--- a/ext/curl/tests/curl_setopt_callables.phpt
+++ b/ext/curl/tests/curl_setopt_callables.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Test curl_setopt(_array)() with options that take callabes
+Test curl_setopt(_array)() with options that take callables
 --EXTENSIONS--
 curl
 --FILE--
diff --git a/ext/curl/tests/gh16359.phpt b/ext/curl/tests/gh16359.phpt
new file mode 100644
index 0000000000000..4cb5d7867bc97
--- /dev/null
+++ b/ext/curl/tests/gh16359.phpt
@@ -0,0 +1,16 @@
+--TEST--
+GH-16359 - curl_setopt with CURLOPT_WRITEFUNCTION and no user fn
+--EXTENSIONS--
+curl
+--FILE--
+
+--EXPECT--
+test
diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c
index a53fdc215472c..ea1602ef13b4e 100644
--- a/ext/date/lib/parse_date.c
+++ b/ext/date/lib/parse_date.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.0.3 on Thu Nov 23 16:02:28 2023 */
+/* Generated by re2c 1.0.3 on Wed Sep 11 17:29:29 2024 */
 #line 1 "ext/date/lib/parse_date.re"
 /*
  * The MIT License (MIT)
@@ -549,22 +549,26 @@ static timelib_ull timelib_get_signed_nr(Scanner *s, const char **ptr, int max_l
 	timelib_sll tmp_nr = 0;
 	int len = 0;
 
-	str = timelib_calloc(1, max_length + 2); // for sign and \0
-	str_ptr = str;
+	/* Skip over non-numeric chars */
 
 	while (((**ptr < '0') || (**ptr > '9')) && (**ptr != '+') && (**ptr != '-')) {
 		if (**ptr == '\0') {
 			add_error(s, TIMELIB_ERR_UNEXPECTED_DATA, "Found unexpected data");
-			timelib_free(str);
 			return 0;
 		}
 		++*ptr;
 	}
+	
+	/* Allocate string to feed to strtoll(): sign + length + '\0' */
+	str = timelib_calloc(1, max_length + 2);
+	str[0] = '+'; /* First position is the sign */
+	str_ptr = str + 1;
 
-	if ((**ptr == '+') || (**ptr == '-')) {
-		*str_ptr = **ptr;
+	while ((**ptr == '+') || (**ptr == '-')) {
+		if (**ptr == '-') {
+			str[0] = str[0] == '+' ? '-' : '+';
+		}
 		++*ptr;
-		++str_ptr;
 	}
 
 	while (((**ptr < '0') || (**ptr > '9'))) {
@@ -715,7 +719,7 @@ static const timelib_relunit* timelib_lookup_relunit(const char **ptr)
 
 static void add_with_overflow(Scanner *s, timelib_sll *e, timelib_sll amount, int multiplier)
 {
-#if defined(__has_builtin) && __has_builtin(__builtin_saddll_overflow)
+#if TIMELIB_HAVE_BUILTIN_SADDLL_OVERFLOW
 	if (__builtin_saddll_overflow(*e, amount * multiplier, e)) {
 		add_error(s, TIMELIB_ERR_NUMBER_OUT_OF_RANGE, "Number out of range");
 	}
@@ -1014,11 +1018,11 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 std:
 	s->tok = cursor;
 	s->len = 0;
-#line 1147 "ext/date/lib/parse_date.re"
+#line 1151 "ext/date/lib/parse_date.re"
 
 
 
-#line 1022 ""
+#line 1026 ""
 {
 	YYCTYPE yych;
 	unsigned int yyaccept = 0;
@@ -1199,23 +1203,23 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(2, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(3, *YYCURSOR);
-#line 1980 "ext/date/lib/parse_date.re"
+#line 1984 "ext/date/lib/parse_date.re"
 	{
 		s->pos = cursor; s->line++;
 		goto std;
 	}
-#line 1208 ""
+#line 1212 ""
 yy4:
 	YYDEBUG(4, *YYCURSOR);
 	++YYCURSOR;
 yy5:
 	YYDEBUG(5, *YYCURSOR);
-#line 1986 "ext/date/lib/parse_date.re"
+#line 1990 "ext/date/lib/parse_date.re"
 	{
 		add_error(s, TIMELIB_ERR_UNEXPECTED_CHARACTER, "Unexpected character");
 		goto std;
 	}
-#line 1219 ""
+#line 1223 ""
 yy6:
 	YYDEBUG(6, *YYCURSOR);
 	yyaccept = 0;
@@ -1230,11 +1234,11 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych <= '9') goto yy58;
 yy8:
 	YYDEBUG(8, *YYCURSOR);
-#line 1975 "ext/date/lib/parse_date.re"
+#line 1979 "ext/date/lib/parse_date.re"
 	{
 		goto std;
 	}
-#line 1238 ""
+#line 1242 ""
 yy9:
 	YYDEBUG(9, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -1268,11 +1272,11 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(11, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(12, *YYCURSOR);
-#line 1970 "ext/date/lib/parse_date.re"
+#line 1974 "ext/date/lib/parse_date.re"
 	{
 		goto std;
 	}
-#line 1276 ""
+#line 1280 ""
 yy13:
 	YYDEBUG(13, *YYCURSOR);
 	yyaccept = 1;
@@ -1773,7 +1777,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy20:
 	YYDEBUG(20, *YYCURSOR);
-#line 1885 "ext/date/lib/parse_date.re"
+#line 1889 "ext/date/lib/parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("tzcorrection | tz");
@@ -1787,7 +1791,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_TIMEZONE;
 	}
-#line 1791 ""
+#line 1795 ""
 yy21:
 	YYDEBUG(21, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -3592,7 +3596,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy81:
 	YYDEBUG(81, *YYCURSOR);
-#line 1632 "ext/date/lib/parse_date.re"
+#line 1636 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("datenoyearrev");
 		TIMELIB_INIT;
@@ -3603,7 +3607,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_DATE_TEXT;
 	}
-#line 3607 ""
+#line 3611 ""
 yy82:
 	YYDEBUG(82, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -4118,7 +4122,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 	if (yych == '.') goto yy289;
 	YYDEBUG(114, *YYCURSOR);
-#line 1207 "ext/date/lib/parse_date.re"
+#line 1211 "ext/date/lib/parse_date.re"
 	{
 		timelib_ull i;
 
@@ -4143,7 +4147,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 4147 ""
+#line 4151 ""
 yy115:
 	YYDEBUG(115, *YYCURSOR);
 	++YYCURSOR;
@@ -5869,7 +5873,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy177:
 	YYDEBUG(177, *YYCURSOR);
-#line 1373 "ext/date/lib/parse_date.re"
+#line 1377 "ext/date/lib/parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("timetiny24 | timeshort24 | timelong24 | iso8601long");
@@ -5896,7 +5900,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_TIME24_WITH_ZONE;
 	}
-#line 5900 ""
+#line 5904 ""
 yy178:
 	YYDEBUG(178, *YYCURSOR);
 	yyaccept = 4;
@@ -6925,7 +6929,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy224:
 	YYDEBUG(224, *YYCURSOR);
-#line 1467 "ext/date/lib/parse_date.re"
+#line 1471 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("americanshort | american");
@@ -6940,7 +6944,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_AMERICAN;
 	}
-#line 6944 ""
+#line 6948 ""
 yy225:
 	YYDEBUG(225, *YYCURSOR);
 	yyaccept = 5;
@@ -7183,7 +7187,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych <= '9') goto yy431;
 yy251:
 	YYDEBUG(251, *YYCURSOR);
-#line 1549 "ext/date/lib/parse_date.re"
+#line 1553 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("datefull");
@@ -7197,7 +7201,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_DATE_FULL;
 	}
-#line 7201 ""
+#line 7205 ""
 yy252:
 	YYDEBUG(252, *YYCURSOR);
 	yyaccept = 3;
@@ -7311,7 +7315,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych == 'e') goto yy440;
 yy260:
 	YYDEBUG(260, *YYCURSOR);
-#line 1954 "ext/date/lib/parse_date.re"
+#line 1958 "ext/date/lib/parse_date.re"
 	{
 		timelib_ull i;
 		DEBUG_OUTPUT("relative");
@@ -7326,7 +7330,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 7330 ""
+#line 7334 ""
 yy261:
 	YYDEBUG(261, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -7772,7 +7776,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych <= '9') goto yy471;
 yy290:
 	YYDEBUG(290, *YYCURSOR);
-#line 1233 "ext/date/lib/parse_date.re"
+#line 1237 "ext/date/lib/parse_date.re"
 	{
 		timelib_sll i;
 		timelib_ull us;
@@ -7811,7 +7815,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 7815 ""
+#line 7819 ""
 yy291:
 	YYDEBUG(291, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -7836,7 +7840,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy293:
 	YYDEBUG(293, *YYCURSOR);
-#line 1795 "ext/date/lib/parse_date.re"
+#line 1799 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("ago");
 		TIMELIB_INIT;
@@ -7856,7 +7860,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_AGO;
 	}
-#line 7860 ""
+#line 7864 ""
 yy294:
 	YYDEBUG(294, *YYCURSOR);
 	yyaccept = 7;
@@ -7895,7 +7899,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy295:
 	YYDEBUG(295, *YYCURSOR);
-#line 1875 "ext/date/lib/parse_date.re"
+#line 1879 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("monthtext");
 		TIMELIB_INIT;
@@ -7904,7 +7908,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_DATE_TEXT;
 	}
-#line 7908 ""
+#line 7912 ""
 yy296:
 	YYDEBUG(296, *YYCURSOR);
 	yyaccept = 7;
@@ -8479,7 +8483,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy315:
 	YYDEBUG(315, *YYCURSOR);
-#line 1816 "ext/date/lib/parse_date.re"
+#line 1820 "ext/date/lib/parse_date.re"
 	{
 		const timelib_relunit* relunit;
 		DEBUG_OUTPUT("daytext");
@@ -8496,7 +8500,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_WEEKDAY;
 	}
-#line 8500 ""
+#line 8504 ""
 yy316:
 	YYDEBUG(316, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -8764,7 +8768,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy325:
 	YYDEBUG(325, *YYCURSOR);
-#line 1618 "ext/date/lib/parse_date.re"
+#line 1622 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("datetextual | datenoyear");
@@ -8777,7 +8781,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_DATE_TEXT;
 	}
-#line 8781 ""
+#line 8785 ""
 yy326:
 	YYDEBUG(326, *YYCURSOR);
 	yyaccept = 10;
@@ -9471,7 +9475,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy351:
 	YYDEBUG(351, *YYCURSOR);
-#line 1164 "ext/date/lib/parse_date.re"
+#line 1168 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("now");
 		TIMELIB_INIT;
@@ -9479,7 +9483,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 9483 ""
+#line 9487 ""
 yy352:
 	YYDEBUG(352, *YYCURSOR);
 	yyaccept = 2;
@@ -10982,7 +10986,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy420:
 	YYDEBUG(420, *YYCURSOR);
-#line 1401 "ext/date/lib/parse_date.re"
+#line 1405 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("gnunocolon");
 		TIMELIB_INIT;
@@ -11004,7 +11008,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_GNU_NOCOLON;
 	}
-#line 11008 ""
+#line 11012 ""
 yy421:
 	YYDEBUG(421, *YYCURSOR);
 	yyaccept = 13;
@@ -11085,7 +11089,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy422:
 	YYDEBUG(422, *YYCURSOR);
-#line 1786 "ext/date/lib/parse_date.re"
+#line 1790 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("year4");
 		TIMELIB_INIT;
@@ -11093,7 +11097,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_CLF;
 	}
-#line 11097 ""
+#line 11101 ""
 yy423:
 	YYDEBUG(423, *YYCURSOR);
 	yyaccept = 3;
@@ -11700,7 +11704,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(456, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(457, *YYCURSOR);
-#line 1335 "ext/date/lib/parse_date.re"
+#line 1339 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("timetiny12 | timeshort12 | timelong12");
 		TIMELIB_INIT;
@@ -11717,7 +11721,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_TIME12;
 	}
-#line 11721 ""
+#line 11725 ""
 yy458:
 	YYDEBUG(458, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -13044,7 +13048,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy526:
 	YYDEBUG(526, *YYCURSOR);
-#line 1173 "ext/date/lib/parse_date.re"
+#line 1177 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("noon");
 		TIMELIB_INIT;
@@ -13055,7 +13059,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 13059 ""
+#line 13063 ""
 yy527:
 	YYDEBUG(527, *YYCURSOR);
 	yyaccept = 2;
@@ -14101,7 +14105,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy567:
 	YYDEBUG(567, *YYCURSOR);
-#line 1535 "ext/date/lib/parse_date.re"
+#line 1539 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("gnudateshort");
@@ -14114,7 +14118,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_ISO_DATE;
 	}
-#line 14118 ""
+#line 14122 ""
 yy568:
 	YYDEBUG(568, *YYCURSOR);
 	yyaccept = 15;
@@ -14565,7 +14569,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy600:
 	YYDEBUG(600, *YYCURSOR);
-#line 1604 "ext/date/lib/parse_date.re"
+#line 1608 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("datenodayrev");
@@ -14578,7 +14582,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_DATE_NO_DAY;
 	}
-#line 14582 ""
+#line 14586 ""
 yy601:
 	YYDEBUG(601, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -15953,7 +15957,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(696, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(697, *YYCURSOR);
-#line 1590 "ext/date/lib/parse_date.re"
+#line 1594 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("datenoday");
@@ -15966,7 +15970,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_DATE_NO_DAY;
 	}
-#line 15970 ""
+#line 15974 ""
 yy698:
 	YYDEBUG(698, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -16527,7 +16531,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy722:
 	YYDEBUG(722, *YYCURSOR);
-#line 1185 "ext/date/lib/parse_date.re"
+#line 1189 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("midnight | today");
 		TIMELIB_INIT;
@@ -16536,7 +16540,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 16540 ""
+#line 16544 ""
 yy723:
 	YYDEBUG(723, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -16846,7 +16850,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych <= '9') goto yy897;
 yy739:
 	YYDEBUG(739, *YYCURSOR);
-#line 1576 "ext/date/lib/parse_date.re"
+#line 1580 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("pointed date YY");
@@ -16859,7 +16863,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_DATE_FULL_POINTED;
 	}
-#line 16863 ""
+#line 16867 ""
 yy740:
 	YYDEBUG(740, *YYCURSOR);
 	yyaccept = 15;
@@ -16971,7 +16975,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy752:
 	YYDEBUG(752, *YYCURSOR);
-#line 1521 "ext/date/lib/parse_date.re"
+#line 1525 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("gnudateshorter");
@@ -16984,7 +16988,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_ISO_DATE;
 	}
-#line 16988 ""
+#line 16992 ""
 yy753:
 	YYDEBUG(753, *YYCURSOR);
 	yyaccept = 18;
@@ -17233,7 +17237,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy777:
 	YYDEBUG(777, *YYCURSOR);
-#line 1447 "ext/date/lib/parse_date.re"
+#line 1451 "ext/date/lib/parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("iso8601nocolon");
@@ -17252,7 +17256,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_ISO_NOCOLON;
 	}
-#line 17256 ""
+#line 17260 ""
 yy778:
 	YYDEBUG(778, *YYCURSOR);
 	yyaccept = 19;
@@ -18480,7 +18484,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy849:
 	YYDEBUG(849, *YYCURSOR);
-#line 1924 "ext/date/lib/parse_date.re"
+#line 1928 "ext/date/lib/parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz");
@@ -18509,7 +18513,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_SHORTDATE_WITH_TIME;
 	}
-#line 18513 ""
+#line 18517 ""
 yy850:
 	YYDEBUG(850, *YYCURSOR);
 	yyaccept = 20;
@@ -19553,7 +19557,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy926:
 	YYDEBUG(926, *YYCURSOR);
-#line 1682 "ext/date/lib/parse_date.re"
+#line 1686 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("pgydotd");
@@ -19566,7 +19570,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_PG_YEARDAY;
 	}
-#line 19570 ""
+#line 19574 ""
 yy927:
 	YYDEBUG(927, *YYCURSOR);
 	yyaccept = 21;
@@ -19820,7 +19824,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych <= '7') goto yy1059;
 yy942:
 	YYDEBUG(942, *YYCURSOR);
-#line 1715 "ext/date/lib/parse_date.re"
+#line 1719 "ext/date/lib/parse_date.re"
 	{
 		timelib_sll w, d;
 		DEBUG_OUTPUT("isoweek");
@@ -19838,7 +19842,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_ISO_WEEK;
 	}
-#line 19842 ""
+#line 19846 ""
 yy943:
 	YYDEBUG(943, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -20314,7 +20318,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych == 'e') goto yy1094;
 yy982:
 	YYDEBUG(982, *YYCURSOR);
-#line 1858 "ext/date/lib/parse_date.re"
+#line 1862 "ext/date/lib/parse_date.re"
 	{
 		timelib_sll i;
 		int         behavior = 0;
@@ -20330,7 +20334,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 20334 ""
+#line 20338 ""
 yy983:
 	YYDEBUG(983, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -20677,7 +20681,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(1020, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1021, *YYCURSOR);
-#line 1564 "ext/date/lib/parse_date.re"
+#line 1568 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("pointed date YYYY");
 		TIMELIB_INIT;
@@ -20688,7 +20692,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_DATE_FULL_POINTED;
 	}
-#line 20692 ""
+#line 20696 ""
 yy1022:
 	YYDEBUG(1022, *YYCURSOR);
 	++YYCURSOR;
@@ -20717,7 +20721,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy1025:
 	YYDEBUG(1025, *YYCURSOR);
-#line 1495 "ext/date/lib/parse_date.re"
+#line 1499 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("iso8601date2");
@@ -20730,7 +20734,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_ISO_DATE;
 	}
-#line 20734 ""
+#line 20738 ""
 yy1026:
 	YYDEBUG(1026, *YYCURSOR);
 	yyaccept = 15;
@@ -20950,7 +20954,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy1043:
 	YYDEBUG(1043, *YYCURSOR);
-#line 1483 "ext/date/lib/parse_date.re"
+#line 1487 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("iso8601date4 | iso8601date2 | iso8601dateslash | dateslash");
 		TIMELIB_INIT;
@@ -20961,7 +20965,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_ISO_DATE;
 	}
-#line 20965 ""
+#line 20969 ""
 yy1044:
 	YYDEBUG(1044, *YYCURSOR);
 	yyaccept = 26;
@@ -21076,7 +21080,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy1048:
 	YYDEBUG(1048, *YYCURSOR);
-#line 1644 "ext/date/lib/parse_date.re"
+#line 1648 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("datenocolon");
 		TIMELIB_INIT;
@@ -21087,7 +21091,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_DATE_NOCOLON;
 	}
-#line 21091 ""
+#line 21095 ""
 yy1049:
 	YYDEBUG(1049, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -21157,7 +21161,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(1059, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1060, *YYCURSOR);
-#line 1696 "ext/date/lib/parse_date.re"
+#line 1700 "ext/date/lib/parse_date.re"
 	{
 		timelib_sll w, d;
 		DEBUG_OUTPUT("isoweekday");
@@ -21175,7 +21179,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_ISO_WEEK;
 	}
-#line 21179 ""
+#line 21183 ""
 yy1061:
 	YYDEBUG(1061, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -21238,7 +21242,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych <= '9') goto yy1143;
 yy1070:
 	YYDEBUG(1070, *YYCURSOR);
-#line 1734 "ext/date/lib/parse_date.re"
+#line 1738 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("pgtextshort");
@@ -21251,7 +21255,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_PG_TEXT;
 	}
-#line 21255 ""
+#line 21259 ""
 yy1071:
 	YYDEBUG(1071, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -21724,7 +21728,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	++YYCURSOR;
 yy1107:
 	YYDEBUG(1107, *YYCURSOR);
-#line 1195 "ext/date/lib/parse_date.re"
+#line 1199 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("tomorrow");
 		TIMELIB_INIT;
@@ -21735,7 +21739,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 21739 ""
+#line 21743 ""
 yy1108:
 	YYDEBUG(1108, *YYCURSOR);
 	yyaccept = 28;
@@ -22072,7 +22076,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(1140, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1141, *YYCURSOR);
-#line 1748 "ext/date/lib/parse_date.re"
+#line 1752 "ext/date/lib/parse_date.re"
 	{
 		int length = 0;
 		DEBUG_OUTPUT("pgtextreverse");
@@ -22085,7 +22089,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_PG_TEXT;
 	}
-#line 22089 ""
+#line 22093 ""
 yy1142:
 	YYDEBUG(1142, *YYCURSOR);
 	++YYCURSOR;
@@ -22129,7 +22133,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy1145:
 	YYDEBUG(1145, *YYCURSOR);
-#line 1290 "ext/date/lib/parse_date.re"
+#line 1294 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("backof | frontof");
 		TIMELIB_INIT;
@@ -22151,7 +22155,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_LF_DAY_OF_MONTH;
 	}
-#line 22155 ""
+#line 22159 ""
 yy1146:
 	YYDEBUG(1146, *YYCURSOR);
 	yyaccept = 29;
@@ -22475,7 +22479,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	}
 yy1172:
 	YYDEBUG(1172, *YYCURSOR);
-#line 1834 "ext/date/lib/parse_date.re"
+#line 1838 "ext/date/lib/parse_date.re"
 	{
 		timelib_sll i;
 		int         behavior = 0;
@@ -22498,7 +22502,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 22502 ""
+#line 22506 ""
 yy1173:
 	YYDEBUG(1173, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -22510,7 +22514,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	++YYCURSOR;
 yy1175:
 	YYDEBUG(1175, *YYCURSOR);
-#line 1152 "ext/date/lib/parse_date.re"
+#line 1156 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("yesterday");
 		TIMELIB_INIT;
@@ -22521,7 +22525,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_RELATIVE;
 	}
-#line 22525 ""
+#line 22529 ""
 yy1176:
 	YYDEBUG(1176, *YYCURSOR);
 	yyaccept = 31;
@@ -23014,7 +23018,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(1222, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1223, *YYCURSOR);
-#line 1900 "ext/date/lib/parse_date.re"
+#line 1904 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("dateshortwithtimeshort12 | dateshortwithtimelong12");
 		TIMELIB_INIT;
@@ -23037,7 +23041,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_SHORTDATE_WITH_TIME;
 	}
-#line 23041 ""
+#line 23045 ""
 yy1224:
 	YYDEBUG(1224, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -23539,7 +23543,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(1268, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1269, *YYCURSOR);
-#line 1313 "ext/date/lib/parse_date.re"
+#line 1317 "ext/date/lib/parse_date.re"
 	{
 		timelib_sll i;
 		int         behavior = 0;
@@ -23560,7 +23564,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_WEEK_DAY_OF_MONTH;
 	}
-#line 23564 ""
+#line 23568 ""
 yy1270:
 	YYDEBUG(1270, *YYCURSOR);
 	yyaccept = 24;
@@ -23607,7 +23611,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(1273, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1274, *YYCURSOR);
-#line 1273 "ext/date/lib/parse_date.re"
+#line 1277 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("firstdayof | lastdayof");
 		TIMELIB_INIT;
@@ -23623,12 +23627,12 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_LF_DAY_OF_MONTH;
 	}
-#line 23627 ""
+#line 23631 ""
 yy1275:
 	YYDEBUG(1275, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1276, *YYCURSOR);
-#line 1509 "ext/date/lib/parse_date.re"
+#line 1513 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("iso8601datex");
 		TIMELIB_INIT;
@@ -23639,7 +23643,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_ISO_DATE;
 	}
-#line 23643 ""
+#line 23647 ""
 yy1277:
 	YYDEBUG(1277, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -23742,7 +23746,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	YYDEBUG(1290, *YYCURSOR);
 	++YYCURSOR;
 	YYDEBUG(1291, *YYCURSOR);
-#line 1353 "ext/date/lib/parse_date.re"
+#line 1357 "ext/date/lib/parse_date.re"
 	{
 		DEBUG_OUTPUT("mssqltime");
 		TIMELIB_INIT;
@@ -23761,7 +23765,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_TIME24_WITH_ZONE;
 	}
-#line 23765 ""
+#line 23769 ""
 yy1292:
 	YYDEBUG(1292, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -24185,7 +24189,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych <= '9') goto yy1331;
 yy1329:
 	YYDEBUG(1329, *YYCURSOR);
-#line 1656 "ext/date/lib/parse_date.re"
+#line 1660 "ext/date/lib/parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx | exif");
@@ -24210,7 +24214,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_XMLRPC_SOAP;
 	}
-#line 24214 ""
+#line 24218 ""
 yy1330:
 	YYDEBUG(1330, *YYCURSOR);
 	yych = *++YYCURSOR;
@@ -24580,7 +24584,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych <= ':') goto yy1383;
 yy1375:
 	YYDEBUG(1375, *YYCURSOR);
-#line 1762 "ext/date/lib/parse_date.re"
+#line 1766 "ext/date/lib/parse_date.re"
 	{
 		int tz_not_found;
 		DEBUG_OUTPUT("clf");
@@ -24603,7 +24607,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 		TIMELIB_DEINIT;
 		return TIMELIB_CLF;
 	}
-#line 24607 ""
+#line 24611 ""
 yy1376:
 	YYDEBUG(1376, *YYCURSOR);
 	yyaccept = 33;
@@ -24835,7 +24839,7 @@ static int scan(Scanner *s, timelib_tz_get_wrapper tz_get_wrapper)
 	if (yych == ':') goto yy1286;
 	goto yy1329;
 }
-#line 1990 "ext/date/lib/parse_date.re"
+#line 1994 "ext/date/lib/parse_date.re"
 
 }
 
diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re
index 5d259ed4e2c75..d32be9bfe7be7 100644
--- a/ext/date/lib/parse_date.re
+++ b/ext/date/lib/parse_date.re
@@ -547,22 +547,26 @@ static timelib_ull timelib_get_signed_nr(Scanner *s, const char **ptr, int max_l
 	timelib_sll tmp_nr = 0;
 	int len = 0;
 
-	str = timelib_calloc(1, max_length + 2); // for sign and \0
-	str_ptr = str;
+	/* Skip over non-numeric chars */
 
 	while (((**ptr < '0') || (**ptr > '9')) && (**ptr != '+') && (**ptr != '-')) {
 		if (**ptr == '\0') {
 			add_error(s, TIMELIB_ERR_UNEXPECTED_DATA, "Found unexpected data");
-			timelib_free(str);
 			return 0;
 		}
 		++*ptr;
 	}
+	
+	/* Allocate string to feed to strtoll(): sign + length + '\0' */
+	str = timelib_calloc(1, max_length + 2);
+	str[0] = '+'; /* First position is the sign */
+	str_ptr = str + 1;
 
-	if ((**ptr == '+') || (**ptr == '-')) {
-		*str_ptr = **ptr;
+	while ((**ptr == '+') || (**ptr == '-')) {
+		if (**ptr == '-') {
+			str[0] = str[0] == '+' ? '-' : '+';
+		}
 		++*ptr;
-		++str_ptr;
 	}
 
 	while (((**ptr < '0') || (**ptr > '9'))) {
@@ -713,7 +717,7 @@ static const timelib_relunit* timelib_lookup_relunit(const char **ptr)
 
 static void add_with_overflow(Scanner *s, timelib_sll *e, timelib_sll amount, int multiplier)
 {
-#if defined(__has_builtin) && __has_builtin(__builtin_saddll_overflow)
+#if TIMELIB_HAVE_BUILTIN_SADDLL_OVERFLOW
 	if (__builtin_saddll_overflow(*e, amount * multiplier, e)) {
 		add_error(s, TIMELIB_ERR_NUMBER_OUT_OF_RANGE, "Number out of range");
 	}
diff --git a/ext/date/lib/parse_iso_intervals.c b/ext/date/lib/parse_iso_intervals.c
index 6715d5cee525f..cdc329431ec45 100644
--- a/ext/date/lib/parse_iso_intervals.c
+++ b/ext/date/lib/parse_iso_intervals.c
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.15.3 on Wed Sep 14 16:32:05 2022 */
+/* Generated by re2c 1.0.3 on Wed Sep 11 17:29:40 2024 */
 #line 1 "ext/date/lib/parse_iso_intervals.re"
 /*
  * The MIT License (MIT)
@@ -223,54 +223,72 @@ static int scan(Scanner *s)
 	yych = *YYCURSOR;
 	if (yych <= ',') {
 		if (yych <= '\n') {
-			if (yych <= 0x00) goto yy9;
-			if (yych <= 0x08) goto yy11;
-			if (yych <= '\t') goto yy7;
-			goto yy9;
+			if (yych <= 0x00) goto yy2;
+			if (yych <= 0x08) goto yy4;
+			if (yych <= '\t') goto yy6;
 		} else {
-			if (yych == ' ') goto yy7;
-			if (yych <= '+') goto yy11;
-			goto yy7;
+			if (yych == ' ') goto yy6;
+			if (yych <= '+') goto yy4;
+			goto yy6;
 		}
 	} else {
 		if (yych <= 'O') {
-			if (yych <= '-') goto yy11;
-			if (yych <= '/') goto yy7;
-			if (yych <= '9') goto yy4;
-			goto yy11;
+			if (yych <= '-') goto yy4;
+			if (yych <= '/') goto yy6;
+			if (yych <= '9') goto yy8;
+			goto yy4;
 		} else {
-			if (yych <= 'P') goto yy5;
-			if (yych != 'R') goto yy11;
+			if (yych <= 'P') goto yy9;
+			if (yych == 'R') goto yy11;
+			goto yy4;
 		}
 	}
+yy2:
 	YYDEBUG(2, *YYCURSOR);
 	++YYCURSOR;
-	if ((yych = *YYCURSOR) <= '/') goto yy3;
-	if (yych <= '9') goto yy98;
-yy3:
 	YYDEBUG(3, *YYCURSOR);
-#line 317 "ext/date/lib/parse_iso_intervals.re"
+#line 311 "ext/date/lib/parse_iso_intervals.re"
 	{
-		add_error(s, "Unexpected character");
+		s->pos = cursor; s->line++;
 		goto std;
 	}
-#line 258 ""
+#line 256 ""
 yy4:
 	YYDEBUG(4, *YYCURSOR);
-	yyaccept = 0;
-	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych <= '/') goto yy3;
-	if (yych <= '9') goto yy59;
-	goto yy3;
+	++YYCURSOR;
 yy5:
 	YYDEBUG(5, *YYCURSOR);
-	yyaccept = 1;
-	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych <= '/') goto yy6;
-	if (yych <= '9') goto yy12;
-	if (yych == 'T') goto yy14;
+#line 317 "ext/date/lib/parse_iso_intervals.re"
+	{
+		add_error(s, "Unexpected character");
+		goto std;
+	}
+#line 267 ""
 yy6:
 	YYDEBUG(6, *YYCURSOR);
+	++YYCURSOR;
+	YYDEBUG(7, *YYCURSOR);
+#line 306 "ext/date/lib/parse_iso_intervals.re"
+	{
+		goto std;
+	}
+#line 276 ""
+yy8:
+	YYDEBUG(8, *YYCURSOR);
+	yyaccept = 0;
+	yych = *(YYMARKER = ++YYCURSOR);
+	if (yych <= '/') goto yy5;
+	if (yych <= '9') goto yy12;
+	goto yy5;
+yy9:
+	YYDEBUG(9, *YYCURSOR);
+	yyaccept = 1;
+	yych = *(YYMARKER = ++YYCURSOR);
+	if (yych <= '/') goto yy10;
+	if (yych <= '9') goto yy14;
+	if (yych == 'T') goto yy15;
+yy10:
+	YYDEBUG(10, *YYCURSOR);
 #line 244 "ext/date/lib/parse_iso_intervals.re"
 	{
 		timelib_sll nr;
@@ -312,189 +330,197 @@ static int scan(Scanner *s)
 		TIMELIB_DEINIT;
 		return TIMELIB_PERIOD;
 	}
-#line 316 ""
-yy7:
-	YYDEBUG(7, *YYCURSOR);
-	++YYCURSOR;
-	YYDEBUG(8, *YYCURSOR);
-#line 306 "ext/date/lib/parse_iso_intervals.re"
-	{
-		goto std;
-	}
-#line 325 ""
-yy9:
-	YYDEBUG(9, *YYCURSOR);
-	++YYCURSOR;
-	YYDEBUG(10, *YYCURSOR);
-#line 311 "ext/date/lib/parse_iso_intervals.re"
-	{
-		s->pos = cursor; s->line++;
-		goto std;
-	}
-#line 335 ""
+#line 334 ""
 yy11:
 	YYDEBUG(11, *YYCURSOR);
 	yych = *++YYCURSOR;
-	goto yy3;
+	if (yybm[0+yych] & 128) {
+		goto yy16;
+	}
+	goto yy5;
 yy12:
 	YYDEBUG(12, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= 'L') {
-		if (yych <= '9') {
-			if (yych >= '0') goto yy25;
-		} else {
-			if (yych == 'D') goto yy24;
-		}
-	} else {
-		if (yych <= 'W') {
-			if (yych <= 'M') goto yy27;
-			if (yych >= 'W') goto yy26;
-		} else {
-			if (yych == 'Y') goto yy28;
-		}
-	}
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy19;
 yy13:
 	YYDEBUG(13, *YYCURSOR);
 	YYCURSOR = YYMARKER;
 	if (yyaccept == 0) {
-		goto yy3;
+		goto yy5;
 	} else {
-		goto yy6;
+		goto yy10;
 	}
 yy14:
 	YYDEBUG(14, *YYCURSOR);
-	yyaccept = 1;
-	yych = *(YYMARKER = ++YYCURSOR);
-	if (yybm[0+yych] & 128) {
-		goto yy15;
+	yych = *++YYCURSOR;
+	if (yych <= 'L') {
+		if (yych <= '9') {
+			if (yych <= '/') goto yy13;
+			goto yy20;
+		} else {
+			if (yych == 'D') goto yy21;
+			goto yy13;
+		}
+	} else {
+		if (yych <= 'W') {
+			if (yych <= 'M') goto yy22;
+			if (yych <= 'V') goto yy13;
+			goto yy23;
+		} else {
+			if (yych == 'Y') goto yy24;
+			goto yy13;
+		}
 	}
-	goto yy6;
 yy15:
 	YYDEBUG(15, *YYCURSOR);
+	yyaccept = 1;
+	yych = *(YYMARKER = ++YYCURSOR);
+	if (yych <= '/') goto yy10;
+	if (yych <= '9') goto yy25;
+	goto yy10;
+yy16:
+	YYDEBUG(16, *YYCURSOR);
 	++YYCURSOR;
-	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+	if (YYLIMIT <= YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
-	YYDEBUG(16, *YYCURSOR);
+	YYDEBUG(17, *YYCURSOR);
 	if (yybm[0+yych] & 128) {
-		goto yy15;
+		goto yy16;
 	}
+	YYDEBUG(18, *YYCURSOR);
+#line 209 "ext/date/lib/parse_iso_intervals.re"
+	{
+		DEBUG_OUTPUT("recurrences");
+		TIMELIB_INIT;
+		ptr++;
+		s->recurrences = timelib_get_unsigned_nr(&ptr, 9);
+		TIMELIB_DEINIT;
+		s->have_recurrences = 1;
+		return TIMELIB_PERIOD;
+	}
+#line 403 ""
+yy19:
+	YYDEBUG(19, *YYCURSOR);
+	yych = *++YYCURSOR;
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy27;
+	goto yy13;
+yy20:
+	YYDEBUG(20, *YYCURSOR);
+	yych = *++YYCURSOR;
 	if (yych <= 'L') {
-		if (yych == 'H') goto yy19;
-		goto yy13;
+		if (yych <= '9') {
+			if (yych <= '/') goto yy13;
+			goto yy28;
+		} else {
+			if (yych != 'D') goto yy13;
+		}
 	} else {
-		if (yych <= 'M') goto yy18;
-		if (yych != 'S') goto yy13;
+		if (yych <= 'W') {
+			if (yych <= 'M') goto yy22;
+			if (yych <= 'V') goto yy13;
+			goto yy23;
+		} else {
+			if (yych == 'Y') goto yy24;
+			goto yy13;
+		}
 	}
-yy17:
-	YYDEBUG(17, *YYCURSOR);
+yy21:
+	YYDEBUG(21, *YYCURSOR);
 	yych = *++YYCURSOR;
-	goto yy6;
-yy18:
-	YYDEBUG(18, *YYCURSOR);
+	if (yych == 'T') goto yy15;
+	goto yy10;
+yy22:
+	YYDEBUG(22, *YYCURSOR);
 	yyaccept = 1;
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych <= '/') goto yy6;
-	if (yych <= '9') goto yy22;
-	goto yy6;
-yy19:
-	YYDEBUG(19, *YYCURSOR);
+	if (yych <= '/') goto yy10;
+	if (yych <= '9') goto yy29;
+	if (yych == 'T') goto yy15;
+	goto yy10;
+yy23:
+	YYDEBUG(23, *YYCURSOR);
 	yyaccept = 1;
 	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych <= '/') goto yy6;
-	if (yych >= ':') goto yy6;
-yy20:
-	YYDEBUG(20, *YYCURSOR);
+	if (yych <= '/') goto yy10;
+	if (yych <= '9') goto yy31;
+	if (yych == 'T') goto yy15;
+	goto yy10;
+yy24:
+	YYDEBUG(24, *YYCURSOR);
+	yyaccept = 1;
+	yych = *(YYMARKER = ++YYCURSOR);
+	if (yych <= '/') goto yy10;
+	if (yych <= '9') goto yy33;
+	if (yych == 'T') goto yy15;
+	goto yy10;
+yy25:
+	YYDEBUG(25, *YYCURSOR);
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
-	YYDEBUG(21, *YYCURSOR);
-	if (yych <= 'L') {
+	YYDEBUG(26, *YYCURSOR);
+	if (yych <= 'H') {
 		if (yych <= '/') goto yy13;
-		if (yych <= '9') goto yy20;
+		if (yych <= '9') goto yy25;
+		if (yych <= 'G') goto yy13;
+		goto yy35;
+	} else {
+		if (yych <= 'M') {
+			if (yych <= 'L') goto yy13;
+			goto yy36;
+		} else {
+			if (yych == 'S') goto yy37;
+			goto yy13;
+		}
+	}
+yy27:
+	YYDEBUG(27, *YYCURSOR);
+	yych = *++YYCURSOR;
+	if (yych <= '/') {
+		if (yych == '-') goto yy38;
 		goto yy13;
 	} else {
-		if (yych <= 'M') goto yy18;
-		if (yych == 'S') goto yy17;
+		if (yych <= '0') goto yy39;
+		if (yych <= '1') goto yy40;
 		goto yy13;
 	}
-yy22:
-	YYDEBUG(22, *YYCURSOR);
-	++YYCURSOR;
-	if (YYLIMIT <= YYCURSOR) YYFILL(1);
-	yych = *YYCURSOR;
-	YYDEBUG(23, *YYCURSOR);
-	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy22;
-	if (yych == 'S') goto yy17;
-	goto yy13;
-yy24:
-	YYDEBUG(24, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych == 'T') goto yy14;
-	goto yy6;
-yy25:
-	YYDEBUG(25, *YYCURSOR);
+yy28:
+	YYDEBUG(28, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= 'L') {
 		if (yych <= '9') {
 			if (yych <= '/') goto yy13;
-			goto yy35;
+			goto yy41;
 		} else {
-			if (yych == 'D') goto yy24;
+			if (yych == 'D') goto yy21;
 			goto yy13;
 		}
 	} else {
 		if (yych <= 'W') {
-			if (yych <= 'M') goto yy27;
+			if (yych <= 'M') goto yy22;
 			if (yych <= 'V') goto yy13;
+			goto yy23;
 		} else {
-			if (yych == 'Y') goto yy28;
+			if (yych == 'Y') goto yy24;
 			goto yy13;
 		}
 	}
-yy26:
-	YYDEBUG(26, *YYCURSOR);
-	yyaccept = 1;
-	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych <= '/') goto yy6;
-	if (yych <= '9') goto yy33;
-	if (yych == 'T') goto yy14;
-	goto yy6;
-yy27:
-	YYDEBUG(27, *YYCURSOR);
-	yyaccept = 1;
-	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych <= '/') goto yy6;
-	if (yych <= '9') goto yy31;
-	if (yych == 'T') goto yy14;
-	goto yy6;
-yy28:
-	YYDEBUG(28, *YYCURSOR);
-	yyaccept = 1;
-	yych = *(YYMARKER = ++YYCURSOR);
-	if (yych <= '/') goto yy6;
-	if (yych <= '9') goto yy29;
-	if (yych == 'T') goto yy14;
-	goto yy6;
 yy29:
 	YYDEBUG(29, *YYCURSOR);
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
 	yych = *YYCURSOR;
 	YYDEBUG(30, *YYCURSOR);
-	if (yych <= 'D') {
+	if (yych <= 'C') {
 		if (yych <= '/') goto yy13;
 		if (yych <= '9') goto yy29;
-		if (yych <= 'C') goto yy13;
-		goto yy24;
+		goto yy13;
 	} else {
-		if (yych <= 'M') {
-			if (yych <= 'L') goto yy13;
-			goto yy27;
-		} else {
-			if (yych == 'W') goto yy26;
-			goto yy13;
-		}
+		if (yych <= 'D') goto yy21;
+		if (yych == 'W') goto yy23;
+		goto yy13;
 	}
 yy31:
 	YYDEBUG(31, *YYCURSOR);
@@ -502,313 +528,372 @@ static int scan(Scanner *s)
 	if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
 	yych = *YYCURSOR;
 	YYDEBUG(32, *YYCURSOR);
-	if (yych <= 'C') {
-		if (yych <= '/') goto yy13;
-		if (yych <= '9') goto yy31;
-		goto yy13;
-	} else {
-		if (yych <= 'D') goto yy24;
-		if (yych == 'W') goto yy26;
-		goto yy13;
-	}
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy31;
+	if (yych == 'D') goto yy21;
+	goto yy13;
 yy33:
 	YYDEBUG(33, *YYCURSOR);
 	++YYCURSOR;
 	if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
 	yych = *YYCURSOR;
 	YYDEBUG(34, *YYCURSOR);
-	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy33;
-	if (yych == 'D') goto yy24;
-	goto yy13;
-yy35:
-	YYDEBUG(35, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= 'L') {
-		if (yych <= '9') {
-			if (yych <= '/') goto yy13;
-		} else {
-			if (yych == 'D') goto yy24;
-			goto yy13;
-		}
+	if (yych <= 'D') {
+		if (yych <= '/') goto yy13;
+		if (yych <= '9') goto yy33;
+		if (yych <= 'C') goto yy13;
+		goto yy21;
 	} else {
-		if (yych <= 'W') {
-			if (yych <= 'M') goto yy27;
-			if (yych <= 'V') goto yy13;
-			goto yy26;
+		if (yych <= 'M') {
+			if (yych <= 'L') goto yy13;
+			goto yy22;
 		} else {
-			if (yych == 'Y') goto yy28;
+			if (yych == 'W') goto yy23;
 			goto yy13;
 		}
 	}
+yy35:
+	YYDEBUG(35, *YYCURSOR);
+	yyaccept = 1;
+	yych = *(YYMARKER = ++YYCURSOR);
+	if (yych <= '/') goto yy10;
+	if (yych <= '9') goto yy42;
+	goto yy10;
+yy36:
 	YYDEBUG(36, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych != '-') goto yy39;
+	yyaccept = 1;
+	yych = *(YYMARKER = ++YYCURSOR);
+	if (yych <= '/') goto yy10;
+	if (yych <= '9') goto yy44;
+	goto yy10;
+yy37:
 	YYDEBUG(37, *YYCURSOR);
+	++YYCURSOR;
+	goto yy10;
+yy38:
+	YYDEBUG(38, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '0') goto yy40;
-	if (yych <= '1') goto yy41;
+	if (yych <= '0') goto yy46;
+	if (yych <= '1') goto yy47;
 	goto yy13;
-yy38:
-	YYDEBUG(38, *YYCURSOR);
-	++YYCURSOR;
-	if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
-	yych = *YYCURSOR;
 yy39:
 	YYDEBUG(39, *YYCURSOR);
-	if (yych <= 'L') {
-		if (yych <= '9') {
-			if (yych <= '/') goto yy13;
-			goto yy38;
-		} else {
-			if (yych == 'D') goto yy24;
-			goto yy13;
-		}
-	} else {
-		if (yych <= 'W') {
-			if (yych <= 'M') goto yy27;
-			if (yych <= 'V') goto yy13;
-			goto yy26;
-		} else {
-			if (yych == 'Y') goto yy28;
-			goto yy13;
-		}
-	}
+	yych = *++YYCURSOR;
+	if (yych <= '0') goto yy13;
+	if (yych <= '9') goto yy48;
+	goto yy13;
 yy40:
 	YYDEBUG(40, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy42;
+	if (yych <= '2') goto yy48;
 	goto yy13;
 yy41:
 	YYDEBUG(41, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= '3') goto yy13;
+	if (yych == '-') goto yy49;
+	goto yy51;
 yy42:
 	YYDEBUG(42, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych != '-') goto yy13;
+	++YYCURSOR;
+	if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+	yych = *YYCURSOR;
 	YYDEBUG(43, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych <= '0') goto yy44;
-	if (yych <= '2') goto yy45;
-	if (yych <= '3') goto yy46;
-	goto yy13;
+	if (yych <= 'L') {
+		if (yych <= '/') goto yy13;
+		if (yych <= '9') goto yy42;
+		goto yy13;
+	} else {
+		if (yych <= 'M') goto yy36;
+		if (yych == 'S') goto yy37;
+		goto yy13;
+	}
 yy44:
 	YYDEBUG(44, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy47;
-	goto yy13;
-yy45:
+	++YYCURSOR;
+	if (YYLIMIT <= YYCURSOR) YYFILL(1);
+	yych = *YYCURSOR;
 	YYDEBUG(45, *YYCURSOR);
-	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy47;
+	if (yych <= '9') goto yy44;
+	if (yych == 'S') goto yy37;
 	goto yy13;
 yy46:
 	YYDEBUG(46, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= '2') goto yy13;
+	if (yych <= '0') goto yy13;
+	if (yych <= '9') goto yy52;
+	goto yy13;
 yy47:
 	YYDEBUG(47, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych != 'T') goto yy13;
+	if (yych <= '/') goto yy13;
+	if (yych <= '2') goto yy52;
+	goto yy13;
+yy48:
 	YYDEBUG(48, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '1') goto yy49;
-	if (yych <= '2') goto yy50;
+	if (yych <= '0') goto yy53;
+	if (yych <= '2') goto yy54;
+	if (yych <= '3') goto yy55;
 	goto yy13;
 yy49:
 	YYDEBUG(49, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy51;
+	if (yych <= '0') goto yy56;
+	if (yych <= '1') goto yy57;
 	goto yy13;
 yy50:
 	YYDEBUG(50, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= '5') goto yy13;
+	++YYCURSOR;
+	if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
+	yych = *YYCURSOR;
 yy51:
 	YYDEBUG(51, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych != ':') goto yy13;
+	if (yych <= 'L') {
+		if (yych <= '9') {
+			if (yych <= '/') goto yy13;
+			goto yy50;
+		} else {
+			if (yych == 'D') goto yy21;
+			goto yy13;
+		}
+	} else {
+		if (yych <= 'W') {
+			if (yych <= 'M') goto yy22;
+			if (yych <= 'V') goto yy13;
+			goto yy23;
+		} else {
+			if (yych == 'Y') goto yy24;
+			goto yy13;
+		}
+	}
+yy52:
 	YYDEBUG(52, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= '6') goto yy13;
+	if (yych == '-') goto yy58;
+	goto yy13;
+yy53:
 	YYDEBUG(53, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= ':') goto yy13;
+	if (yych <= '0') goto yy13;
+	if (yych <= '9') goto yy59;
+	goto yy13;
+yy54:
 	YYDEBUG(54, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych != ':') goto yy13;
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy59;
+	goto yy13;
+yy55:
 	YYDEBUG(55, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych >= '6') goto yy13;
+	if (yych <= '1') goto yy59;
+	goto yy13;
+yy56:
 	YYDEBUG(56, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych >= ':') goto yy13;
+	if (yych <= '9') goto yy60;
+	goto yy13;
+yy57:
 	YYDEBUG(57, *YYCURSOR);
-	++YYCURSOR;
+	yych = *++YYCURSOR;
+	if (yych <= '/') goto yy13;
+	if (yych <= '2') goto yy60;
+	goto yy13;
+yy58:
 	YYDEBUG(58, *YYCURSOR);
-#line 286 "ext/date/lib/parse_iso_intervals.re"
-	{
-		DEBUG_OUTPUT("combinedrep");
-		TIMELIB_INIT;
-		s->period->y = timelib_get_unsigned_nr(&ptr, 4);
-		ptr++;
-		s->period->m = timelib_get_unsigned_nr(&ptr, 2);
-		ptr++;
-		s->period->d = timelib_get_unsigned_nr(&ptr, 2);
-		ptr++;
-		s->period->h = timelib_get_unsigned_nr(&ptr, 2);
-		ptr++;
-		s->period->i = timelib_get_unsigned_nr(&ptr, 2);
-		ptr++;
-		s->period->s = timelib_get_unsigned_nr(&ptr, 2);
-		s->have_period = 1;
-		TIMELIB_DEINIT;
-		return TIMELIB_PERIOD;
-	}
-#line 684 ""
+	yych = *++YYCURSOR;
+	if (yych <= '/') goto yy13;
+	if (yych <= '0') goto yy61;
+	if (yych <= '2') goto yy62;
+	if (yych <= '3') goto yy63;
+	goto yy13;
 yy59:
 	YYDEBUG(59, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= ':') goto yy13;
+	if (yych == 'T') goto yy64;
+	goto yy13;
+yy60:
 	YYDEBUG(60, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= ':') goto yy13;
+	if (yych == '-') goto yy65;
+	goto yy13;
+yy61:
 	YYDEBUG(61, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') {
-		if (yych == '-') goto yy64;
-		goto yy13;
-	} else {
-		if (yych <= '0') goto yy62;
-		if (yych <= '1') goto yy63;
-		goto yy13;
-	}
+	if (yych <= '0') goto yy13;
+	if (yych <= '9') goto yy66;
+	goto yy13;
 yy62:
 	YYDEBUG(62, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '0') goto yy13;
-	if (yych <= '9') goto yy85;
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy66;
 	goto yy13;
 yy63:
 	YYDEBUG(63, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '2') goto yy85;
+	if (yych <= '1') goto yy66;
 	goto yy13;
 yy64:
 	YYDEBUG(64, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '0') goto yy65;
-	if (yych <= '1') goto yy66;
+	if (yych <= '1') goto yy67;
+	if (yych <= '2') goto yy68;
 	goto yy13;
 yy65:
 	YYDEBUG(65, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '0') goto yy13;
-	if (yych <= '9') goto yy67;
+	if (yych <= '/') goto yy13;
+	if (yych <= '2') goto yy69;
+	if (yych <= '3') goto yy70;
 	goto yy13;
 yy66:
 	YYDEBUG(66, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= '3') goto yy13;
+	if (yych == 'T') goto yy71;
+	goto yy13;
 yy67:
 	YYDEBUG(67, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych != '-') goto yy13;
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy72;
+	goto yy13;
+yy68:
 	YYDEBUG(68, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '0') goto yy69;
-	if (yych <= '2') goto yy70;
-	if (yych <= '3') goto yy71;
+	if (yych <= '4') goto yy72;
 	goto yy13;
 yy69:
 	YYDEBUG(69, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '0') goto yy13;
-	if (yych <= '9') goto yy72;
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy73;
 	goto yy13;
 yy70:
 	YYDEBUG(70, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy72;
+	if (yych <= '1') goto yy73;
 	goto yy13;
 yy71:
 	YYDEBUG(71, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych >= '2') goto yy13;
+	if (yych <= '1') goto yy74;
+	if (yych <= '2') goto yy75;
+	goto yy13;
 yy72:
 	YYDEBUG(72, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych != 'T') goto yy13;
+	if (yych <= '/') goto yy13;
+	if (yych <= '5') goto yy76;
+	goto yy13;
+yy73:
 	YYDEBUG(73, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych <= '1') goto yy74;
-	if (yych <= '2') goto yy75;
+	if (yych == 'T') goto yy77;
 	goto yy13;
 yy74:
 	YYDEBUG(74, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy76;
+	if (yych <= '9') goto yy78;
 	goto yy13;
 yy75:
 	YYDEBUG(75, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych >= '5') goto yy13;
+	if (yych <= '4') goto yy78;
+	goto yy13;
 yy76:
 	YYDEBUG(76, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych != ':') goto yy13;
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy79;
+	goto yy13;
+yy77:
 	YYDEBUG(77, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych >= '6') goto yy13;
+	if (yych <= '1') goto yy80;
+	if (yych <= '2') goto yy81;
+	goto yy13;
+yy78:
 	YYDEBUG(78, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= ':') goto yy13;
+	if (yych == ':') goto yy82;
+	goto yy13;
+yy79:
 	YYDEBUG(79, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych != ':') goto yy13;
+	if (yych <= '/') goto yy13;
+	if (yych <= '5') goto yy83;
+	goto yy13;
+yy80:
 	YYDEBUG(80, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych >= '6') goto yy13;
+	if (yych <= '9') goto yy84;
+	goto yy13;
+yy81:
 	YYDEBUG(81, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych >= ':') goto yy13;
+	if (yych <= '4') goto yy84;
+	goto yy13;
+yy82:
 	YYDEBUG(82, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych != 'Z') goto yy13;
+	if (yych <= '/') goto yy13;
+	if (yych <= '5') goto yy85;
+	goto yy13;
 yy83:
 	YYDEBUG(83, *YYCURSOR);
-	++YYCURSOR;
+	yych = *++YYCURSOR;
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy86;
+	goto yy13;
+yy84:
 	YYDEBUG(84, *YYCURSOR);
+	yych = *++YYCURSOR;
+	if (yych == ':') goto yy87;
+	goto yy13;
+yy85:
+	YYDEBUG(85, *YYCURSOR);
+	yych = *++YYCURSOR;
+	if (yych <= '/') goto yy13;
+	if (yych <= '9') goto yy88;
+	goto yy13;
+yy86:
+	YYDEBUG(86, *YYCURSOR);
+	yych = *++YYCURSOR;
+	if (yych == 'Z') goto yy89;
+	goto yy13;
+yy87:
+	YYDEBUG(87, *YYCURSOR);
+	yych = *++YYCURSOR;
+	if (yych <= '/') goto yy13;
+	if (yych <= '5') goto yy91;
+	goto yy13;
+yy88:
+	YYDEBUG(88, *YYCURSOR);
+	yych = *++YYCURSOR;
+	if (yych == ':') goto yy79;
+	goto yy13;
+yy89:
+	YYDEBUG(89, *YYCURSOR);
+	++YYCURSOR;
+	YYDEBUG(90, *YYCURSOR);
 #line 220 "ext/date/lib/parse_iso_intervals.re"
 	{
 		timelib_time *current;
@@ -832,54 +917,15 @@ static int scan(Scanner *s)
 		TIMELIB_DEINIT;
 		return TIMELIB_ISO_DATE;
 	}
-#line 836 ""
-yy85:
-	YYDEBUG(85, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych <= '0') goto yy86;
-	if (yych <= '2') goto yy87;
-	if (yych <= '3') goto yy88;
-	goto yy13;
-yy86:
-	YYDEBUG(86, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '0') goto yy13;
-	if (yych <= '9') goto yy89;
-	goto yy13;
-yy87:
-	YYDEBUG(87, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy89;
-	goto yy13;
-yy88:
-	YYDEBUG(88, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= '2') goto yy13;
-yy89:
-	YYDEBUG(89, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych != 'T') goto yy13;
-	YYDEBUG(90, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych <= '1') goto yy91;
-	if (yych <= '2') goto yy92;
-	goto yy13;
+#line 921 ""
 yy91:
 	YYDEBUG(91, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
-	if (yych <= '9') goto yy93;
-	goto yy13;
-yy92:
+	if (yych >= ':') goto yy13;
 	YYDEBUG(92, *YYCURSOR);
 	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= '5') goto yy13;
-yy93:
+	if (yych != ':') goto yy13;
 	YYDEBUG(93, *YYCURSOR);
 	yych = *++YYCURSOR;
 	if (yych <= '/') goto yy13;
@@ -889,38 +935,28 @@ static int scan(Scanner *s)
 	if (yych <= '/') goto yy13;
 	if (yych >= ':') goto yy13;
 	YYDEBUG(95, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= '6') goto yy13;
-	YYDEBUG(96, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych <= '/') goto yy13;
-	if (yych >= ':') goto yy13;
-	YYDEBUG(97, *YYCURSOR);
-	yych = *++YYCURSOR;
-	if (yych == 'Z') goto yy83;
-	goto yy13;
-yy98:
-	YYDEBUG(98, *YYCURSOR);
 	++YYCURSOR;
-	if (YYLIMIT <= YYCURSOR) YYFILL(1);
-	yych = *YYCURSOR;
-	YYDEBUG(99, *YYCURSOR);
-	if (yych <= '/') goto yy100;
-	if (yych <= '9') goto yy98;
-yy100:
-	YYDEBUG(100, *YYCURSOR);
-#line 209 "ext/date/lib/parse_iso_intervals.re"
+	YYDEBUG(96, *YYCURSOR);
+#line 286 "ext/date/lib/parse_iso_intervals.re"
 	{
-		DEBUG_OUTPUT("recurrences");
+		DEBUG_OUTPUT("combinedrep");
 		TIMELIB_INIT;
+		s->period->y = timelib_get_unsigned_nr(&ptr, 4);
 		ptr++;
-		s->recurrences = timelib_get_unsigned_nr(&ptr, 9);
+		s->period->m = timelib_get_unsigned_nr(&ptr, 2);
+		ptr++;
+		s->period->d = timelib_get_unsigned_nr(&ptr, 2);
+		ptr++;
+		s->period->h = timelib_get_unsigned_nr(&ptr, 2);
+		ptr++;
+		s->period->i = timelib_get_unsigned_nr(&ptr, 2);
+		ptr++;
+		s->period->s = timelib_get_unsigned_nr(&ptr, 2);
+		s->have_period = 1;
 		TIMELIB_DEINIT;
-		s->have_recurrences = 1;
 		return TIMELIB_PERIOD;
 	}
-#line 924 ""
+#line 960 ""
 }
 #line 321 "ext/date/lib/parse_iso_intervals.re"
 
@@ -931,6 +967,7 @@ static int scan(Scanner *s)
 
 #define YYMAXFILL 20
 
+
 void timelib_strtointerval(const char *s, size_t len,
                            timelib_time **begin, timelib_time **end,
 						   timelib_rel_time **period, int *recurrences,
diff --git a/ext/date/lib/timelib.h b/ext/date/lib/timelib.h
index 4582fcfd46917..a2c976af7ed9c 100644
--- a/ext/date/lib/timelib.h
+++ b/ext/date/lib/timelib.h
@@ -1,7 +1,7 @@
 /*
  * The MIT License (MIT)
  *
- * Copyright (c) 2015-2023 Derick Rethans
+ * Copyright (c) 2015-2024 Derick Rethans
  * Copyright (c) 2018,2021 MongoDB, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -30,9 +30,9 @@
 # include "timelib_config.h"
 #endif
 
-#define TIMELIB_VERSION 202210
-#define TIMELIB_EXTENDED_VERSION 20221001
-#define TIMELIB_ASCII_VERSION "2022.10"
+#define TIMELIB_VERSION 202212
+#define TIMELIB_EXTENDED_VERSION 20221201
+#define TIMELIB_ASCII_VERSION "2022.12"
 
 #include 
 #include 
diff --git a/ext/date/lib/timelib_private.h b/ext/date/lib/timelib_private.h
index 65ec6b014b894..3c5f9b22147c0 100644
--- a/ext/date/lib/timelib_private.h
+++ b/ext/date/lib/timelib_private.h
@@ -126,6 +126,15 @@
 # define TIMELIB_BREAK_INTENTIONALLY_MISSING
 #endif
 
+#if defined(__has_builtin)
+# if __has_builtin(__builtin_saddll_overflow)
+#  define TIMELIB_HAVE_BUILTIN_SADDLL_OVERFLOW 1
+# endif
+#endif
+
+#ifndef TIMELIB_HAVE_BUILTIN_SADDLL_OVERFLOW
+# define TIMELIB_HAVE_BUILTIN_SADDLL_OVERFLOW 0
+#endif
 struct _ttinfo
 {
 	int32_t      offset;
diff --git a/ext/date/php_date.c b/ext/date/php_date.c
index aa7899e5e315a..95a5e5ae7364b 100644
--- a/ext/date/php_date.c
+++ b/ext/date/php_date.c
@@ -318,6 +318,7 @@ static void date_throw_uninitialized_error(zend_class_entry *ce)
 		}
 		if (ce_ptr->type != ZEND_INTERNAL_CLASS) {
 			zend_throw_error(date_ce_date_object_error, "Object of type %s not been correctly initialized by calling parent::__construct() in its constructor", ZSTR_VAL(ce->name));
+			return;
 		}
 		zend_throw_error(date_ce_date_object_error, "Object of type %s (inheriting %s) has not been correctly initialized by calling parent::__construct() in its constructor", ZSTR_VAL(ce->name), ZSTR_VAL(ce_ptr->name));
 	}
@@ -359,10 +360,12 @@ static int date_interval_compare_objects(zval *o1, zval *o2);
 static zval *date_interval_read_property(zend_object *object, zend_string *member, int type, void **cache_slot, zval *rv);
 static zval *date_interval_write_property(zend_object *object, zend_string *member, zval *value, void **cache_slot);
 static zval *date_interval_get_property_ptr_ptr(zend_object *object, zend_string *member, int type, void **cache_slot);
+static int date_period_has_property(zend_object *object, zend_string *name, int type, void **cache_slot);
 static zval *date_period_read_property(zend_object *object, zend_string *name, int type, void **cache_slot, zval *rv);
 static zval *date_period_write_property(zend_object *object, zend_string *name, zval *value, void **cache_slot);
 static zval *date_period_get_property_ptr_ptr(zend_object *object, zend_string *name, int type, void **cache_slot);
-
+static void date_period_unset_property(zend_object *object, zend_string *name, void **cache_slot);
+static HashTable *date_period_get_properties_for(zend_object *object, zend_prop_purpose purpose);
 static int date_object_compare_timezone(zval *tz1, zval *tz2);
 
 /* {{{ Module struct */
@@ -702,8 +705,11 @@ static zend_string *date_format(const char *format, size_t format_len, timelib_t
 			                          (offset->offset < 0) ? '-' : '+',
 			                          abs(offset->offset / 3600),
 			                          abs((offset->offset % 3600) / 60));
-		} else {
+		} else if (t->zone_type == TIMELIB_ZONETYPE_ID) {
 			offset = timelib_get_time_zone_info(t->sse, t->tz_info);
+		} else {
+			/* Shouldn't happen, but code defensively */
+			offset = timelib_time_offset_ctor();
 		}
 	}
 
@@ -1501,45 +1507,6 @@ static void create_date_period_interval(timelib_rel_time *interval, zval *zv)
 	}
 }
 
-static void write_date_period_property(zend_object *obj, const char *name, const size_t name_len, zval *zv)
-{
-	zend_string *property_name = zend_string_init(name, name_len, 0);
-
-	zend_std_write_property(obj, property_name, zv, NULL);
-
-	zval_ptr_dtor(zv);
-	zend_string_release(property_name);
-}
-
-static void initialize_date_period_properties(php_period_obj *period_obj)
-{
-	zval zv;
-
-	/* rebuild properties */
-	zend_std_get_properties_ex(&period_obj->std);
-
-	create_date_period_datetime(period_obj->start, period_obj->start_ce, &zv);
-	write_date_period_property(&period_obj->std, "start", sizeof("start") - 1, &zv);
-
-	create_date_period_datetime(period_obj->current, period_obj->start_ce, &zv);
-	write_date_period_property(&period_obj->std, "current", sizeof("current") - 1, &zv);
-
-	create_date_period_datetime(period_obj->end, period_obj->start_ce, &zv);
-	write_date_period_property(&period_obj->std, "end", sizeof("end") - 1, &zv);
-
-	create_date_period_interval(period_obj->interval, &zv);
-	write_date_period_property(&period_obj->std, "interval", sizeof("interval") - 1, &zv);
-
-	ZVAL_LONG(&zv, (zend_long) period_obj->recurrences);
-	write_date_period_property(&period_obj->std, "recurrences", sizeof("recurrences") - 1, &zv);
-
-	ZVAL_BOOL(&zv, period_obj->include_start_date);
-	write_date_period_property(&period_obj->std, "include_start_date", sizeof("include_start_date") - 1, &zv);
-
-	ZVAL_BOOL(&zv, period_obj->include_end_date);
-	write_date_period_property(&period_obj->std, "include_end_date", sizeof("include_end_date") - 1, &zv);
-}
-
 /* define an overloaded iterator structure */
 typedef struct {
 	zend_object_iterator  intern;
@@ -1659,10 +1626,7 @@ static void date_period_it_move_forward(zend_object_iterator *iter)
 	zend_std_get_properties_ex(&object->std);
 
 	create_date_period_datetime(object->current, object->start_ce, ¤t_zv);
-	zend_string *property_name = ZSTR_INIT_LITERAL("current", 0);
-	zend_std_write_property(&object->std, property_name, ¤t_zv, NULL);
 	zval_ptr_dtor(¤t_zv);
-	zend_string_release(property_name);
 
 	iterator->current_index++;
 	date_period_it_invalidate_current(iter);
@@ -1833,8 +1797,11 @@ static void date_register_classes(void) /* {{{ */
 	date_object_handlers_period.clone_obj = date_object_clone_period;
 	date_object_handlers_period.get_gc = date_object_get_gc_period;
 	date_object_handlers_period.get_property_ptr_ptr = date_period_get_property_ptr_ptr;
+	date_object_handlers_period.has_property = date_period_has_property;
 	date_object_handlers_period.read_property = date_period_read_property;
 	date_object_handlers_period.write_property = date_period_write_property;
+	date_object_handlers_period.get_properties_for = date_period_get_properties_for;
+	date_object_handlers_period.unset_property = date_period_unset_property;
 
 	date_ce_date_error = register_class_DateError(zend_ce_error);
 	date_ce_date_object_error = register_class_DateObjectError(date_ce_date_error);
@@ -2341,7 +2308,7 @@ static void add_common_properties(HashTable *myht, zend_object *zobj)
 
 	common = zend_std_get_properties(zobj);
 
-	ZEND_HASH_MAP_FOREACH_STR_KEY_VAL_IND(common, name, prop) {
+	ZEND_HASH_FOREACH_STR_KEY_VAL_IND(common, name, prop) {
 		if (zend_hash_add(myht, name, prop) != NULL) {
 			Z_TRY_ADDREF_P(prop);
 		}
@@ -2455,6 +2422,9 @@ PHPAPI bool php_date_initialize(php_date_obj *dateobj, const char *time_str, siz
 				new_dst    = tzobj->tzi.z.dst;
 				new_abbr   = timelib_strdup(tzobj->tzi.z.abbr);
 				break;
+			default:
+				zend_throw_error(NULL, "The DateTimeZone object has not been correctly initialized by its constructor");
+				return 0;
 		}
 		type = tzobj->type;
 	} else if (dateobj->time->tz_info) {
@@ -2729,7 +2699,7 @@ PHP_METHOD(DateTime, createFromInterface)
 }
 /* }}} */
 
-/* {{{ Creates new DateTime object from given unix timetamp */
+/* {{{ Creates new DateTime object from given unix timestamp */
 PHP_METHOD(DateTime, createFromTimestamp)
 {
 	zval         *value;
@@ -2995,7 +2965,7 @@ static void restore_custom_datetime_properties(zval *object, HashTable *myht)
 	zend_string      *prop_name;
 	zval             *prop_val;
 
-	ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
+	ZEND_HASH_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
 		if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_time_is_internal_property(prop_name)) {
 			continue;
 		}
@@ -4087,6 +4057,7 @@ PHP_METHOD(DateTimeZone, __construct)
 	if (!timezone_initialize(tzobj, ZSTR_VAL(tz), ZSTR_LEN(tz), &exception_message)) {
 		zend_throw_exception_ex(date_ce_date_invalid_timezone_exception, 0, "DateTimeZone::__construct(): %s", exception_message);
 		efree(exception_message);
+		RETURN_THROWS();
 	}
 }
 /* }}} */
@@ -4195,7 +4166,7 @@ static void restore_custom_datetimezone_properties(zval *object, HashTable *myht
 	zend_string      *prop_name;
 	zval             *prop_val;
 
-	ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
+	ZEND_HASH_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
 		if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_timezone_is_internal_property(prop_name)) {
 			continue;
 		}
@@ -4642,11 +4613,6 @@ PHP_METHOD(DateInterval, __construct)
 
 static void php_date_interval_initialize_from_hash(zval **return_value, php_interval_obj **intobj, HashTable *myht) /* {{{ */
 {
-	/* If ->diff is already set, then we need to free it first */
-	if ((*intobj)->diff) {
-		timelib_rel_time_dtor((*intobj)->diff);
-	}
-
 	/* If we have a date_string, use that instead */
 	zval *date_str = zend_hash_str_find(myht, "date_string", strlen("date_string"));
 	if (date_str && Z_TYPE_P(date_str) == IS_STRING) {
@@ -4661,6 +4627,14 @@ static void php_date_interval_initialize_from_hash(zval **return_value, php_inte
 				Z_STRVAL_P(date_str),
 				err->error_messages[0].position,
 				err->error_messages[0].character ? err->error_messages[0].character : ' ', err->error_messages[0].message);
+				timelib_time_dtor(time);
+				timelib_error_container_dtor(err);
+				return;
+		}
+
+		/* If ->diff is already set, then we need to free it first */
+		if ((*intobj)->diff) {
+			timelib_rel_time_dtor((*intobj)->diff);
 		}
 
 		(*intobj)->diff = timelib_rel_time_clone(&time->relative);
@@ -4675,6 +4649,11 @@ static void php_date_interval_initialize_from_hash(zval **return_value, php_inte
 		return;
 	}
 
+	/* If ->diff is already set, then we need to free it first */
+	if ((*intobj)->diff) {
+		timelib_rel_time_dtor((*intobj)->diff);
+	}
+
 	/* Set new value */
 	(*intobj)->diff = timelib_rel_time_ctor();
 
@@ -4822,7 +4801,7 @@ static void restore_custom_dateinterval_properties(zval *object, HashTable *myht
 	zend_string      *prop_name;
 	zval             *prop_val;
 
-	ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
+	ZEND_HASH_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
 		if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_interval_is_internal_property(prop_name)) {
 			continue;
 		}
@@ -5122,8 +5101,6 @@ static bool date_period_init_finish(php_period_obj *dpobj, zend_long options, ze
 
 	dpobj->initialized = 1;
 
-	initialize_date_period_properties(dpobj);
-
 	return true;
 }
 
@@ -5539,6 +5516,9 @@ static void php_do_date_sunrise_sunset(INTERNAL_FUNCTION_PARAMETERS, bool calc_s
 	if (N > 24 || N < 0) {
 		N -= floor(N / 24) * 24;
 	}
+	if (N > 24 || N < 0) {
+		RETURN_FALSE;
+	}
 
 	switch (retformat) {
 		case SUNFUNCS_RET_STRING:
@@ -5827,8 +5807,6 @@ static bool php_date_period_initialize_from_hash(php_period_obj *period_obj, Has
 
 	period_obj->initialized = 1;
 
-	initialize_date_period_properties(period_obj);
-
 	return 1;
 } /* }}} */
 
@@ -5900,7 +5878,7 @@ static void restore_custom_dateperiod_properties(zval *object, HashTable *myht)
 	zend_string      *prop_name;
 	zval             *prop_val;
 
-	ZEND_HASH_MAP_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
+	ZEND_HASH_FOREACH_STR_KEY_VAL(myht, prop_name, prop_val) {
 		if (!prop_name || (Z_TYPE_P(prop_val) == IS_REFERENCE) || date_period_is_internal_property(prop_name)) {
 			continue;
 		}
@@ -5948,14 +5926,84 @@ PHP_METHOD(DatePeriod, __wakeup)
 		zend_throw_error(NULL, "Invalid serialization data for DatePeriod object");
 		RETURN_THROWS();
 	}
+
+	restore_custom_dateperiod_properties(object, myht);
 }
 /* }}} */
 
+static int date_period_has_property(zend_object *object, zend_string *name, int type, void **cache_slot)
+{
+	zval rv;
+	zval *prop;
+
+	if (!date_period_is_internal_property(name)) {
+		return zend_std_has_property(object, name, type, cache_slot);
+	}
+
+	php_period_obj *period_obj = php_period_obj_from_obj(object);
+	if (!period_obj->initialized) {
+		switch (type) {
+			case ZEND_PROPERTY_ISSET: /* Intentional fallthrough */
+			case ZEND_PROPERTY_NOT_EMPTY:
+				return 0;
+			case ZEND_PROPERTY_EXISTS:
+				return 1;
+			EMPTY_SWITCH_DEFAULT_CASE()
+		}
+	}
+
+	if (type == ZEND_PROPERTY_EXISTS) {
+		return 1;
+	}
+
+	prop = date_period_read_property(object, name, BP_VAR_IS, cache_slot, &rv);
+	ZEND_ASSERT(prop != &EG(uninitialized_zval));
+
+	bool result;
+
+	if (type == ZEND_PROPERTY_NOT_EMPTY) {
+		result = zend_is_true(prop);
+	} else if (type == ZEND_PROPERTY_ISSET) {
+		result = Z_TYPE_P(prop) != IS_NULL;
+	} else {
+		ZEND_UNREACHABLE();
+	}
+
+	zval_ptr_dtor(prop);
+
+	return result;
+}
+
 /* {{{ date_period_read_property */
 static zval *date_period_read_property(zend_object *object, zend_string *name, int type, void **cache_slot, zval *rv)
 {
-	if (type != BP_VAR_IS && type != BP_VAR_R) {
-		if (date_period_is_internal_property(name)) {
+	if (date_period_is_internal_property(name)) {
+		if (type == BP_VAR_IS || type == BP_VAR_R) {
+			php_period_obj *period_obj = php_period_obj_from_obj(object);
+
+			if (zend_string_equals_literal(name, "start")) {
+				create_date_period_datetime(period_obj->start, period_obj->start_ce, rv);
+				return rv;
+			} else if (zend_string_equals_literal(name, "current")) {
+				create_date_period_datetime(period_obj->current, period_obj->start_ce, rv);
+				return rv;
+			} else if (zend_string_equals_literal(name, "end")) {
+				create_date_period_datetime(period_obj->end, period_obj->start_ce, rv);
+				return rv;
+			} else if (zend_string_equals_literal(name, "interval")) {
+				create_date_period_interval(period_obj->interval, rv);
+				return rv;
+			} else if (zend_string_equals_literal(name, "recurrences")) {
+				ZVAL_LONG(rv, period_obj->recurrences);
+				return rv;
+			} else if (zend_string_equals_literal(name, "include_start_date")) {
+				ZVAL_BOOL(rv, period_obj->include_start_date);
+				return rv;
+			} else if (zend_string_equals_literal(name, "include_end_date")) {
+				ZVAL_BOOL(rv, period_obj->include_end_date);
+				return rv;
+			}
+		} else {
 			zend_readonly_property_modification_error_ex("DatePeriod", ZSTR_VAL(name));
 			return &EG(uninitialized_zval);
 		}
@@ -5984,3 +6032,26 @@ static zval *date_period_get_property_ptr_ptr(zend_object *object, zend_string *
 
 	return zend_std_get_property_ptr_ptr(object, name, type, cache_slot);
 }
+
+static HashTable *date_period_get_properties_for(zend_object *object, zend_prop_purpose purpose)
+{
+	php_period_obj *period_obj = php_period_obj_from_obj(object);
+	HashTable *props = zend_array_dup(zend_std_get_properties(object));
+	if (!period_obj->initialized) {
+		return props;
+	}
+
+	date_period_object_to_hash(period_obj, props);
+
+	return props;
+}
+
+static void date_period_unset_property(zend_object *object, zend_string *name, void **cache_slot)
+{
+	if (date_period_is_internal_property(name)) {
+		zend_throw_error(NULL, "Cannot unset %s::$%s", ZSTR_VAL(object->ce->name), ZSTR_VAL(name));
+		return;
+	}
+
+	zend_std_unset_property(object, name, cache_slot);
+}
diff --git a/ext/date/php_date.stub.php b/ext/date/php_date.stub.php
index e18221e712a5d..d0119aac88ad5 100644
--- a/ext/date/php_date.stub.php
+++ b/ext/date/php_date.stub.php
@@ -673,19 +673,40 @@ class DatePeriod implements IteratorAggregate
     /** @cvalue PHP_DATE_PERIOD_INCLUDE_END_DATE */
     public const int INCLUDE_END_DATE = UNKNOWN;
 
-    /** @readonly */
+    /**
+     * @readonly
+     * @virtual
+     */
     public ?DateTimeInterface $start;
-    /** @readonly */
+    /**
+     * @readonly
+     * @virtual
+     */
     public ?DateTimeInterface $current;
-    /** @readonly */
+    /**
+     * @readonly
+     * @virtual
+     */
     public ?DateTimeInterface $end;
-    /** @readonly */
+    /**
+     * @readonly
+     * @virtual
+     */
     public ?DateInterval $interval;
-    /** @readonly */
+    /**
+     * @readonly
+     * @virtual
+     */
     public int $recurrences;
-    /** @readonly */
+    /**
+     * @readonly
+     * @virtual
+     */
     public bool $include_start_date;
-    /** @readonly */
+    /**
+     * @readonly
+     * @virtual
+     */
     public bool $include_end_date;
 
     public static function createFromISO8601String(string $specification, int $options = 0): static {}
diff --git a/ext/date/php_date_arginfo.h b/ext/date/php_date_arginfo.h
index 155965a5ddb97..8ce0114206cfe 100644
--- a/ext/date/php_date_arginfo.h
+++ b/ext/date/php_date_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 41c7662745d19808dd4550b37cd1b9f2aa94d75b */
+ * Stub hash: d7a318f6fd85e23c6352323e03c323035a511738 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_strtotime, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, datetime, IS_STRING, 0)
@@ -813,7 +813,7 @@ static void register_php_date_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("SUNFUNCS_RET_DOUBLE", SUNFUNCS_RET_DOUBLE, CONST_PERSISTENT | CONST_DEPRECATED);
 
 
-	zend_attribute *attribute_Deprecated_func_strftime_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "strftime", sizeof("strftime") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_strftime_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "strftime", sizeof("strftime") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_strftime_0_arg0;
 	zend_string *attribute_Deprecated_func_strftime_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_strftime_0_arg0, attribute_Deprecated_func_strftime_0_arg0_str);
@@ -825,7 +825,7 @@ static void register_php_date_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_strftime_0->args[1].value, &attribute_Deprecated_func_strftime_0_arg1);
 	attribute_Deprecated_func_strftime_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_gmstrftime_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "gmstrftime", sizeof("gmstrftime") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_gmstrftime_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "gmstrftime", sizeof("gmstrftime") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_gmstrftime_0_arg0;
 	zend_string *attribute_Deprecated_func_gmstrftime_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_gmstrftime_0_arg0, attribute_Deprecated_func_gmstrftime_0_arg0_str);
@@ -837,7 +837,7 @@ static void register_php_date_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_gmstrftime_0->args[1].value, &attribute_Deprecated_func_gmstrftime_0_arg1);
 	attribute_Deprecated_func_gmstrftime_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_date_sunrise_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "date_sunrise", sizeof("date_sunrise") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_date_sunrise_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "date_sunrise", sizeof("date_sunrise") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_date_sunrise_0_arg0;
 	zend_string *attribute_Deprecated_func_date_sunrise_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_date_sunrise_0_arg0, attribute_Deprecated_func_date_sunrise_0_arg0_str);
@@ -849,7 +849,7 @@ static void register_php_date_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_date_sunrise_0->args[1].value, &attribute_Deprecated_func_date_sunrise_0_arg1);
 	attribute_Deprecated_func_date_sunrise_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_date_sunset_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "date_sunset", sizeof("date_sunset") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_date_sunset_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "date_sunset", sizeof("date_sunset") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_date_sunset_0_arg0;
 	zend_string *attribute_Deprecated_func_date_sunset_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_date_sunset_0_arg0, attribute_Deprecated_func_date_sunset_0_arg0_str);
@@ -1120,46 +1120,46 @@ static zend_class_entry *register_class_DatePeriod(zend_class_entry *class_entry
 	ZVAL_UNDEF(&property_start_default_value);
 	zend_string *property_start_name = zend_string_init("start", sizeof("start") - 1, 1);
 	zend_string *property_start_class_DateTimeInterface = zend_string_init("DateTimeInterface", sizeof("DateTimeInterface")-1, 1);
-	zend_declare_typed_property(class_entry, property_start_name, &property_start_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_start_class_DateTimeInterface, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_start_name, &property_start_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_start_class_DateTimeInterface, 0, MAY_BE_NULL));
 	zend_string_release(property_start_name);
 
 	zval property_current_default_value;
 	ZVAL_UNDEF(&property_current_default_value);
 	zend_string *property_current_name = zend_string_init("current", sizeof("current") - 1, 1);
 	zend_string *property_current_class_DateTimeInterface = zend_string_init("DateTimeInterface", sizeof("DateTimeInterface")-1, 1);
-	zend_declare_typed_property(class_entry, property_current_name, &property_current_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_current_class_DateTimeInterface, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_current_name, &property_current_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_current_class_DateTimeInterface, 0, MAY_BE_NULL));
 	zend_string_release(property_current_name);
 
 	zval property_end_default_value;
 	ZVAL_UNDEF(&property_end_default_value);
 	zend_string *property_end_name = zend_string_init("end", sizeof("end") - 1, 1);
 	zend_string *property_end_class_DateTimeInterface = zend_string_init("DateTimeInterface", sizeof("DateTimeInterface")-1, 1);
-	zend_declare_typed_property(class_entry, property_end_name, &property_end_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_end_class_DateTimeInterface, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_end_name, &property_end_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_end_class_DateTimeInterface, 0, MAY_BE_NULL));
 	zend_string_release(property_end_name);
 
 	zval property_interval_default_value;
 	ZVAL_UNDEF(&property_interval_default_value);
 	zend_string *property_interval_name = zend_string_init("interval", sizeof("interval") - 1, 1);
 	zend_string *property_interval_class_DateInterval = zend_string_init("DateInterval", sizeof("DateInterval")-1, 1);
-	zend_declare_typed_property(class_entry, property_interval_name, &property_interval_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_interval_class_DateInterval, 0, MAY_BE_NULL));
+	zend_declare_typed_property(class_entry, property_interval_name, &property_interval_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_CLASS(property_interval_class_DateInterval, 0, MAY_BE_NULL));
 	zend_string_release(property_interval_name);
 
 	zval property_recurrences_default_value;
 	ZVAL_UNDEF(&property_recurrences_default_value);
 	zend_string *property_recurrences_name = zend_string_init("recurrences", sizeof("recurrences") - 1, 1);
-	zend_declare_typed_property(class_entry, property_recurrences_name, &property_recurrences_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_declare_typed_property(class_entry, property_recurrences_name, &property_recurrences_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release(property_recurrences_name);
 
 	zval property_include_start_date_default_value;
 	ZVAL_UNDEF(&property_include_start_date_default_value);
 	zend_string *property_include_start_date_name = zend_string_init("include_start_date", sizeof("include_start_date") - 1, 1);
-	zend_declare_typed_property(class_entry, property_include_start_date_name, &property_include_start_date_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_declare_typed_property(class_entry, property_include_start_date_name, &property_include_start_date_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
 	zend_string_release(property_include_start_date_name);
 
 	zval property_include_end_date_default_value;
 	ZVAL_UNDEF(&property_include_end_date_default_value);
 	zend_string *property_include_end_date_name = zend_string_init("include_end_date", sizeof("include_end_date") - 1, 1);
-	zend_declare_typed_property(class_entry, property_include_end_date_name, &property_include_end_date_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
+	zend_declare_typed_property(class_entry, property_include_end_date_name, &property_include_end_date_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
 	zend_string_release(property_include_end_date_name);
 
 	return class_entry;
diff --git a/ext/date/tests/DateTimeZone_clone_basic1.phpt b/ext/date/tests/DateTimeZone_clone_basic1.phpt
index 3d154512f6373..03af7108c4975 100644
--- a/ext/date/tests/DateTimeZone_clone_basic1.phpt
+++ b/ext/date/tests/DateTimeZone_clone_basic1.phpt
@@ -22,7 +22,7 @@ if ($clone != $orig) {
 }else if ($clone === $orig) {
     echo "TEST FAILED : objects identical\n";
 } else {
-    echo "TEST PASSED : Objects equal but not indetical\n";
+    echo "TEST PASSED : Objects equal but not identical\n";
 }
 
 ?>
@@ -40,4 +40,4 @@ object(DateTimeZone)#%d (2) {
   ["timezone"]=>
   string(3) "GMT"
 }
-TEST PASSED : Objects equal but not indetical
+TEST PASSED : Objects equal but not identical
diff --git a/ext/date/tests/DateTimeZone_serialize_type_1.phpt b/ext/date/tests/DateTimeZone_serialize_type_1.phpt
index f35a133cfb4fd..0243f68764a2d 100644
--- a/ext/date/tests/DateTimeZone_serialize_type_1.phpt
+++ b/ext/date/tests/DateTimeZone_serialize_type_1.phpt
@@ -12,7 +12,7 @@ var_dump($serialized);
 
 $tz2 = unserialize($serialized);
 var_dump($tz2);
-// Try to use unserialzied object
+// Try to use unserialized object
 var_dump( $tz2->getName() );
 
 ?>
diff --git a/ext/date/tests/DateTimeZone_serialize_type_2.phpt b/ext/date/tests/DateTimeZone_serialize_type_2.phpt
index a823ee08c022a..5240fa954420a 100644
--- a/ext/date/tests/DateTimeZone_serialize_type_2.phpt
+++ b/ext/date/tests/DateTimeZone_serialize_type_2.phpt
@@ -12,7 +12,7 @@ var_dump($serialized);
 
 $tz2 = unserialize($serialized);
 var_dump($tz2);
-// Try to use unserialzied object
+// Try to use unserialized object
 var_dump( $tz2->getName() );
 
 ?>
diff --git a/ext/date/tests/DateTimeZone_serialize_type_3.phpt b/ext/date/tests/DateTimeZone_serialize_type_3.phpt
index 92ac958dc34af..e1c6719a03d42 100644
--- a/ext/date/tests/DateTimeZone_serialize_type_3.phpt
+++ b/ext/date/tests/DateTimeZone_serialize_type_3.phpt
@@ -12,7 +12,7 @@ var_dump($serialized);
 
 $tz2 = unserialize($serialized);
 var_dump($tz2);
-// Try to use unserialzied object
+// Try to use unserialized object
 var_dump( $tz2->getName() );
 
 ?>
diff --git a/ext/date/tests/DateTime_serialize.phpt b/ext/date/tests/DateTime_serialize.phpt
index 8424a3e082e74..427b43f70e16c 100644
--- a/ext/date/tests/DateTime_serialize.phpt
+++ b/ext/date/tests/DateTime_serialize.phpt
@@ -12,7 +12,7 @@ var_dump($serialized);
 
 $date2 = unserialize($serialized);
 var_dump($date2);
-// Try to use unserialzied object
+// Try to use unserialized object
 var_dump( $date2->format( "F j, Y, g:i a") );
 
 ?>
diff --git a/ext/date/tests/ExtendDateTime.phpt b/ext/date/tests/ExtendDateTime.phpt
index 70ed2793e6efe..ba445338403e7 100644
--- a/ext/date/tests/ExtendDateTime.phpt
+++ b/ext/date/tests/ExtendDateTime.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Extendig DatTime and calling __set_state without args
+Extending DateTime and calling __set_state without args
 --CREDITS--
 Gabriel Caruso (carusogabriel34@gmail.com)
 --FILE--
diff --git a/ext/date/tests/bug-gh15582.phpt b/ext/date/tests/bug-gh15582.phpt
new file mode 100644
index 0000000000000..ab03e190e4bc3
--- /dev/null
+++ b/ext/date/tests/bug-gh15582.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug GH-15582: Crash when not calling parent constructor of DateTimeZone
+--FILE--
+getMessage(), "\n";
+}
+?>
+--EXPECT--
+Error: The DateTimeZone object has not been correctly initialized by its constructor
diff --git a/ext/date/tests/bug-gh16037.phpt b/ext/date/tests/bug-gh16037.phpt
new file mode 100644
index 0000000000000..834bc653c2fb5
--- /dev/null
+++ b/ext/date/tests/bug-gh16037.phpt
@@ -0,0 +1,9 @@
+--TEST--
+Test for bug GH-16037: Assertion failure in ext/date/php_date.c
+--FILE--
+__unserialize([[]]);
+echo gettype($di);
+?>
+--EXPECT--
+NULL
diff --git a/ext/date/tests/bug36224.phpt b/ext/date/tests/bug36224.phpt
index 1690f4e7b2ce5..7fe6165fb42ae 100644
--- a/ext/date/tests/bug36224.phpt
+++ b/ext/date/tests/bug36224.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #36224 (date(DATE_ATOM) gives wrong resulsts)
+Bug #36224 (date(DATE_ATOM) gives wrong results)
 --FILE--
 
 --EXPECT--
 2000-01-01 13:00:00
-2000-01-01 13:00:00
 2000-01-01 11:00:00
 2000-01-01 13:00:00
+2000-01-01 13:00:00
diff --git a/ext/date/tests/date_interval_set_state_error1.phpt b/ext/date/tests/date_interval_set_state_error1.phpt
new file mode 100644
index 0000000000000..ee68de8db4666
--- /dev/null
+++ b/ext/date/tests/date_interval_set_state_error1.phpt
@@ -0,0 +1,68 @@
+--TEST--
+Test that DateInterval::__unserialize() doesn't modify state in case of a date_string format error
+--FILE--
+__unserialize(
+        [
+            "date_string" => "wrong",
+        ]
+    );
+} catch (Error $e) {
+    echo $e->getMessage() . "\n";
+}
+
+var_dump($interval);
+
+?>
+--EXPECTF--
+object(DateInterval)#%d (%d) {
+  ["y"]=>
+  int(1)
+  ["m"]=>
+  int(0)
+  ["d"]=>
+  int(1)
+  ["h"]=>
+  int(1)
+  ["i"]=>
+  int(1)
+  ["s"]=>
+  int(0)
+  ["f"]=>
+  float(0)
+  ["invert"]=>
+  int(0)
+  ["days"]=>
+  bool(false)
+  ["from_string"]=>
+  bool(false)
+}
+Unknown or bad format (wrong) at position 0 (w) while unserializing: The timezone could not be found in the database
+object(DateInterval)#%d (%d) {
+  ["y"]=>
+  int(1)
+  ["m"]=>
+  int(0)
+  ["d"]=>
+  int(1)
+  ["h"]=>
+  int(1)
+  ["i"]=>
+  int(1)
+  ["s"]=>
+  int(0)
+  ["f"]=>
+  float(0)
+  ["invert"]=>
+  int(0)
+  ["days"]=>
+  bool(false)
+  ["from_string"]=>
+  bool(false)
+}
diff --git a/ext/date/tests/date_isodate_set_basic1.phpt b/ext/date/tests/date_isodate_set_basic1.phpt
index 739d0a8fd4a69..54904e840974e 100644
--- a/ext/date/tests/date_isodate_set_basic1.phpt
+++ b/ext/date/tests/date_isodate_set_basic1.phpt
@@ -7,7 +7,7 @@ echo "*** Testing date_isodate_set() : basic functionality ***\n";
 //Set the default time zone
 date_default_timezone_set("Europe/London");
 
-// Create a deate object
+// Create a date object
 $datetime = date_create("2009-01-30 17:57:32");
 
 // Which month is week 40 ?
diff --git a/ext/date/tests/date_period_is_property.phpt b/ext/date/tests/date_period_is_property.phpt
new file mode 100644
index 0000000000000..6ed5e88ae89ef
--- /dev/null
+++ b/ext/date/tests/date_period_is_property.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Test isset on DatePeriod instantiated without its constructor
+--FILE--
+newInstanceWithoutConstructor();
+
+var_dump(isset($di->start));
+var_dump(empty($di->start));
+var_dump(property_exists($di, "start"));
+
+var_dump(isset($di->recurrences));
+var_dump(empty($di->recurrences));
+var_dump(property_exists($di, "recurrences"));
+
+var_dump(isset($di->end));
+var_dump(empty($di->end));
+var_dump(property_exists($di, "end"));
+
+var_dump(isset($di->my));
+var_dump(empty($di->my));
+var_dump(property_exists($di, "my"));
+
+?>
+--EXPECT--
+bool(false)
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(true)
diff --git a/ext/date/tests/date_period_properties.phpt b/ext/date/tests/date_period_properties.phpt
new file mode 100644
index 0000000000000..150677ca71e4e
--- /dev/null
+++ b/ext/date/tests/date_period_properties.phpt
@@ -0,0 +1,187 @@
+--TEST--
+Test different usages of DatePeriod properties
+--FILE--
+
+--EXPECTF--
+object(MyDatePeriod)#%d (%d) {
+  ["prop"]=>
+  int(3)
+  ["start"]=>
+  object(DateTimeImmutable)#%d (%d) {
+    ["date"]=>
+    string(26) "2012-07-01 00:00:00.000000"
+    ["timezone_type"]=>
+    int(1)
+    ["timezone"]=>
+    string(6) "+00:00"
+  }
+  ["current"]=>
+  NULL
+  ["end"]=>
+  NULL
+  ["interval"]=>
+  object(DateInterval)#%d (%d) {
+    ["y"]=>
+    int(0)
+    ["m"]=>
+    int(0)
+    ["d"]=>
+    int(7)
+    ["h"]=>
+    int(0)
+    ["i"]=>
+    int(0)
+    ["s"]=>
+    int(0)
+    ["f"]=>
+    float(0)
+    ["invert"]=>
+    int(0)
+    ["days"]=>
+    bool(false)
+    ["from_string"]=>
+    bool(false)
+  }
+  ["recurrences"]=>
+  int(5)
+  ["include_start_date"]=>
+  bool(true)
+  ["include_end_date"]=>
+  bool(false)
+}
+string(%d) "{"prop":3,"start":{"date":"2012-07-01 00:00:00.000000","timezone_type":1,"timezone":"+00:00"},"current":null,"end":null,"interval":{"y":0,"m":0,"d":7,"h":0,"i":0,"s":0,"f":0,"invert":0,"days":false,"from_string":false},"recurrences":5,"include_start_date":true,"include_end_date":false}"
+string(%d) "O:12:"MyDatePeriod":8:{s:5:"start";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"2012-07-01 00:00:00.000000";s:13:"timezone_type";i:1;s:8:"timezone";s:6:"+00:00";}s:7:"current";N;s:3:"end";N;s:8:"interval";O:12:"DateInterval":10:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:7;s:1:"h";i:0;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";b:0;s:11:"from_string";b:0;}s:11:"recurrences";i:5;s:18:"include_start_date";b:1;s:16:"include_end_date";b:0;s:4:"prop";i:3;}"
+array(%d) {
+  ["prop"]=>
+  int(3)
+  ["start"]=>
+  object(DateTimeImmutable)#%d (%d) {
+    ["date"]=>
+    string(26) "2012-07-01 00:00:00.000000"
+    ["timezone_type"]=>
+    int(1)
+    ["timezone"]=>
+    string(6) "+00:00"
+  }
+  ["current"]=>
+  NULL
+  ["end"]=>
+  NULL
+  ["interval"]=>
+  object(DateInterval)#%d (%d) {
+    ["y"]=>
+    int(0)
+    ["m"]=>
+    int(0)
+    ["d"]=>
+    int(7)
+    ["h"]=>
+    int(0)
+    ["i"]=>
+    int(0)
+    ["s"]=>
+    int(0)
+    ["f"]=>
+    float(0)
+    ["invert"]=>
+    int(0)
+    ["days"]=>
+    bool(false)
+    ["from_string"]=>
+    bool(false)
+  }
+  ["recurrences"]=>
+  int(5)
+  ["include_start_date"]=>
+  bool(true)
+  ["include_end_date"]=>
+  bool(false)
+}
+\MyDatePeriod::__set_state(array(
+   'prop' => 3,
+   'start' => 
+  \DateTimeImmutable::__set_state(array(
+     'date' => '2012-07-01 00:00:00.000000',
+     'timezone_type' => 1,
+     'timezone' => '+00:00',
+  )),
+   'current' => NULL,
+   'end' => NULL,
+   'interval' => 
+  \DateInterval::__set_state(array(
+     'y' => 0,
+     'm' => 0,
+     'd' => 7,
+     'h' => 0,
+     'i' => 0,
+     's' => 0,
+     'f' => 0.0,
+     'invert' => 0,
+     'days' => false,
+     'from_string' => false,
+  )),
+   'recurrences' => 5,
+   'include_start_date' => true,
+   'include_end_date' => false,
+))NULL
+array(%d) {
+  ["prop"]=>
+  int(3)
+  ["start"]=>
+  object(DateTimeImmutable)#%d (%d) {
+    ["date"]=>
+    string(26) "2012-07-01 00:00:00.000000"
+    ["timezone_type"]=>
+    int(1)
+    ["timezone"]=>
+    string(6) "+00:00"
+  }
+  ["current"]=>
+  NULL
+  ["end"]=>
+  NULL
+  ["interval"]=>
+  object(DateInterval)#%d (%d) {
+    ["y"]=>
+    int(0)
+    ["m"]=>
+    int(0)
+    ["d"]=>
+    int(7)
+    ["h"]=>
+    int(0)
+    ["i"]=>
+    int(0)
+    ["s"]=>
+    int(0)
+    ["f"]=>
+    float(0)
+    ["invert"]=>
+    int(0)
+    ["days"]=>
+    bool(false)
+    ["from_string"]=>
+    bool(false)
+  }
+  ["recurrences"]=>
+  int(5)
+  ["include_start_date"]=>
+  bool(true)
+  ["include_end_date"]=>
+  bool(false)
+}
diff --git a/ext/date/tests/date_period_unserialize3.phpt b/ext/date/tests/date_period_unserialize3.phpt
index d5d4a57456d9a..4570e3de631fc 100644
--- a/ext/date/tests/date_period_unserialize3.phpt
+++ b/ext/date/tests/date_period_unserialize3.phpt
@@ -11,9 +11,9 @@ $period = new DatePeriod($start, $interval, $end);
 try {
     $period->__unserialize(
         [
-            "current" => new DateTime,
-            "start" => new DateTime,
-            "end" => new DateTime,
+            "current" => new DateTime("2024-08-27 00:00:00"),
+            "start" => new DateTime("2024-08-28 00:00:00"),
+            "end" => new DateTime("2024-08-29 00:00:00"),
             "interval" => new DateInterval('P2D'),
             "recurrences" => 2,
             "include_start_date" => "wrong type",
@@ -33,18 +33,25 @@ object(DatePeriod)#%d (%d) {
   ["start"]=>
   object(DateTime)#%d (%d) {
     ["date"]=>
-    string(26) "2022-07-14 00:00:00.000000"
+    string(26) "2024-08-28 00:00:00.000000"
     ["timezone_type"]=>
     int(3)
     ["timezone"]=>
     string(3) "UTC"
   }
   ["current"]=>
-  NULL
+  object(DateTime)#%d (%d) {
+    ["date"]=>
+    string(26) "2024-08-27 00:00:00.000000"
+    ["timezone_type"]=>
+    int(3)
+    ["timezone"]=>
+    string(3) "UTC"
+  }
   ["end"]=>
   object(DateTime)#%d (%d) {
     ["date"]=>
-    string(26) "2022-07-16 00:00:00.000000"
+    string(26) "2024-08-29 00:00:00.000000"
     ["timezone_type"]=>
     int(3)
     ["timezone"]=>
@@ -57,7 +64,7 @@ object(DatePeriod)#%d (%d) {
     ["m"]=>
     int(0)
     ["d"]=>
-    int(1)
+    int(2)
     ["h"]=>
     int(0)
     ["i"]=>
@@ -74,7 +81,7 @@ object(DatePeriod)#%d (%d) {
     bool(false)
   }
   ["recurrences"]=>
-  int(1)
+  int(2)
   ["include_start_date"]=>
   bool(true)
   ["include_end_date"]=>
diff --git a/ext/date/tests/date_period_unset_property.phpt b/ext/date/tests/date_period_unset_property.phpt
new file mode 100644
index 0000000000000..7948d61d268d6
--- /dev/null
+++ b/ext/date/tests/date_period_unset_property.phpt
@@ -0,0 +1,71 @@
+--TEST--
+Test unsetting DatePeriod properties
+--FILE--
+prop);
+
+try {
+    $period->prop;
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    unset($period->start);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    unset($period->current);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    unset($period->end);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    unset($period->interval);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    unset($period->recurrences);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    unset($period->include_start_date);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    unset($period->include_end_date);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Typed property MyDatePeriod::$prop must not be accessed before initialization
+Cannot unset MyDatePeriod::$start
+Cannot unset MyDatePeriod::$current
+Cannot unset MyDatePeriod::$end
+Cannot unset MyDatePeriod::$interval
+Cannot unset MyDatePeriod::$recurrences
+Cannot unset MyDatePeriod::$include_start_date
+Cannot unset MyDatePeriod::$include_end_date
diff --git a/ext/date/tests/getdate_variation4.phpt b/ext/date/tests/getdate_variation4.phpt
index d216f02fcc20b..d7ea0c7e207c8 100644
--- a/ext/date/tests/getdate_variation4.phpt
+++ b/ext/date/tests/getdate_variation4.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Test getdate() function : usage variation - Verifyig by supplying year-wise sample time stamps since Unix epoch time
+Test getdate() function : usage variation - Verifying by supplying year-wise sample time stamps since Unix epoch time
 --FILE--
 
 --EXPECTF--
-object(I)#1 (11) {
+object(I)#%d (%d) {
+  ["var1":"I":private]=>
+  int(1)
+  ["var2":"I":private]=>
+  int(2)
+  ["var3":protected]=>
+  int(3)
+  ["var4":protected]=>
+  int(4)
   ["start"]=>
-  object(DateTimeImmutable)#5 (3) {
+  object(DateTimeImmutable)#%d (%d) {
     ["date"]=>
     string(26) "2023-03-03 16:24:00.000000"
     ["timezone_type"]=>
@@ -39,7 +47,7 @@ object(I)#1 (11) {
   ["current"]=>
   NULL
   ["end"]=>
-  object(DateTimeImmutable)#6 (3) {
+  object(DateTimeImmutable)#%d (%d) {
     ["date"]=>
     string(26) "2023-03-09 16:24:00.000000"
     ["timezone_type"]=>
@@ -48,7 +56,7 @@ object(I)#1 (11) {
     string(3) "UTC"
   }
   ["interval"]=>
-  object(DateInterval)#7 (10) {
+  object(DateInterval)#%d (%d) {
     ["y"]=>
     int(0)
     ["m"]=>
@@ -76,6 +84,9 @@ object(I)#1 (11) {
   bool(true)
   ["include_end_date"]=>
   bool(false)
+}
+string(631) "O:1:"I":11:{s:5:"start";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"2023-03-03 16:24:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:3:"UTC";}s:7:"current";N;s:3:"end";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"2023-03-09 16:24:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:3:"UTC";}s:8:"interval";O:12:"DateInterval":10:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:1;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";b:0;s:11:"from_string";b:0;}s:11:"recurrences";i:1;s:18:"include_start_date";b:1;s:16:"include_end_date";b:0;s:7:"!I!var1";i:1;s:7:"!I!var2";i:2;s:7:"!*!var3";i:3;s:7:"!*!var4";i:4;}"
+object(I)#%d (%d) {
   ["var1":"I":private]=>
   int(1)
   ["var2":"I":private]=>
@@ -84,11 +95,8 @@ object(I)#1 (11) {
   int(3)
   ["var4":protected]=>
   int(4)
-}
-string(631) "O:1:"I":11:{s:5:"start";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"2023-03-03 16:24:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:3:"UTC";}s:7:"current";N;s:3:"end";O:17:"DateTimeImmutable":3:{s:4:"date";s:26:"2023-03-09 16:24:00.000000";s:13:"timezone_type";i:3;s:8:"timezone";s:3:"UTC";}s:8:"interval";O:12:"DateInterval":10:{s:1:"y";i:0;s:1:"m";i:0;s:1:"d";i:0;s:1:"h";i:1;s:1:"i";i:0;s:1:"s";i:0;s:1:"f";d:0;s:6:"invert";i:0;s:4:"days";b:0;s:11:"from_string";b:0;}s:11:"recurrences";i:1;s:18:"include_start_date";b:1;s:16:"include_end_date";b:0;s:7:"!I!var1";i:1;s:7:"!I!var2";i:2;s:7:"!*!var3";i:3;s:7:"!*!var4";i:4;}"
-object(I)#2 (11) {
   ["start"]=>
-  object(DateTimeImmutable)#9 (3) {
+  object(DateTimeImmutable)#%d (%d) {
     ["date"]=>
     string(26) "2023-03-03 16:24:00.000000"
     ["timezone_type"]=>
@@ -99,7 +107,7 @@ object(I)#2 (11) {
   ["current"]=>
   NULL
   ["end"]=>
-  object(DateTimeImmutable)#10 (3) {
+  object(DateTimeImmutable)#%d (%d) {
     ["date"]=>
     string(26) "2023-03-09 16:24:00.000000"
     ["timezone_type"]=>
@@ -108,7 +116,7 @@ object(I)#2 (11) {
     string(3) "UTC"
   }
   ["interval"]=>
-  object(DateInterval)#11 (10) {
+  object(DateInterval)#%d (%d) {
     ["y"]=>
     int(0)
     ["m"]=>
@@ -136,12 +144,4 @@ object(I)#2 (11) {
   bool(true)
   ["include_end_date"]=>
   bool(false)
-  ["var1":"I":private]=>
-  int(1)
-  ["var2":"I":private]=>
-  int(2)
-  ["var3":protected]=>
-  int(3)
-  ["var4":protected]=>
-  int(4)
 }
diff --git a/ext/date/tests/gh16454.phpt b/ext/date/tests/gh16454.phpt
new file mode 100644
index 0000000000000..e3a35a1ba1998
--- /dev/null
+++ b/ext/date/tests/gh16454.phpt
@@ -0,0 +1,29 @@
+--TEST--
+GH-16454 (Unhandled INF in date_sunset() with tiny $utcOffset)
+--FILE--
+
+--EXPECTF--
+Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d
+
+Deprecated: Function date_sunrise() is deprecated since 8.1, use date_sun_info() instead in %s on line %d
+bool(false)
+
+Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d
+
+Deprecated: Function date_sunrise() is deprecated since 8.1, use date_sun_info() instead in %s on line %d
+bool(false)
+
+Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d
+
+Deprecated: Function date_sunset() is deprecated since 8.1, use date_sun_info() instead in %s on line %d
+bool(false)
+
+Deprecated: Constant SUNFUNCS_RET_STRING is deprecated in %s on line %d
+
+Deprecated: Function date_sunset() is deprecated since 8.1, use date_sun_info() instead in %s on line %d
+bool(false)
diff --git a/ext/dba/dba.c b/ext/dba/dba.c
index 503c41be8db7c..04cee6f385d48 100644
--- a/ext/dba/dba.c
+++ b/ext/dba/dba.c
@@ -478,8 +478,7 @@ static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode)
 	if (key_ht) {
 		key_str = php_dba_make_key(key_ht);
 		if (!key_str) {
-			// TODO ValueError?
-			RETURN_FALSE;
+			RETURN_THROWS();
 		}
 	}
 
@@ -569,8 +568,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 		RETURN_THROWS();
 	}
 
-	char *resource_key;
-	size_t resource_key_len = spprintf(&resource_key, 0,
+	zend_string *resource_key = zend_strpprintf(0,
 		"dba_%d_%s_%s_%s", persistent, ZSTR_VAL(path), ZSTR_VAL(mode), handler_str ? ZSTR_VAL(handler_str) : ""
 	);
 
@@ -578,27 +576,25 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 		zend_resource *le;
 
 		/* try to find if we already have this link in our persistent list */
-		if ((le = zend_hash_str_find_ptr(&EG(persistent_list), resource_key, resource_key_len)) != NULL) {
+		if ((le = zend_hash_find_ptr(&EG(persistent_list), resource_key)) != NULL) {
 			if (le->type != le_pdb) {
 				// TODO This should never happen
-				efree(resource_key);
+				zend_string_release_ex(resource_key, /* persistent */ false);
 				RETURN_FALSE;
 			}
 
 			object_init_ex(return_value, dba_connection_ce);
 			dba_connection *connection = Z_DBA_CONNECTION_P(return_value);
 			connection->info = (dba_info *)le->ptr;
-			connection->hash = zend_string_init(resource_key, resource_key_len, persistent);
-			if (persistent) {
-				GC_MAKE_PERSISTENT_LOCAL(connection->hash);
-			}
+			connection->hash = zend_string_dup(resource_key, /* persistent */ true);
+			GC_MAKE_PERSISTENT_LOCAL(connection->hash);
 
 			if (zend_hash_exists(&DBA_G(connections), connection->hash)) {
 				zend_hash_del(&DBA_G(connections), connection->hash);
 			}
 
 			zend_hash_add_new(&DBA_G(connections), connection->hash, return_value);
-			efree(resource_key);
+			zend_string_release_ex(resource_key, /* persistent */ false);
 			return;
 		}
 	}
@@ -607,7 +603,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 		hptr = DBA_G(default_hptr);
 		if (!hptr) {
 			php_error_docref(NULL, E_WARNING, "No default handler selected");
-			efree(resource_key);
+			zend_string_release_ex(resource_key, /* persistent */ false);
 			RETURN_FALSE;
 		}
 		ZEND_ASSERT(hptr->name);
@@ -617,7 +613,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 
 		if (!hptr->name) {
 			php_error_docref(NULL, E_WARNING, "Handler \"%s\" is not available", ZSTR_VAL(handler_str));
-			efree(resource_key);
+			zend_string_release_ex(resource_key, /* persistent */ false);
 			RETURN_FALSE;
 		}
 	}
@@ -641,13 +637,13 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 
 	if (ZSTR_LEN(mode) > 3) {
 		zend_argument_value_error(2, "must be at most 3 characters");
-		efree(resource_key);
+		zend_string_release_ex(resource_key, /* persistent */ false);
 		RETURN_THROWS();
 	}
 	if (ZSTR_LEN(mode) == 3) {
 		if (ZSTR_VAL(mode)[2] != 't') {
 			zend_argument_value_error(2, "third character must be \"t\"");
-			efree(resource_key);
+			zend_string_release_ex(resource_key, /* persistent */ false);
 			RETURN_THROWS();
 		}
 		is_test_lock = true;
@@ -660,7 +656,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 			case '-':
 				if ((hptr->flags & DBA_LOCK_ALL) == 0) {
 					php_error_docref(NULL, E_WARNING, "Locking cannot be disabled for handler %s", hptr->name);
-					efree(resource_key);
+					zend_string_release_ex(resource_key, /* persistent */ false);
 					RETURN_FALSE;
 				}
 				is_lock_ignored = true;
@@ -682,7 +678,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 				break;
 			default:
 				zend_argument_value_error(2, "second character must be one of \"d\", \"l\", \"-\", or \"t\"");
-				efree(resource_key);
+				zend_string_release_ex(resource_key, /* persistent */ false);
 				RETURN_THROWS();
 		}
 	} else {
@@ -751,7 +747,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 			break;
 		default:
 			zend_argument_value_error(2, "first character must be one of \"r\", \"w\", \"c\", or \"n\"");
-			efree(resource_key);
+			zend_string_release_ex(resource_key, /* persistent */ false);
 			RETURN_THROWS();
 	}
 	if (!lock_file_mode) {
@@ -760,17 +756,17 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 	if (is_test_lock) {
 		if (is_lock_ignored) {
 			zend_argument_value_error(2, "cannot combine mode \"-\" (no lock) and \"t\" (test lock)");
-			efree(resource_key);
+			zend_string_release_ex(resource_key, /* persistent */ false);
 			RETURN_THROWS();
 		}
 		if (!lock_mode) {
 			if ((hptr->flags & DBA_LOCK_ALL) == 0) {
 				php_error_docref(NULL, E_WARNING, "Handler %s uses its own locking which doesn't support mode modifier t (test lock)", hptr->name);
-				efree(resource_key);
+				zend_string_release_ex(resource_key, /* persistent */ false);
 				RETURN_FALSE;
 			} else {
 				php_error_docref(NULL, E_WARNING, "Handler %s doesn't uses locking for this mode which makes modifier t (test lock) obsolete", hptr->name);
-				efree(resource_key);
+				zend_string_release_ex(resource_key, /* persistent */ false);
 				RETURN_FALSE;
 			}
 		} else {
@@ -780,7 +776,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 
 	zval *connection_zval;
 	dba_connection *connection;
-	if ((connection_zval = zend_hash_str_find(&DBA_G(connections), resource_key, resource_key_len)) == NULL) {
+	if ((connection_zval = zend_hash_find(&DBA_G(connections), resource_key)) == NULL) {
 		object_init_ex(return_value, dba_connection_ce);
 		connection = Z_DBA_CONNECTION_P(return_value);
 
@@ -792,9 +788,11 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 		connection->info->driver_flags = driver_flags;
 		connection->info->flags = (hptr->flags & ~DBA_LOCK_ALL) | (lock_flag & DBA_LOCK_ALL) | (persistent ? DBA_PERSISTENT : 0);
 		connection->info->lock.mode = lock_mode;
-		connection->hash = zend_string_init(resource_key, resource_key_len, persistent);
 		if (persistent) {
+			connection->hash = zend_string_dup(resource_key, /* persistent */ true);
 			GC_MAKE_PERSISTENT_LOCAL(connection->hash);
+		} else {
+			connection->hash = zend_string_copy(resource_key);
 		}
 	} else {
 		ZVAL_COPY(return_value, connection_zval);
@@ -860,7 +858,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 		}
 		if (!connection->info->lock.fp) {
 			/* stream operation already wrote an error message */
-			efree(resource_key);
+			zend_string_release_ex(resource_key, /* persistent */ false);
 			zval_ptr_dtor(return_value);
 			RETURN_FALSE;
 		}
@@ -881,7 +879,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 		}
 		if (!connection->info->fp) {
 			/* stream operation already wrote an error message */
-			efree(resource_key);
+			zend_string_release_ex(resource_key, /* persistent */ false);
 			zval_ptr_dtor(return_value);
 			RETURN_FALSE;
 		}
@@ -891,7 +889,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 			 */
 			if (SUCCESS != php_stream_cast(connection->info->fp, PHP_STREAM_AS_FD, (void*)&connection->info->fd, 1)) {
 				php_error_docref(NULL, E_WARNING, "Could not cast stream");
-				efree(resource_key);
+				zend_string_release_ex(resource_key, /* persistent */ false);
 				zval_ptr_dtor(return_value);
 				RETURN_FALSE;
 #ifdef F_SETFL
@@ -927,7 +925,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 				php_error_docref(NULL, E_WARNING, "Driver initialization failed for handler: %s", hptr->name);
 			}
 		}
-		efree(resource_key);
+		zend_string_release_ex(resource_key, /* persistent */ false);
 		zval_ptr_dtor(return_value);
 		RETURN_FALSE;
 	}
@@ -935,16 +933,16 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, bool persistent)
 	connection->info->hnd = hptr;
 
 	if (persistent) {
-		if (zend_register_persistent_resource(resource_key, resource_key_len, connection->info, le_pdb) == NULL) {
+		if (zend_register_persistent_resource_ex(connection->hash, connection->info, le_pdb) == NULL) {
 			php_error_docref(NULL, E_WARNING, "Could not register persistent resource");
-			efree(resource_key);
+			zend_string_release_ex(resource_key, /* persistent */ false);
 			zval_ptr_dtor(return_value);
 			RETURN_FALSE;
 		}
 	}
 
 	zend_hash_add_new(&DBA_G(connections), connection->hash, return_value);
-	efree(resource_key);
+	zend_string_release_ex(resource_key, /* persistent */ false);
 }
 /* }}} */
 
@@ -1004,8 +1002,7 @@ PHP_FUNCTION(dba_exists)
 	if (key_ht) {
 		key_str = php_dba_make_key(key_ht);
 		if (!key_str) {
-			// TODO ValueError?
-			RETURN_FALSE;
+			RETURN_THROWS();
 		}
 	}
 
@@ -1051,8 +1048,7 @@ PHP_FUNCTION(dba_fetch)
 	if (key_ht) {
 		key_str = php_dba_make_key(key_ht);
 		if (!key_str) {
-			// TODO ValueError?
-			RETURN_FALSE;
+			RETURN_THROWS();
 		}
 	}
 
@@ -1185,8 +1181,7 @@ PHP_FUNCTION(dba_delete)
 	if (key_ht) {
 		key_str = php_dba_make_key(key_ht);
 		if (!key_str) {
-			// TODO ValueError?
-			RETURN_FALSE;
+			RETURN_THROWS();
 		}
 	}
 
@@ -1196,7 +1191,7 @@ PHP_FUNCTION(dba_delete)
 /* }}} */
 
 /* {{{ If not inifile: Insert value as key, return false, if key exists already
-   If inifile: Add vakue as key (next instance of key) */
+   If inifile: Add value as key (next instance of key) */
 PHP_FUNCTION(dba_insert)
 {
 	php_dba_update(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
diff --git a/ext/dom/attr.c b/ext/dom/attr.c
index 9ad28232f4ed3..dfe3abc1a885c 100644
--- a/ext/dom/attr.c
+++ b/ext/dom/attr.c
@@ -177,7 +177,8 @@ Since: DOM Level 3
 */
 zend_result dom_attr_schema_type_info_read(dom_object *obj, zval *retval)
 {
-	/* TODO */
+	/* This was never implemented, and is dropped from the modern-day DOM spec.
+	 * It only exists in old DOM to preserve BC. */
 	ZVAL_NULL(retval);
 	return SUCCESS;
 }
diff --git a/ext/dom/config.m4 b/ext/dom/config.m4
index b279bccd5bdac..c6c67ced36e51 100644
--- a/ext/dom/config.m4
+++ b/ext/dom/config.m4
@@ -206,7 +206,7 @@ if test "$PHP_DOM" != "no"; then
         html5_parser.c
         html5_serializer.c
         infra.c
-        inner_html_mixin.c
+        inner_outer_html_mixin.c
         namednodemap.c
         namespace_compat.c
         node.c
diff --git a/ext/dom/config.w32 b/ext/dom/config.w32
index 231f005895f56..1db4f6d11ba14 100644
--- a/ext/dom/config.w32
+++ b/ext/dom/config.w32
@@ -10,7 +10,7 @@ if (PHP_DOM == "yes") {
 		EXTENSION("dom", "php_dom.c attr.c document.c infra.c \
 			xml_document.c html_document.c xml_serializer.c html5_serializer.c html5_parser.c namespace_compat.c private_data.c \
 			domexception.c processinginstruction.c \
-			cdatasection.c documentfragment.c domimplementation.c element.c  inner_html_mixin.c \
+			cdatasection.c documentfragment.c domimplementation.c element.c inner_outer_html_mixin.c \
 			node.c characterdata.c documenttype.c \
 			entity.c nodelist.c html_collection.c text.c comment.c \
 			entityreference.c \
diff --git a/ext/dom/document.c b/ext/dom/document.c
index 9650d0902909a..ba5e7dab3d844 100644
--- a/ext/dom/document.c
+++ b/ext/dom/document.c
@@ -349,14 +349,14 @@ zend_result dom_document_recover_write(dom_object *obj, zval *newval)
 /* {{{ substituteEntities	boolean
 readonly=no
 */
-zend_result dom_document_substitue_entities_read(dom_object *obj, zval *retval)
+zend_result dom_document_substitute_entities_read(dom_object *obj, zval *retval)
 {
 	libxml_doc_props const* doc_prop = dom_get_doc_props_read_only(obj->document);
 	ZVAL_BOOL(retval, doc_prop->substituteentities);
 	return SUCCESS;
 }
 
-zend_result dom_document_substitue_entities_write(dom_object *obj, zval *newval)
+zend_result dom_document_substitute_entities_write(dom_object *obj, zval *newval)
 {
 	if (obj->document) {
 		dom_doc_propsptr doc_prop = dom_get_doc_props(obj->document);
@@ -1074,7 +1074,7 @@ PHP_METHOD(DOMDocument, getElementById)
 }
 /* }}} end dom_document_get_element_by_id */
 
-static zend_always_inline void php_dom_transfer_document_ref_single_node(xmlNodePtr node, php_libxml_ref_obj *new_document)
+static void php_dom_transfer_document_ref_single_node(xmlNodePtr node, php_libxml_ref_obj *new_document)
 {
 	php_libxml_node_ptr *iteration_object_ptr = node->_private;
 	if (iteration_object_ptr) {
@@ -1087,21 +1087,25 @@ static zend_always_inline void php_dom_transfer_document_ref_single_node(xmlNode
 	}
 }
 
-static void php_dom_transfer_document_ref(xmlNodePtr node, php_libxml_ref_obj *new_document)
+static void php_dom_transfer_document_ref_single_aux(xmlNodePtr node, php_libxml_ref_obj *new_document)
 {
-	if (node->children) {
-		php_dom_transfer_document_ref(node->children, new_document);
+	php_dom_transfer_document_ref_single_node(node, new_document);
+	if (node->type == XML_ELEMENT_NODE) {
+		for (xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next) {
+			php_dom_transfer_document_ref_single_node((xmlNodePtr) attr, new_document);
+		}
 	}
+}
 
-	while (node) {
-		if (node->type == XML_ELEMENT_NODE) {
-			for (xmlAttrPtr attr = node->properties; attr != NULL; attr = attr->next) {
-				php_dom_transfer_document_ref_single_node((xmlNodePtr) attr, new_document);
-			}
-		}
+static void php_dom_transfer_document_ref(xmlNodePtr node, php_libxml_ref_obj *new_document)
+{
+	xmlNodePtr base = node;
+	php_dom_transfer_document_ref_single_aux(base, new_document);
 
-		php_dom_transfer_document_ref_single_node(node, new_document);
-		node = node->next;
+	node = node->children;
+	while (node != NULL) {
+		php_dom_transfer_document_ref_single_aux(node, new_document);
+		node = php_dom_next_in_tree_order(node, base);
 	}
 }
 
diff --git a/ext/dom/dom_properties.h b/ext/dom/dom_properties.h
index 338b4acc449f0..f9402c929d937 100644
--- a/ext/dom/dom_properties.h
+++ b/ext/dom/dom_properties.h
@@ -58,8 +58,8 @@ zend_result dom_document_preserve_whitespace_read(dom_object *obj, zval *retval)
 zend_result dom_document_preserve_whitespace_write(dom_object *obj, zval *newval);
 zend_result dom_document_recover_read(dom_object *obj, zval *retval);
 zend_result dom_document_recover_write(dom_object *obj, zval *newval);
-zend_result dom_document_substitue_entities_read(dom_object *obj, zval *retval);
-zend_result dom_document_substitue_entities_write(dom_object *obj, zval *newval);
+zend_result dom_document_substitute_entities_read(dom_object *obj, zval *retval);
+zend_result dom_document_substitute_entities_write(dom_object *obj, zval *newval);
 
 /* html5 document properties */
 zend_result dom_html_document_encoding_write(dom_object *obj, zval *retval);
@@ -86,6 +86,8 @@ zend_result dom_element_id_write(dom_object *obj, zval *newval);
 zend_result dom_element_schema_type_info_read(dom_object *obj, zval *retval);
 zend_result dom_element_inner_html_read(dom_object *obj, zval *retval);
 zend_result dom_element_inner_html_write(dom_object *obj, zval *newval);
+zend_result dom_element_outer_html_read(dom_object *obj, zval *retval);
+zend_result dom_element_outer_html_write(dom_object *obj, zval *newval);
 zend_result dom_element_class_list_read(dom_object *obj, zval *retval);
 zend_result dom_modern_element_substituted_node_value_read(dom_object *obj, zval *retval);
 zend_result dom_modern_element_substituted_node_value_write(dom_object *obj, zval *newval);
diff --git a/ext/dom/element.c b/ext/dom/element.c
index b449555983021..418096312c456 100644
--- a/ext/dom/element.c
+++ b/ext/dom/element.c
@@ -361,7 +361,11 @@ PHP_METHOD(DOMElement, getAttributeNames)
 	if (!php_dom_follow_spec_intern(intern)) {
 		for (xmlNsPtr nsptr = nodep->nsDef; nsptr; nsptr = nsptr->next) {
 			const char *prefix = (const char *) nsptr->prefix;
-			ZVAL_NEW_STR(&tmp, dom_node_concatenated_name_helper(strlen(prefix), prefix, strlen("xmlns"), (const char *) "xmlns"));
+			if (prefix == NULL) {
+				ZVAL_STRING(&tmp, "xmlns");
+			} else {
+				ZVAL_NEW_STR(&tmp, dom_node_concatenated_name_helper(strlen(prefix), prefix, strlen("xmlns"), (const char *) "xmlns"));
+			}
 			zend_hash_next_index_insert(ht, &tmp);
 		}
 	}
@@ -683,7 +687,7 @@ static void dom_element_set_attribute_node_common(INTERNAL_FUNCTION_PARAMETERS,
 	dom_object *intern, *attrobj, *oldobj;
 
 	id = ZEND_THIS;
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &node, dom_get_node_ce(modern)) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &node, dom_get_attr_ce(modern)) == FAILURE) {
 		RETURN_THROWS();
 	}
 
@@ -730,9 +734,8 @@ static void dom_element_set_attribute_node_common(INTERNAL_FUNCTION_PARAMETERS,
 		xmlUnlinkNode((xmlNodePtr) attrp);
 	}
 
-	if (attrp->doc == NULL && nodep->doc != NULL) {
-		attrobj->document = intern->document;
-		php_libxml_increment_doc_ref((php_libxml_node_object *)attrobj, NULL);
+	if (attrp->doc == NULL && nodep->doc != NULL && intern->document != NULL) {
+		dom_set_document_ref_pointers_attr(attrp, intern->document);
 	}
 
 	xmlAddChild(nodep, (xmlNodePtr) attrp);
@@ -812,7 +815,12 @@ static void dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAMETERS, b
 	dom_object *intern, *namednode;
 	char *name;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name, &name_len) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "p", &name, &name_len) == FAILURE) {
+		RETURN_THROWS();
+	}
+
+	if (name_len > INT_MAX) {
+		zend_argument_value_error(1, "is too long");
 		RETURN_THROWS();
 	}
 
@@ -1235,7 +1243,17 @@ static void dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAMETERS
 	dom_object *intern, *namednode;
 	char *uri, *name;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "s!s", &uri, &uri_len, &name, &name_len) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "p!p", &uri, &uri_len, &name, &name_len) == FAILURE) {
+		RETURN_THROWS();
+	}
+
+	if (uri_len > INT_MAX) {
+		zend_argument_value_error(1, "is too long");
+		RETURN_THROWS();
+	}
+
+	if (name_len > INT_MAX) {
+		zend_argument_value_error(2, "is too long");
 		RETURN_THROWS();
 	}
 
@@ -1743,7 +1761,7 @@ PHP_METHOD(DOMElement, toggleAttribute)
 			if (follow_spec) {
 				xmlSetNsProp(thisp, NULL, BAD_CAST qname, NULL);
 			} else {
-				/* The behaviour for namespaces isn't defined by spec, but this is based on observing browers behaviour.
+				/* The behaviour for namespaces isn't defined by spec, but this is based on observing browsers' behaviour.
 				* It follows the same rules when you'd manually add an attribute using the other APIs. */
 				int len;
 				const xmlChar *split = xmlSplitQName3((const xmlChar *) qname, &len);
diff --git a/ext/dom/html_document.c b/ext/dom/html_document.c
index 1d606e814554f..3ca812bde50b6 100644
--- a/ext/dom/html_document.c
+++ b/ext/dom/html_document.c
@@ -30,6 +30,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /* Implementation defined, but as HTML5 defaults in all other cases to UTF-8, we'll do the same. */
 #define DOM_FALLBACK_ENCODING_ID LXB_ENCODING_UTF_8
@@ -104,9 +105,7 @@ zend_result dom_modern_document_implementation_read(dom_object *obj, zval *retva
 
 static void dom_decoding_encoding_ctx_init(dom_decoding_encoding_ctx *ctx)
 {
-	ctx->encode_data = lxb_encoding_data(LXB_ENCODING_UTF_8);
-	ctx->decode_data = NULL;
-	/* Set fast path on by default so that the decoder finishing is skipped if this was never initialised properly. */
+	ctx->decode_data = ctx->encode_data = lxb_encoding_data(LXB_ENCODING_UTF_8);
 	ctx->fast_path = true;
 	(void) lxb_encoding_encode_init(
 		&ctx->encode,
@@ -115,6 +114,13 @@ static void dom_decoding_encoding_ctx_init(dom_decoding_encoding_ctx *ctx)
 		sizeof(ctx->encoding_output) / sizeof(*ctx->encoding_output)
 	);
 	(void) lxb_encoding_encode_replace_set(&ctx->encode, LXB_ENCODING_REPLACEMENT_BYTES, LXB_ENCODING_REPLACEMENT_SIZE);
+	(void) lxb_encoding_decode_init(
+		&ctx->decode,
+		ctx->decode_data,
+		ctx->codepoints,
+		sizeof(ctx->codepoints) / sizeof(*ctx->codepoints)
+	);
+	(void) lxb_encoding_decode_replace_set(&ctx->decode, LXB_ENCODING_REPLACEMENT_BUFFER, LXB_ENCODING_REPLACEMENT_BUFFER_LEN);
 }
 
 static const char *dom_lexbor_tokenizer_error_code_to_string(lxb_html_tokenizer_error_id_t id)
@@ -512,6 +518,30 @@ static bool dom_process_parse_chunk(
 	return true;
 }
 
+/* This seeks, using SWAR techniques, to the first non-ASCII byte in a UTF-8 input.
+ * Returns true if the entire input was consumed without encountering non-ASCII, false otherwise. */
+static zend_always_inline bool dom_seek_utf8_non_ascii(const lxb_char_t **data, const lxb_char_t *end)
+{
+	while (*data + sizeof(size_t) <= end) {
+		size_t bytes;
+		memcpy(&bytes, *data, sizeof(bytes));
+		/* If the top bit is set, it's not ASCII. */
+		if ((bytes & LEXBOR_SWAR_REPEAT(0x80)) != 0) {
+			return false;
+		}
+		*data += sizeof(size_t);
+	}
+
+	while (*data < end) {
+		if (**data & 0x80) {
+			return false;
+		}
+		(*data)++;
+	}
+
+	return true;
+}
+
 static bool dom_decode_encode_fast_path(
 	lexbor_libxml2_bridge_parse_context *ctx,
 	lxb_html_document_t *document,
@@ -523,17 +553,19 @@ static bool dom_decode_encode_fast_path(
 	size_t *tree_error_offset
 )
 {
+	decoding_encoding_ctx->decode.status = LXB_STATUS_OK;
+
 	const lxb_char_t *buf_ref = *buf_ref_ref;
 	const lxb_char_t *last_output = buf_ref;
 	while (buf_ref != buf_end) {
 		/* Fast path converts non-validated UTF-8 -> validated UTF-8 */
-		if (decoding_encoding_ctx->decode.u.utf_8.need == 0 && *buf_ref < 0x80) {
+		if (decoding_encoding_ctx->decode.u.utf_8.need == 0) {
 			/* Fast path within the fast path: try to skip non-mb bytes in bulk if we are not in a state where we
-			 * need more UTF-8 bytes to complete a sequence.
-			 * It might be tempting to use SIMD here, but it turns out that this is less efficient because
-			 * we need to process the same byte multiple times sometimes when mixing ASCII with multibyte. */
-			buf_ref++;
-			continue;
+			 * need more UTF-8 bytes to complete a sequence. */
+			if (dom_seek_utf8_non_ascii(&buf_ref, buf_end)) {
+				ZEND_ASSERT(buf_ref == buf_end);
+				break;
+			}
 		}
 		const lxb_char_t *buf_ref_backup = buf_ref;
 		lxb_codepoint_t codepoint = lxb_encoding_decode_utf_8_single(&decoding_encoding_ctx->decode, &buf_ref, buf_end);
@@ -551,6 +583,17 @@ static bool dom_decode_encode_fast_path(
 			)) {
 				goto fail_oom;
 			}
+
+			if (codepoint == LXB_ENCODING_DECODE_CONTINUE) {
+				ZEND_ASSERT(buf_ref == buf_end);
+				/* The decoder needs more data but the entire buffer is consumed.
+				 * All valid data is outputted, and if the remaining data for the code point
+				 * is invalid, the next call will output the replacement bytes. */
+				*buf_ref_ref = buf_ref;
+				decoding_encoding_ctx->decode.status = LXB_STATUS_CONTINUE;
+				return true;
+			}
+
 			if (!dom_process_parse_chunk(
 				ctx,
 				document,
@@ -563,6 +606,7 @@ static bool dom_decode_encode_fast_path(
 			)) {
 				goto fail_oom;
 			}
+
 			last_output = buf_ref;
 		}
 	}
@@ -676,29 +720,22 @@ static bool dom_parse_decode_encode_finish(
 	size_t *tree_error_offset
 )
 {
-	if (!decoding_encoding_ctx->fast_path) {
-		/* Fast path handles codepoints one by one, so this part is not applicable in that case */
-		(void) lxb_encoding_decode_finish(&decoding_encoding_ctx->decode);
-		size_t decoding_buffer_size = lxb_encoding_decode_buf_used(&decoding_encoding_ctx->decode);
-		if (decoding_buffer_size > 0) {
-			const lxb_codepoint_t *codepoints_ref = (const lxb_codepoint_t *) decoding_encoding_ctx->codepoints;
-			const lxb_codepoint_t *codepoints_end = codepoints_ref + decoding_buffer_size;
-			(void) decoding_encoding_ctx->encode_data->encode(&decoding_encoding_ctx->encode, &codepoints_ref, codepoints_end);
-			if (!dom_process_parse_chunk(
-				ctx,
-				document,
-				parser,
-				lxb_encoding_encode_buf_used(&decoding_encoding_ctx->encode),
-				decoding_encoding_ctx->encoding_output,
-				decoding_buffer_size,
-				tokenizer_error_offset,
-				tree_error_offset
-			)) {
-				return false;
-			}
-		}
+	lxb_status_t status;
+
+	status = lxb_encoding_decode_finish(&decoding_encoding_ctx->decode);
+	ZEND_ASSERT(status == LXB_STATUS_OK);
+
+	size_t decoding_buffer_size = lxb_encoding_decode_buf_used(&decoding_encoding_ctx->decode);
+	if (decoding_buffer_size > 0) {
+		const lxb_codepoint_t *codepoints_ref = (const lxb_codepoint_t *) decoding_encoding_ctx->codepoints;
+		const lxb_codepoint_t *codepoints_end = codepoints_ref + decoding_buffer_size;
+		status = decoding_encoding_ctx->encode_data->encode(&decoding_encoding_ctx->encode, &codepoints_ref, codepoints_end);
+		ZEND_ASSERT(status == LXB_STATUS_OK);
+		/* No need to produce output here, as we finish the encoder below and pass the chunk. */
 	}
-	(void) lxb_encoding_encode_finish(&decoding_encoding_ctx->encode);
+
+	status = lxb_encoding_encode_finish(&decoding_encoding_ctx->encode);
+	ZEND_ASSERT(status == LXB_STATUS_OK);
 	if (lxb_encoding_encode_buf_used(&decoding_encoding_ctx->encode)
 		&& !dom_process_parse_chunk(
 			ctx,
diff --git a/ext/dom/infra.c b/ext/dom/infra.c
index eb276d179464b..9bb1942fe01d8 100644
--- a/ext/dom/infra.c
+++ b/ext/dom/infra.c
@@ -46,7 +46,7 @@ zend_string *dom_strip_and_collapse_ascii_whitespace(zend_string *input)
 	while (current < end) {
 		/* Copy non-whitespace */
 		size_t non_whitespace_len = strcspn(current, ascii_whitespace);
-		/* If the pointers are equal, we still haven't encountered collapsable or strippable whitespace. */
+		/* If the pointers are equal, we still haven't encountered collapsible or strippable whitespace. */
 		if (write_ptr != current) {
 			memmove(write_ptr, current, non_whitespace_len);
 		}
diff --git a/ext/dom/inner_html_mixin.c b/ext/dom/inner_outer_html_mixin.c
similarity index 76%
rename from ext/dom/inner_html_mixin.c
rename to ext/dom/inner_outer_html_mixin.c
index 262c85411aaf2..7dc1199fdebb9 100644
--- a/ext/dom/inner_html_mixin.c
+++ b/ext/dom/inner_outer_html_mixin.c
@@ -55,12 +55,9 @@ static int dom_write_smart_str(void *context, const char *buffer, int len)
 	return len;
 }
 
-/* https://w3c.github.io/DOM-Parsing/#the-innerhtml-mixin
- * and https://w3c.github.io/DOM-Parsing/#dfn-fragment-serializing-algorithm */
-zend_result dom_element_inner_html_read(dom_object *obj, zval *retval)
+/* https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#fragment-serializing-algorithm-steps */
+static zend_string *dom_element_html_fragment_serialize(dom_object *obj, xmlNodePtr node)
 {
-	DOM_PROP_NODE(xmlNodePtr, node, obj);
-
 	/* 1. Let context document be the value of node's node document. */
 	const xmlDoc *context_document = node->doc;
 
@@ -73,7 +70,7 @@ zend_result dom_element_inner_html_read(dom_object *obj, zval *retval)
 		ctx.write_string = dom_inner_html_write_string;
 		ctx.write_string_len = dom_inner_html_write_string_len;
 		dom_html5_serialize(&ctx, node);
-		ZVAL_STR(retval, smart_str_extract(&output));
+		return smart_str_extract(&output);
 	}
 	/* 3. Otherwise, context document is an XML document; return an XML serialization of node passing the flag require well-formed. */
 	else {
@@ -104,11 +101,21 @@ zend_result dom_element_inner_html_read(dom_object *obj, zval *retval)
 		if (UNEXPECTED(status < 0)) {
 			smart_str_free_ex(&str, false);
 			php_dom_throw_error_with_message(SYNTAX_ERR, "The resulting XML serialization is not well-formed", true);
-			return FAILURE;
+			return NULL;
 		}
-		ZVAL_STR(retval, smart_str_extract(&str));
+		return smart_str_extract(&str);
 	}
+}
 
+/* https://w3c.github.io/DOM-Parsing/#the-innerhtml-mixin */
+zend_result dom_element_inner_html_read(dom_object *obj, zval *retval)
+{
+	DOM_PROP_NODE(xmlNodePtr, node, obj);
+	zend_string *serialization = dom_element_html_fragment_serialize(obj, node);
+	if (serialization == NULL) {
+		return FAILURE;
+	}
+	ZVAL_STR(retval, serialization);
 	return SUCCESS;
 }
 
@@ -334,23 +341,31 @@ static xmlNodePtr dom_xml_fragment_parsing_algorithm(dom_object *obj, const xmlN
 	return NULL;
 }
 
-/* https://w3c.github.io/DOM-Parsing/#the-innerhtml-mixin
- * and https://w3c.github.io/DOM-Parsing/#dfn-fragment-parsing-algorithm */
-zend_result dom_element_inner_html_write(dom_object *obj, zval *newval)
+/* https://w3c.github.io/DOM-Parsing/#dfn-fragment-parsing-algorithm */
+static xmlNodePtr dom_parse_fragment(dom_object *obj, xmlNodePtr context_node, const zend_string *input)
 {
-	DOM_PROP_NODE(xmlNodePtr, context_node, obj);
-
-	xmlNodePtr fragment;
 	if (context_node->doc->type == XML_DOCUMENT_NODE) {
-		fragment = dom_xml_fragment_parsing_algorithm(obj, context_node, Z_STR_P(newval));
+		return dom_xml_fragment_parsing_algorithm(obj, context_node, input);
 	} else {
-		fragment = dom_html_fragment_parsing_algorithm(obj, context_node, Z_STR_P(newval), obj->document->quirks_mode);
+		return dom_html_fragment_parsing_algorithm(obj, context_node, input, obj->document->quirks_mode);
 	}
+}
 
+/* https://w3c.github.io/DOM-Parsing/#the-innerhtml-mixin */
+zend_result dom_element_inner_html_write(dom_object *obj, zval *newval)
+{
+	/* 1. We don't do injection sinks, skip. */
+
+	/* 2. Let context be this. */
+	DOM_PROP_NODE(xmlNodePtr, context_node, obj);
+
+	/* 3. Let fragment be the result of invoking the fragment parsing algorithm steps with context and compliantString. */
+	xmlNodePtr fragment = dom_parse_fragment(obj, context_node, Z_STR_P(newval));
 	if (fragment == NULL) {
 		return FAILURE;
 	}
 
+	/* 4. If context is a template element, then set context to the template element's template contents (a DocumentFragment). */
 	if (php_dom_ns_is_fast(context_node, php_dom_ns_is_html_magic_token) && xmlStrEqual(context_node->name, BAD_CAST "template")) {
 		context_node = php_dom_ensure_templated_content(php_dom_get_private_data(obj), context_node);
 		if (context_node == NULL) {
@@ -359,8 +374,97 @@ zend_result dom_element_inner_html_write(dom_object *obj, zval *newval)
 		}
 	}
 
+	/* 5. Replace all with fragment within context. */
 	dom_remove_all_children(context_node);
 	return php_dom_pre_insert(obj->document, fragment, context_node, NULL) ? SUCCESS : FAILURE;
 }
 
+/* https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#the-outerhtml-property */
+zend_result dom_element_outer_html_read(dom_object *obj, zval *retval)
+{
+	DOM_PROP_NODE(xmlNodePtr, this, obj);
+
+	/* 1. Let element be a fictional node whose only child is this. */
+	xmlNode element;
+	memset(&element, 0, sizeof(element));
+	element.type = XML_DOCUMENT_FRAG_NODE;
+	element.children = element.last = this;
+	element.doc = this->doc;
+
+	xmlNodePtr old_parent = this->parent;
+	xmlNodePtr old_next = this->next;
+	this->parent = &element;
+	this->next = NULL;
+
+	/* 2. Return the result of running fragment serializing algorithm steps with element and true. */
+	zend_string *serialization = dom_element_html_fragment_serialize(obj, &element);
+
+	this->parent = old_parent;
+	this->next = old_next;
+
+	if (serialization == NULL) {
+		return FAILURE;
+	}
+	ZVAL_STR(retval, serialization);
+	return SUCCESS;
+}
+
+/* https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#the-outerhtml-property */
+zend_result dom_element_outer_html_write(dom_object *obj, zval *newval)
+{
+	/* 1. We don't do injection sinks, skip. */
+
+	/* 2. Let parent be this's parent. */
+	DOM_PROP_NODE(xmlNodePtr, this, obj);
+	xmlNodePtr parent = this->parent;
+	bool created_parent = false;
+
+	/* 3. If parent is null, return. */
+	if (parent == NULL) {
+		return SUCCESS;
+	}
+
+	/* 4. If parent is a Document, throw. */
+	if (parent->type == XML_DOCUMENT_NODE || parent->type == XML_HTML_DOCUMENT_NODE) {
+		php_dom_throw_error(INVALID_MODIFICATION_ERR, true);
+		return FAILURE;
+	}
+
+	/* 5. If parent is a DocumentFragment, set parent to the result of creating an element given this's node document, body, and the HTML namespace. */
+	if (parent->type == XML_DOCUMENT_FRAG_NODE) {
+		xmlNsPtr html_ns = php_dom_libxml_ns_mapper_ensure_html_ns(php_dom_get_ns_mapper(obj));
+
+		parent = xmlNewDocNode(parent->doc, html_ns, BAD_CAST "body", NULL);
+		created_parent = true;
+		if (UNEXPECTED(parent == NULL)) {
+			php_dom_throw_error(INVALID_STATE_ERR, true);
+			return FAILURE;
+		}
+	}
+
+	/* 6. Let fragment be the result of invoking the fragment parsing algorithm steps given parent and compliantString. */
+	xmlNodePtr fragment = dom_parse_fragment(obj, parent, Z_STR_P(newval));
+	if (fragment == NULL) {
+		if (created_parent) {
+			xmlFreeNode(parent);
+		}
+		return FAILURE;
+	}
+
+	/* 7. Replace this with fragment within this's parent. */
+	if (!php_dom_pre_insert(obj->document, fragment, this->parent, this)) {
+		xmlFreeNode(fragment);
+		if (created_parent) {
+			xmlFreeNode(parent);
+		}
+		return FAILURE;
+	}
+	xmlUnlinkNode(this);
+	if (created_parent) {
+		ZEND_ASSERT(parent->children == NULL);
+		xmlFreeNode(parent);
+	}
+	return SUCCESS;
+}
+
 #endif
diff --git a/ext/dom/lexbor/lexbor/core/swar.h b/ext/dom/lexbor/lexbor/core/swar.h
index a93d30ad5dff8..ec0a13b8e23fe 100644
--- a/ext/dom/lexbor/lexbor/core/swar.h
+++ b/ext/dom/lexbor/lexbor/core/swar.h
@@ -59,6 +59,35 @@ lexbor_swar_seek4(const lxb_char_t *data, const lxb_char_t *end,
     return data;
 }
 
+lxb_inline const lxb_char_t *
+lexbor_swar_seek3(const lxb_char_t *data, const lxb_char_t *end,
+                  lxb_char_t c1, lxb_char_t c2, lxb_char_t c3)
+{
+    size_t bytes, matches, t1, t2, t3;
+
+    if (LEXBOR_SWAR_IS_LITTLE_ENDIAN) {
+        while (data + sizeof(size_t) <= end) {
+            memcpy(&bytes, data, sizeof(size_t));
+
+            t1 = bytes ^ LEXBOR_SWAR_REPEAT(c1);
+            t2 = bytes ^ LEXBOR_SWAR_REPEAT(c2);
+            t3 = bytes ^ LEXBOR_SWAR_REPEAT(c3);
+            matches =   LEXBOR_SWAR_HAS_ZERO(t1) | LEXBOR_SWAR_HAS_ZERO(t2)
+                       | LEXBOR_SWAR_HAS_ZERO(t3);
+
+            if (matches) {
+                data += ((((matches - 1) & LEXBOR_SWAR_ONES) * LEXBOR_SWAR_ONES)
+                         >> (sizeof(size_t) * 8 - 8)) - 1;
+                break;
+            } else {
+                data += sizeof(size_t);
+            }
+        }
+    }
+
+    return data;
+}
+
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/ext/dom/lexbor/lexbor/encoding/big5.c b/ext/dom/lexbor/lexbor/encoding/big5.c
index 60caabbf2c19d..9e530f69cc442 100644
--- a/ext/dom/lexbor/lexbor/encoding/big5.c
+++ b/ext/dom/lexbor/lexbor/encoding/big5.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2024 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/dom/lexbor/lexbor/encoding/decode.c b/ext/dom/lexbor/lexbor/encoding/decode.c
index e4624474aca34..a8d5b70f75790 100644
--- a/ext/dom/lexbor/lexbor/encoding/decode.c
+++ b/ext/dom/lexbor/lexbor/encoding/decode.c
@@ -2955,6 +2955,77 @@ lxb_encoding_decode_valid_utf_8_single(const lxb_char_t **data,
     return cp;
 }
 
+lxb_codepoint_t
+lxb_encoding_decode_valid_utf_8_single_reverse(const lxb_char_t **end,
+                                               const lxb_char_t *begin)
+{
+    lxb_codepoint_t cp;
+    const lxb_char_t *p = *end;
+
+    while (p > begin) {
+        p -= 1;
+
+        if (*p < 0x80){
+            cp = (lxb_codepoint_t) *p;
+
+            (*end) = p;
+            return cp;
+        }
+        else if ((*p & 0xe0) == 0xc0) {
+            /* 110xxxxx 10xxxxxx */
+
+            if (*end - p < 2) {
+                *end = p;
+                return LXB_ENCODING_DECODE_ERROR;
+            }
+
+            cp  = (p[0] ^ (0xC0 & p[0])) << 6;
+            cp |= (p[1] ^ (0x80 & p[1]));
+
+            (*end) = p;
+            return cp;
+        }
+        else if ((*p & 0xf0) == 0xe0) {
+            /* 1110xxxx 10xxxxxx 10xxxxxx */
+
+            if (*end - p < 3) {
+                *end = p;
+                return LXB_ENCODING_DECODE_ERROR;
+            }
+
+            cp  = (p[0] ^ (0xE0 & p[0])) << 12;
+            cp |= (p[1] ^ (0x80 & p[1])) << 6;
+            cp |= (p[2] ^ (0x80 & p[2]));
+
+            (*end) = p;
+            return cp;
+        }
+        else if ((*p & 0xf8) == 0xf0) {
+            /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */
+
+            if (*end - p < 4) {
+                *end = p;
+                return LXB_ENCODING_DECODE_ERROR;
+            }
+
+            cp  = (p[0] ^ (0xF0 & p[0])) << 18;
+            cp |= (p[1] ^ (0x80 & p[1])) << 12;
+            cp |= (p[2] ^ (0x80 & p[2])) << 6;
+            cp |= (p[3] ^ (0x80 & p[3]));
+
+            (*end) = p;
+            return cp;
+        }
+        else if (*end - p >= 4) {
+            break;
+        }
+    }
+
+    *end = p;
+
+    return LXB_ENCODING_DECODE_ERROR;
+}
+
 uint8_t
 lxb_encoding_decode_utf_8_length(lxb_char_t data)
 {
diff --git a/ext/dom/lexbor/lexbor/encoding/decode.h b/ext/dom/lexbor/lexbor/encoding/decode.h
index 3d673804ee1c6..a16f8ee7f3a2b 100644
--- a/ext/dom/lexbor/lexbor/encoding/decode.h
+++ b/ext/dom/lexbor/lexbor/encoding/decode.h
@@ -306,6 +306,10 @@ LXB_API lxb_codepoint_t
 lxb_encoding_decode_valid_utf_8_single(const lxb_char_t **data,
                                        const lxb_char_t *end);
 
+LXB_API lxb_codepoint_t
+lxb_encoding_decode_valid_utf_8_single_reverse(const lxb_char_t **end,
+                                               const lxb_char_t *begin);
+
 LXB_API uint8_t
 lxb_encoding_decode_utf_8_length(lxb_char_t data);
 
diff --git a/ext/dom/lexbor/lexbor/encoding/euc_kr.c b/ext/dom/lexbor/lexbor/encoding/euc_kr.c
index 3eac4e241d646..0a15cd5cbd9d2 100644
--- a/ext/dom/lexbor/lexbor/encoding/euc_kr.c
+++ b/ext/dom/lexbor/lexbor/encoding/euc_kr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2024 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/dom/lexbor/lexbor/encoding/gb18030.c b/ext/dom/lexbor/lexbor/encoding/gb18030.c
index b86ee7b76b350..56dc51334065c 100644
--- a/ext/dom/lexbor/lexbor/encoding/gb18030.c
+++ b/ext/dom/lexbor/lexbor/encoding/gb18030.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2024 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
@@ -7199,13 +7199,13 @@ LXB_API const lxb_encoding_multi_index_t lxb_encoding_multi_index_gb18030[23940]
     {{'\xcf', '\x87'}, 2, 0x03C7}, /* (GREEK SMALL LETTER CHI) */
     {{'\xcf', '\x88'}, 2, 0x03C8}, /* (GREEK SMALL LETTER PSI) */
     {{'\xcf', '\x89'}, 2, 0x03C9}, /* (GREEK SMALL LETTER OMEGA) */
-    {{'\xee', '\x9e', '\x8d'}, 3, 0xE78D}, /* () */
-    {{'\xee', '\x9e', '\x8e'}, 3, 0xE78E}, /* () */
-    {{'\xee', '\x9e', '\x8f'}, 3, 0xE78F}, /* () */
-    {{'\xee', '\x9e', '\x90'}, 3, 0xE790}, /* () */
-    {{'\xee', '\x9e', '\x91'}, 3, 0xE791}, /* () */
-    {{'\xee', '\x9e', '\x92'}, 3, 0xE792}, /* () */
-    {{'\xee', '\x9e', '\x93'}, 3, 0xE793}, /* () */
+    {{'\xef', '\xb8', '\x90'}, 3, 0xFE10}, /* (PRESENTATION FORM FOR VERTICAL COMMA) */
+    {{'\xef', '\xb8', '\x92'}, 3, 0xFE12}, /* (PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP) */
+    {{'\xef', '\xb8', '\x91'}, 3, 0xFE11}, /* (PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA) */
+    {{'\xef', '\xb8', '\x93'}, 3, 0xFE13}, /* (PRESENTATION FORM FOR VERTICAL COLON) */
+    {{'\xef', '\xb8', '\x94'}, 3, 0xFE14}, /* (PRESENTATION FORM FOR VERTICAL SEMICOLON) */
+    {{'\xef', '\xb8', '\x95'}, 3, 0xFE15}, /* (PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK) */
+    {{'\xef', '\xb8', '\x96'}, 3, 0xFE16}, /* (PRESENTATION FORM FOR VERTICAL QUESTION MARK) */
     {{'\xef', '\xb8', '\xb5'}, 3, 0xFE35}, /* (PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS) */
     {{'\xef', '\xb8', '\xb6'}, 3, 0xFE36}, /* (PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS) */
     {{'\xef', '\xb8', '\xb9'}, 3, 0xFE39}, /* (PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET) */
@@ -7218,14 +7218,14 @@ LXB_API const lxb_encoding_multi_index_t lxb_encoding_multi_index_gb18030[23940]
     {{'\xef', '\xb9', '\x82'}, 3, 0xFE42}, /* (PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET) */
     {{'\xef', '\xb9', '\x83'}, 3, 0xFE43}, /* (PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET) */
     {{'\xef', '\xb9', '\x84'}, 3, 0xFE44}, /* (PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET) */
-    {{'\xee', '\x9e', '\x94'}, 3, 0xE794}, /* () */
-    {{'\xee', '\x9e', '\x95'}, 3, 0xE795}, /* () */
+    {{'\xef', '\xb8', '\x97'}, 3, 0xFE17}, /* (PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET) */
+    {{'\xef', '\xb8', '\x98'}, 3, 0xFE18}, /* (PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET) */
     {{'\xef', '\xb8', '\xbb'}, 3, 0xFE3B}, /* (PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET) */
     {{'\xef', '\xb8', '\xbc'}, 3, 0xFE3C}, /* (PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET) */
     {{'\xef', '\xb8', '\xb7'}, 3, 0xFE37}, /* (PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET) */
     {{'\xef', '\xb8', '\xb8'}, 3, 0xFE38}, /* (PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET) */
     {{'\xef', '\xb8', '\xb1'}, 3, 0xFE31}, /* (PRESENTATION FORM FOR VERTICAL EM DASH) */
-    {{'\xee', '\x9e', '\x96'}, 3, 0xE796}, /* () */
+    {{'\xef', '\xb8', '\x99'}, 3, 0xFE19}, /* (PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS) */
     {{'\xef', '\xb8', '\xb3'}, 3, 0xFE33}, /* (PRESENTATION FORM FOR VERTICAL LOW LINE) */
     {{'\xef', '\xb8', '\xb4'}, 3, 0xFE34}, /* (PRESENTATION FORM FOR VERTICAL WAVY LOW LINE) */
     {{'\xee', '\x9e', '\x97'}, 3, 0xE797}, /* () */
@@ -23792,7 +23792,7 @@ LXB_API const lxb_encoding_multi_index_t lxb_encoding_multi_index_gb18030[23940]
     {{'\xe3', '\x91', '\x87'}, 3, 0x3447}, /* () */
     {{'\xe2', '\xba', '\x88'}, 3, 0x2E88}, /* (CJK RADICAL KNIFE ONE) */
     {{'\xe2', '\xba', '\x8b'}, 3, 0x2E8B}, /* (CJK RADICAL SEAL) */
-    {{'\xee', '\xa0', '\x9e'}, 3, 0xE81E}, /* () */
+    {{'\xe9', '\xbe', '\xb4'}, 3, 0x9FB4}, /* () */
     {{'\xe3', '\x96', '\x9e'}, 3, 0x359E}, /* () */
     {{'\xe3', '\x98', '\x9a'}, 3, 0x361A}, /* () */
     {{'\xe3', '\x98', '\x8e'}, 3, 0x360E}, /* () */
@@ -23800,19 +23800,19 @@ LXB_API const lxb_encoding_multi_index_t lxb_encoding_multi_index_gb18030[23940]
     {{'\xe2', '\xba', '\x97'}, 3, 0x2E97}, /* (CJK RADICAL HEART TWO) */
     {{'\xe3', '\xa5', '\xae'}, 3, 0x396E}, /* () */
     {{'\xe3', '\xa4', '\x98'}, 3, 0x3918}, /* () */
-    {{'\xee', '\xa0', '\xa6'}, 3, 0xE826}, /* () */
+    {{'\xe9', '\xbe', '\xb5'}, 3, 0x9FB5}, /* () */
     {{'\xe3', '\xa7', '\x8f'}, 3, 0x39CF}, /* () */
     {{'\xe3', '\xa7', '\x9f'}, 3, 0x39DF}, /* () */
     {{'\xe3', '\xa9', '\xb3'}, 3, 0x3A73}, /* () */
     {{'\xe3', '\xa7', '\x90'}, 3, 0x39D0}, /* () */
-    {{'\xee', '\xa0', '\xab'}, 3, 0xE82B}, /* () */
-    {{'\xee', '\xa0', '\xac'}, 3, 0xE82C}, /* () */
+    {{'\xe9', '\xbe', '\xb6'}, 3, 0x9FB6}, /* () */
+    {{'\xe9', '\xbe', '\xb7'}, 3, 0x9FB7}, /* () */
     {{'\xe3', '\xad', '\x8e'}, 3, 0x3B4E}, /* () */
     {{'\xe3', '\xb1', '\xae'}, 3, 0x3C6E}, /* () */
     {{'\xe3', '\xb3', '\xa0'}, 3, 0x3CE0}, /* () */
     {{'\xe2', '\xba', '\xa7'}, 3, 0x2EA7}, /* (CJK RADICAL COW) */
     {{'\xee', '\xa0', '\xb1'}, 3, 0xE831}, /* () */
-    {{'\xee', '\xa0', '\xb2'}, 3, 0xE832}, /* () */
+    {{'\xe9', '\xbe', '\xb8'}, 3, 0x9FB8}, /* () */
     {{'\xe2', '\xba', '\xaa'}, 3, 0x2EAA}, /* (CJK RADICAL BOLT OF CLOTH) */
     {{'\xe4', '\x81', '\x96'}, 3, 0x4056}, /* () */
     {{'\xe4', '\x85', '\x9f'}, 3, 0x415F}, /* () */
@@ -23829,7 +23829,7 @@ LXB_API const lxb_encoding_multi_index_t lxb_encoding_multi_index_gb18030[23940]
     {{'\xe4', '\x93', '\x96'}, 3, 0x44D6}, /* () */
     {{'\xe4', '\x99', '\xa1'}, 3, 0x4661}, /* () */
     {{'\xe4', '\x99', '\x8c'}, 3, 0x464C}, /* () */
-    {{'\xee', '\xa1', '\x83'}, 3, 0xE843}, /* () */
+    {{'\xe9', '\xbe', '\xb9'}, 3, 0x9FB9}, /* () */
     {{'\xe4', '\x9c', '\xa3'}, 3, 0x4723}, /* () */
     {{'\xe4', '\x9c', '\xa9'}, 3, 0x4729}, /* () */
     {{'\xe4', '\x9d', '\xbc'}, 3, 0x477C}, /* () */
@@ -23846,7 +23846,7 @@ LXB_API const lxb_encoding_multi_index_t lxb_encoding_multi_index_gb18030[23940]
     {{'\xe4', '\xa6', '\x9b'}, 3, 0x499B}, /* () */
     {{'\xe4', '\xa6', '\xb7'}, 3, 0x49B7}, /* () */
     {{'\xe4', '\xa6', '\xb6'}, 3, 0x49B6}, /* () */
-    {{'\xee', '\xa1', '\x94'}, 3, 0xE854}, /* () */
+    {{'\xe9', '\xbe', '\xba'}, 3, 0x9FBA}, /* () */
     {{'\xee', '\xa1', '\x95'}, 3, 0xE855}, /* () */
     {{'\xe4', '\xb2', '\xa3'}, 3, 0x4CA3}, /* () */
     {{'\xe4', '\xb2', '\x9f'}, 3, 0x4C9F}, /* () */
@@ -23862,7 +23862,7 @@ LXB_API const lxb_encoding_multi_index_t lxb_encoding_multi_index_gb18030[23940]
     {{'\xe4', '\xb4', '\x98'}, 3, 0x4D18}, /* () */
     {{'\xe4', '\xb4', '\x99'}, 3, 0x4D19}, /* () */
     {{'\xe4', '\xb6', '\xae'}, 3, 0x4DAE}, /* () */
-    {{'\xee', '\xa1', '\xa4'}, 3, 0xE864}, /* () */
+    {{'\xe9', '\xbe', '\xbb'}, 3, 0x9FBB}, /* () */
     {{'\xee', '\x91', '\xa8'}, 3, 0xE468}, /* () */
     {{'\xee', '\x91', '\xa9'}, 3, 0xE469}, /* () */
     {{'\xee', '\x91', '\xaa'}, 3, 0xE46A}, /* () */
@@ -24122,14 +24122,14 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20107, 13999, 22515},
     {20108, 10259, 22516},
     {20109, 16626, 22517},
-    {20110, 15733, 20825},
+    {20110, 15733, 20834},
     {20111, 11962, 22518},
     {20112, 63, 22519},
     {20113, 15903, 22407},
-    {164, 6247, 20424},
-    {40065, 12464, 20861},
+    {164, 6247, 20432},
+    {40065, 12464, 20870},
     {20116, 14794, 22408},
-    {167, 6251, 20478},
+    {167, 6251, 20487},
     {20118, 64, 19953},
     {20119, 65, 22409},
     {20120, 16633, 22410},
@@ -24139,13 +24139,13 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20124, 67, 22524},
     {20125, 68, 22413},
     {20126, 69, 19987},
-    {177, 6207, 20340},
+    {177, 6207, 20347},
     {20128, 16894, 22414},
     {20129, 14621, 22526},
     {20130, 11901, 22415},
     {20131, 70, 22416},
     {20132, 11522, 22417},
-    {183, 6179, 20416},
+    {183, 6179, 20424},
     {20134, 15549, 22418},
     {20135, 9495, 22419},
     {20136, 10989, 22528},
@@ -24154,7 +24154,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20139, 14992, 22531},
     {20140, 11694, 22420},
     {20141, 14539, 22421},
-    {20142, 12288, 20790},
+    {20142, 12288, 20799},
     {20143, 72, 22532},
     {20144, 73, 22422},
     {20145, 74, 22423},
@@ -24162,7 +24162,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20147, 16896, 22425},
     {20148, 75, 22426},
     {20149, 16899, 22427},
-    {20150, 76, 20643},
+    {20150, 76, 20652},
     {20151, 77, 22428},
     {20152, 78, 22429},
     {20153, 79, 22430},
@@ -24177,50 +24177,50 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20162, 16701, 22436},
     {20163, 16699, 22437},
     {20164, 16663, 22438},
-    {215, 6208, 20450},
+    {215, 6208, 20459},
     {20166, 13250, 22440},
     {20167, 9675, 22441},
     {20168, 83, 22442},
     {20169, 16700, 22443},
-    {20170, 11576, 20476},
+    {20170, 11576, 20485},
     {20171, 11568, 22536},
     {20172, 84, 22444},
     {20173, 13637, 22445},
-    {224, 7509, 20367},
-    {20175, 85, 20191},
+    {224, 7509, 20374},
+    {20175, 85, 20198},
     {20176, 86, 22537},
     {20177, 12501, 22538},
     {20178, 87, 22539},
     {20179, 9459, 22540},
     {20180, 16483, 22541},
-    {40131, 13675, 20752},
-    {232, 7513, 20763},
-    {233, 7511, 20841},
-    {234, 7531, 20399},
+    {40131, 13675, 20761},
+    {232, 7513, 20772},
+    {233, 7511, 20850},
+    {234, 7531, 20407},
     {20185, 14956, 22451},
-    {20186, 88, 20195},
-    {20187, 89, 20193},
+    {20186, 88, 20202},
+    {20187, 89, 20200},
     {20188, 90, 22452},
     {20189, 16873, 22453},
     {20190, 16705, 22550},
     {20191, 13405, 22551},
-    {20192, 91, 20198},
-    {243, 7519, 20871},
+    {20192, 91, 20205},
+    {243, 7519, 20880},
     {20194, 92, 22554},
     {20195, 9875, 22544},
     {20196, 12333, 22545},
-    {247, 6209, 20817},
+    {247, 6209, 20826},
     {20198, 93, 22556},
-    {20199, 94, 20200},
-    {250, 7523, 20344},
+    {20199, 94, 20207},
+    {250, 7523, 20351},
     {20201, 95, 22558},
-    {252, 7530, 20816},
+    {252, 7530, 20825},
     {20203, 16704, 22560},
     {20204, 12674, 22546},
     {20205, 96, 22547},
     {20206, 97, 22561},
-    {20207, 98, 20190},
-    {40158, 12314, 20812},
+    {20207, 98, 20197},
+    {40158, 12314, 20821},
     {20209, 99, 22563},
     {20210, 16302, 22548},
     {20211, 16707, 22549},
@@ -24237,7 +24237,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20222, 105, 22620},
     {20223, 10389, 22621},
     {20224, 106, 22622},
-    {275, 7510, 20720},
+    {275, 7510, 20729},
     {20226, 107, 22624},
     {20227, 108, 22625},
     {20228, 109, 22626},
@@ -24245,7 +24245,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20230, 111, 22628},
     {20231, 112, 22629},
     {20232, 113, 22630},
-    {283, 7512, 20872},
+    {283, 7512, 20881},
     {20234, 15518, 22632},
     {20235, 114, 22633},
     {20236, 115, 22634},
@@ -24261,7 +24261,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20246, 120, 22644},
     {20247, 16303, 22645},
     {20248, 15712, 22646},
-    {299, 7514, 20431},
+    {299, 7514, 20440},
     {20250, 11180, 22648},
     {20251, 16706, 22649},
     {20252, 121, 22650},
@@ -24286,16 +24286,16 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20271, 9419, 22669},
     {20272, 10767, 22670},
     {20273, 130, 22671},
-    {324, 7534, 20873},
+    {324, 7534, 20882},
     {20275, 131, 22673},
     {20276, 9098, 22674},
     {20277, 132, 22675},
-    {328, 7535, 20652},
+    {328, 7535, 20661},
     {20279, 133, 22677},
     {20280, 13851, 22678},
     {20281, 134, 22679},
     {20282, 14192, 22680},
-    {20283, 135, 20196},
+    {20283, 135, 20203},
     {20284, 14193, 22682},
     {20285, 16819, 22683},
     {20286, 136, 22684},
@@ -24325,7 +24325,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20310, 151, 22802},
     {20311, 16817, 22803},
     {20312, 16875, 22804},
-    {363, 7522, 20824},
+    {363, 7522, 20833},
     {20314, 16718, 22806},
     {20315, 10435, 22807},
     {20316, 16522, 22808},
@@ -24424,21 +24424,21 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20409, 201, 22995},
     {20410, 202, 22996},
     {20411, 203, 22997},
-    {20412, 204, 20192},
+    {20412, 204, 20199},
     {20413, 205, 22999},
-    {20414, 206, 20194},
+    {20414, 206, 20201},
     {20415, 9282, 23001},
-    {20416, 207, 20197},
+    {20416, 207, 20204},
     {20417, 208, 23003},
-    {20418, 209, 20199},
+    {20418, 209, 20206},
     {20419, 9842, 23005},
-    {470, 7526, 20384},
+    {470, 7526, 20392},
     {20421, 16835, 23007},
-    {20422, 210, 20201},
+    {20422, 210, 20208},
     {20423, 211, 23009},
-    {20424, 212, 20202},
+    {20424, 212, 20209},
     {20425, 213, 23011},
-    {476, 7529, 20558},
+    {476, 7529, 20567},
     {20427, 214, 23013},
     {20428, 215, 23014},
     {20429, 216, 23015},
@@ -24467,7 +24467,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20452, 226, 23038},
     {20453, 227, 23039},
     {20454, 16832, 23040},
-    {20455, 228, 20205},
+    {20455, 228, 20212},
     {20456, 16833, 23042},
     {20457, 12264, 23043},
     {20458, 16834, 23044},
@@ -24541,91 +24541,91 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20526, 16847, 23206},
     {20527, 270, 23207},
     {20528, 271, 23208},
-    {20529, 272, 20700},
-    {20530, 273, 22102},
-    {20531, 274, 20434},
-    {20532, 275, 22103},
-    {20533, 276, 20686},
+    {20529, 272, 20709},
+    {20530, 273, 22110},
+    {20531, 274, 20443},
+    {20532, 275, 22111},
+    {20533, 276, 20695},
     {20534, 277, 23209},
-    {20535, 278, 20705},
-    {20536, 279, 20808},
+    {20535, 278, 20714},
+    {20536, 279, 20817},
     {20537, 280, 23210},
-    {20538, 16069, 22104},
-    {20539, 281, 22105},
-    {20540, 16266, 22106},
-    {20541, 282, 22107},
-    {20542, 13462, 22108},
-    {20543, 283, 20203},
+    {20538, 16069, 22112},
+    {20539, 281, 22113},
+    {20540, 16266, 22114},
+    {20541, 282, 22115},
+    {20542, 13462, 22116},
+    {20543, 283, 20210},
     {20544, 284, 23211},
-    {20545, 285, 20811},
+    {20545, 285, 20820},
     {20546, 286, 23212},
-    {20547, 16855, 22110},
-    {20548, 287, 22109},
-    {20549, 288, 20830},
+    {20547, 16855, 22118},
+    {20548, 287, 22117},
+    {20549, 288, 20839},
     {20550, 289, 23213},
-    {20551, 11362, 20774},
-    {20552, 16857, 22111},
-    {20553, 290, 22113},
-    {20554, 291, 22112},
-    {20555, 292, 22114},
-    {20556, 16843, 22115},
+    {20551, 11362, 20783},
+    {20552, 16857, 22119},
+    {20553, 290, 22121},
+    {20554, 291, 22120},
+    {20555, 292, 22122},
+    {20556, 16843, 22123},
     {20557, 293, 23214},
     {20558, 16858, 23215},
-    {609, 7537, 20404},
-    {20560, 294, 22116},
-    {20561, 295, 20421},
+    {609, 7537, 20412},
+    {20560, 294, 22124},
+    {20561, 295, 20429},
     {20562, 296, 23216},
-    {20563, 297, 22117},
-    {20564, 298, 22118},
-    {40515, 11758, 20874},
-    {20566, 299, 22119},
-    {20567, 300, 20383},
-    {20568, 301, 22120},
-    {20569, 302, 22121},
-    {20570, 16521, 22122},
-    {20571, 303, 22123},
-    {40522, 13606, 20767},
-    {20573, 304, 22124},
-    {20574, 305, 22125},
+    {20563, 297, 22125},
+    {20564, 298, 22126},
+    {40515, 11758, 20883},
+    {20566, 299, 22127},
+    {20567, 300, 20391},
+    {20568, 301, 22128},
+    {20569, 302, 22129},
+    {20570, 16521, 22130},
+    {20571, 303, 22131},
+    {40522, 13606, 20776},
+    {20573, 304, 22132},
+    {20574, 305, 22133},
     {20575, 306, 23217},
-    {20576, 307, 22126},
-    {20577, 308, 20710},
+    {20576, 307, 22134},
+    {20577, 308, 20719},
     {20578, 309, 23218},
-    {20579, 310, 22127},
+    {20579, 310, 22135},
     {20580, 311, 23219},
     {20581, 11496, 23220},
     {20582, 312, 23221},
-    {20583, 313, 22128},
+    {20583, 313, 22136},
     {20584, 314, 23222},
-    {20585, 315, 22129},
+    {20585, 315, 22137},
     {20586, 316, 22575},
     {20587, 317, 23223},
-    {20588, 16859, 22130},
-    {20589, 318, 22131},
-    {20590, 319, 22132},
+    {20588, 16859, 22138},
+    {20589, 318, 22139},
+    {20590, 319, 22140},
     {20591, 320, 23224},
-    {20592, 321, 22133},
+    {20592, 321, 22141},
     {20593, 322, 23225},
     {20594, 323, 23226},
     {20595, 324, 23227},
     {20596, 325, 23228},
-    {20597, 326, 22134},
-    {40548, 10980, 20706},
+    {20597, 326, 22142},
+    {40548, 10980, 20715},
     {20599, 14556, 23229},
-    {20600, 327, 22135},
-    {20601, 328, 22136},
-    {20602, 329, 22137},
-    {20603, 16860, 22138},
-    {20604, 330, 22139},
-    {20605, 331, 22140},
-    {20606, 16854, 22141},
-    {20607, 9600, 22143},
+    {20600, 327, 22143},
+    {20601, 328, 22144},
+    {20602, 329, 22145},
+    {20603, 16860, 22146},
+    {20604, 330, 22147},
+    {20605, 331, 22148},
+    {20606, 16854, 22149},
+    {20607, 9600, 22151},
     {20608, 11969, 23230},
     {20609, 332, 23231},
-    {20610, 333, 20821},
-    {20611, 334, 22142},
+    {20610, 333, 20830},
+    {20611, 334, 22150},
     {20612, 335, 23232},
-    {20613, 10566, 22144},
+    {20613, 10566, 22152},
     {20614, 336, 23233},
     {20615, 337, 23234},
     {20616, 12157, 23235},
@@ -24637,7 +24637,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20622, 342, 23241},
     {20623, 343, 23242},
     {20624, 344, 22294},
-    {20625, 345, 20665},
+    {20625, 345, 20674},
     {20626, 346, 23243},
     {20627, 347, 23244},
     {20628, 348, 22584},
@@ -24657,7 +24657,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20642, 362, 23255},
     {20643, 9871, 23256},
     {20644, 363, 22588},
-    {40595, 12465, 20875},
+    {40595, 12465, 20884},
     {20646, 364, 23257},
     {20647, 16862, 23258},
     {20648, 9787, 23259},
@@ -24676,8 +24676,8 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20661, 374, 19952},
     {20662, 375, 23271},
     {20663, 376, 19951},
-    {20664, 377, 20173},
-    {20665, 378, 20174},
+    {20664, 377, 20180},
+    {20665, 378, 20181},
     {20666, 16864, 23274},
     {20667, 13796, 23275},
     {20668, 379, 23276},
@@ -24691,13 +24691,13 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20676, 387, 23378},
     {20677, 388, 23379},
     {20678, 389, 22293},
-    {20679, 390, 20175},
+    {20679, 390, 20182},
     {20680, 391, 23381},
     {20681, 392, 23382},
     {20682, 393, 22292},
     {20683, 394, 23383},
     {20684, 395, 23384},
-    {20685, 396, 20671},
+    {20685, 396, 20680},
     {20686, 397, 23385},
     {20687, 14996, 22581},
     {20688, 398, 22582},
@@ -24706,27 +24706,27 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20691, 401, 23388},
     {20692, 402, 23389},
     {20693, 403, 23390},
-    {40644, 11153, 20876},
+    {40644, 11153, 20885},
     {20695, 404, 23391},
     {20696, 405, 23392},
     {20697, 406, 23393},
     {20698, 12292, 23394},
-    {20699, 407, 20879},
+    {20699, 407, 20888},
     {20700, 408, 23395},
     {20701, 409, 23396},
     {20702, 410, 23397},
-    {20703, 411, 20755},
-    {20704, 412, 20641},
-    {20705, 413, 22100},
+    {20703, 411, 20764},
+    {20704, 412, 20650},
+    {20705, 413, 22109},
     {20706, 414, 23398},
-    {20707, 415, 20420},
+    {20707, 415, 20428},
     {20708, 416, 23399},
     {20709, 417, 23400},
-    {40660, 13408, 20877},
+    {40660, 13408, 20886},
     {20711, 13789, 23401},
     {20712, 418, 23402},
     {20713, 419, 23403},
-    {20714, 420, 20692},
+    {20714, 420, 20701},
     {20715, 421, 23404},
     {20716, 16868, 23405},
     {20717, 16867, 22592},
@@ -24759,10 +24759,10 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20744, 442, 23422},
     {20745, 443, 23423},
     {20746, 444, 23424},
-    {20747, 16872, 21810},
+    {20747, 16872, 21819},
     {20748, 445, 23425},
-    {20749, 446, 21811},
-    {20750, 447, 21812},
+    {20749, 446, 21820},
+    {20750, 447, 21821},
     {20751, 448, 23426},
     {20752, 449, 22395},
     {20753, 450, 23427},
@@ -24780,25 +24780,25 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20765, 461, 22396},
     {20766, 462, 23439},
     {20767, 463, 22397},
-    {20768, 464, 20378},
+    {20768, 464, 20386},
     {20769, 12125, 23440},
-    {20770, 465, 20860},
+    {20770, 465, 20869},
     {20771, 466, 23441},
     {20772, 467, 23442},
-    {20773, 468, 20409},
+    {20773, 468, 20417},
     {20774, 469, 23443},
     {20775, 470, 23444},
     {20776, 471, 23445},
-    {20777, 472, 20858},
+    {20777, 472, 20867},
     {20778, 473, 23446},
-    {20779, 474, 20889},
+    {20779, 474, 20897},
     {20780, 475, 23447},
     {20781, 476, 23448},
     {20782, 477, 23449},
     {20783, 478, 23450},
     {20784, 479, 23451},
     {20785, 480, 23452},
-    {20786, 481, 20756},
+    {20786, 481, 20765},
     {20787, 482, 23453},
     {20788, 483, 22603},
     {20789, 484, 23454},
@@ -24825,7 +24825,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20810, 496, 23566},
     {20811, 11918, 22606},
     {20812, 497, 23567},
-    {40763, 9254, 20683},
+    {40763, 9254, 20692},
     {20814, 498, 23568},
     {20815, 499, 22608},
     {20816, 500, 22609},
@@ -24846,8 +24846,8 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20831, 509, 23582},
     {20832, 510, 23583},
     {20833, 511, 23584},
-    {20834, 11689, 20719},
-    {20835, 512, 21713},
+    {20834, 11689, 20728},
+    {20835, 512, 21721},
     {20836, 513, 23585},
     {20837, 13660, 23586},
     {20838, 514, 23587},
@@ -24876,62 +24876,62 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20861, 14027, 23610},
     {20862, 521, 23611},
     {20863, 522, 20108},
-    {914, 7127, 20438},
-    {915, 7128, 20881},
-    {916, 7129, 20869},
+    {914, 7127, 20447},
+    {915, 7128, 20890},
+    {916, 7129, 20878},
     {20867, 523, 20109},
     {20868, 524, 20110},
-    {919, 7132, 20697},
+    {919, 7132, 20706},
     {20870, 525, 20111},
     {20871, 526, 20112},
-    {922, 7135, 20400},
-    {923, 7136, 20731},
+    {922, 7135, 20408},
+    {923, 7136, 20740},
     {20874, 527, 20113},
     {20875, 528, 20114},
-    {926, 7139, 20351},
-    {927, 7140, 20836},
+    {926, 7139, 20358},
+    {927, 7140, 20845},
     {20878, 529, 20115},
     {20879, 530, 20116},
     {20880, 531, 23629},
     {20881, 532, 20117},
-    {932, 7144, 20676},
+    {932, 7144, 20685},
     {20883, 533, 20118},
     {20884, 534, 20119},
-    {935, 7147, 20682},
-    {936, 7148, 20651},
-    {937, 7149, 20740},
+    {935, 7147, 20691},
+    {936, 7148, 20660},
+    {937, 7149, 20749},
     {20888, 535, 22389},
     {20889, 15125, 22390},
     {20890, 536, 22391},
     {20891, 11777, 22392},
     {20892, 13024, 22393},
-    {20893, 537, 20728},
+    {20893, 537, 20737},
     {20894, 538, 22394},
     {20895, 539, 20120},
-    {946, 7159, 20412},
+    {946, 7159, 20420},
     {20897, 540, 20121},
-    {948, 7161, 20885},
+    {948, 7161, 20894},
     {20899, 541, 20122},
-    {950, 7163, 20832},
-    {951, 7164, 20886},
+    {950, 7163, 20841},
+    {951, 7164, 20895},
     {20902, 542, 20123},
     {20903, 543, 20124},
     {20904, 544, 20125},
     {20905, 545, 20126},
     {20906, 546, 20127},
-    {957, 7170, 20656},
-    {958, 7171, 20379},
+    {957, 7170, 20665},
+    {958, 7171, 20387},
     {20909, 547, 20128},
     {20910, 548, 20129},
-    {961, 7174, 20397},
+    {961, 7174, 20405},
     {20912, 9304, 23646},
-    {963, 7175, 20414},
-    {964, 7176, 20360},
-    {965, 7177, 20489},
+    {963, 7175, 20422},
+    {964, 7176, 20367},
+    {965, 7177, 20498},
     {20916, 549, 20130},
-    {967, 7179, 20566},
-    {968, 7180, 20813},
-    {969, 7181, 20639},
+    {967, 7179, 20575},
+    {968, 7180, 20822},
+    {969, 7181, 20648},
     {20920, 550, 0},
     {20921, 551, 0},
     {20922, 552, 0},
@@ -24946,14 +24946,14 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20931, 557, 0},
     {20932, 13269, 0},
     {20933, 558, 0},
-    {20934, 16463, 0},
-    {20935, 17006, 0},
-    {20936, 559, 0},
-    {20937, 12280, 0},
-    {20938, 560, 0},
-    {20939, 10057, 0},
-    {20940, 12327, 0},
-    {20941, 561, 0},
+    {20934, 16463, 23776},
+    {20935, 17006, 23784},
+    {20936, 559, 23789},
+    {20937, 12280, 23790},
+    {20938, 560, 23796},
+    {20939, 10057, 23813},
+    {20940, 12327, 23830},
+    {20941, 561, 23846},
     {20942, 562, 0},
     {20943, 11390, 0},
     {20944, 563, 0},
@@ -24987,7 +24987,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20972, 584, 0},
     {20973, 13235, 0},
     {20974, 585, 0},
-    {1025, 7322, 20559},
+    {1025, 7322, 20568},
     {20976, 11158, 0},
     {20977, 586, 0},
     {20978, 587, 0},
@@ -25002,72 +25002,72 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20987, 11202, 0},
     {20988, 17237, 0},
     {20989, 10940, 0},
-    {20990, 590, 20145},
-    {1041, 7317, 20837},
-    {1042, 7318, 20369},
-    {1043, 7319, 20376},
-    {1044, 7320, 20863},
-    {1045, 7321, 20736},
-    {20996, 591, 20146},
-    {20997, 592, 20147},
-    {1048, 7325, 20394},
-    {1049, 7326, 20724},
-    {1050, 7327, 20864},
-    {21001, 593, 20148},
-    {1052, 7329, 20560},
-    {21003, 594, 20149},
-    {21004, 595, 20150},
-    {1055, 7332, 20887},
-    {1056, 7333, 20865},
-    {21007, 596, 20151},
-    {21008, 597, 20152},
-    {1059, 7336, 20800},
-    {1060, 7337, 20426},
-    {21011, 598, 20153},
-    {21012, 599, 20154},
-    {21013, 600, 20155},
-    {1064, 7341, 21608},
-    {1065, 7342, 20647},
-    {1066, 7343, 20655},
-    {1067, 7344, 20838},
-    {1068, 7345, 20401},
-    {1069, 7346, 20363},
-    {21020, 601, 20156},
-    {1071, 7348, 20362},
-    {21022, 602, 20157},
-    {21023, 603, 20158},
-    {1074, 7366, 20743},
-    {21025, 604, 20159},
-    {21026, 605, 20160},
-    {21027, 606, 20161},
-    {1078, 7371, 20708},
-    {21029, 607, 20162},
-    {21030, 608, 20163},
-    {21031, 609, 20164},
-    {1082, 7375, 20709},
-    {1083, 7376, 20644},
-    {21034, 610, 20165},
-    {1085, 7378, 20345},
-    {21036, 611, 20166},
-    {1087, 7380, 20866},
-    {1088, 7381, 20411},
-    {21039, 612, 20167},
-    {1090, 7383, 20371},
-    {21041, 613, 20168},
-    {21042, 614, 20169},
-    {1093, 7386, 20867},
-    {21044, 615, 20170},
-    {21045, 616, 20171},
-    {1096, 7389, 20849},
-    {1097, 7390, 20757},
-    {1098, 7391, 20730},
-    {1099, 7392, 20741},
-    {1100, 7393, 20366},
-    {1101, 7394, 20564},
-    {21052, 617, 20172},
-    {1103, 7396, 20415},
+    {20990, 590, 20152},
+    {1041, 7317, 20846},
+    {1042, 7318, 20377},
+    {1043, 7319, 20384},
+    {1044, 7320, 20872},
+    {1045, 7321, 20745},
+    {20996, 591, 20153},
+    {20997, 592, 20154},
+    {1048, 7325, 20402},
+    {1049, 7326, 20733},
+    {1050, 7327, 20873},
+    {21001, 593, 20155},
+    {1052, 7329, 20569},
+    {21003, 594, 20156},
+    {21004, 595, 20157},
+    {1055, 7332, 20896},
+    {1056, 7333, 20874},
+    {21007, 596, 20158},
+    {21008, 597, 20159},
+    {1059, 7336, 20809},
+    {1060, 7337, 20435},
+    {21011, 598, 20160},
+    {21012, 599, 20161},
+    {21013, 600, 20162},
+    {1064, 7341, 21616},
+    {1065, 7342, 20656},
+    {1066, 7343, 20664},
+    {1067, 7344, 20847},
+    {1068, 7345, 20409},
+    {1069, 7346, 20370},
+    {21020, 601, 20163},
+    {1071, 7348, 20369},
+    {21022, 602, 20164},
+    {21023, 603, 20165},
+    {1074, 7366, 20752},
+    {21025, 604, 20166},
+    {21026, 605, 20167},
+    {21027, 606, 20168},
+    {1078, 7371, 20717},
+    {21029, 607, 20169},
+    {21030, 608, 20170},
+    {21031, 609, 20171},
+    {1082, 7375, 20718},
+    {1083, 7376, 20653},
+    {21034, 610, 20172},
+    {1085, 7378, 20352},
+    {21036, 611, 20173},
+    {1087, 7380, 20875},
+    {1088, 7381, 20419},
+    {21039, 612, 20174},
+    {1090, 7383, 20379},
+    {21041, 613, 20175},
+    {21042, 614, 20176},
+    {1093, 7386, 20876},
+    {21044, 615, 20177},
+    {21045, 616, 20178},
+    {1096, 7389, 20858},
+    {1097, 7390, 20766},
+    {1098, 7391, 20739},
+    {1099, 7392, 20750},
+    {1100, 7393, 20373},
+    {1101, 7394, 20573},
+    {21052, 617, 20179},
+    {1103, 7396, 20423},
     {21054, 618, 0},
-    {1105, 7370, 20868},
+    {1105, 7370, 20877},
     {21056, 16685, 0},
     {21057, 10236, 0},
     {21058, 11338, 0},
@@ -29152,16 +29152,16 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {25137, 3216, 0},
     {25138, 3217, 0},
     {25139, 9818, 0},
-    {25140, 9872, 0},
-    {25141, 3218, 0},
-    {25142, 3219, 0},
-    {25143, 11122, 0},
-    {25144, 3220, 0},
-    {25145, 3221, 0},
-    {25146, 3222, 0},
-    {25147, 3223, 0},
-    {25148, 3224, 0},
-    {25149, 20495, 0},
+    {65040, 7182, 20376},
+    {25141, 3218, 20132},
+    {25142, 3219, 20131},
+    {65043, 7185, 20433},
+    {25144, 3220, 20133},
+    {25145, 3221, 20134},
+    {25146, 3222, 20135},
+    {25147, 3223, 20145},
+    {25148, 3224, 20146},
+    {65049, 7208, 21722},
     {25150, 20494, 0},
     {25151, 10386, 0},
     {25152, 14244, 0},
@@ -29184,66 +29184,66 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {25169, 13248, 0},
     {25170, 9064, 0},
     {25171, 9867, 0},
-    {65072, 7621, 20738},
-    {25173, 3232, 20143},
+    {65072, 7621, 20747},
+    {25173, 3232, 20150},
     {25174, 3233, 0},
-    {25175, 3234, 20144},
-    {65076, 7210, 20773},
-    {25177, 3235, 20131},
-    {25178, 3236, 20132},
-    {65079, 7205, 20561},
-    {25180, 3237, 20142},
-    {25181, 3238, 20133},
-    {25182, 3239, 20134},
-    {25183, 3240, 20140},
-    {25184, 3241, 20141},
-    {25185, 3242, 20136},
-    {25186, 3243, 20137},
-    {65087, 7193, 20565},
-    {25188, 3244, 20135},
-    {25189, 3245, 20138},
-    {65090, 7198, 20722},
-    {65091, 7199, 20847},
-    {25192, 3246, 20139},
+    {25175, 3234, 20151},
+    {65076, 7210, 20782},
+    {25177, 3235, 20136},
+    {25178, 3236, 20137},
+    {65079, 7205, 20570},
+    {25180, 3237, 20149},
+    {25181, 3238, 20138},
+    {25182, 3239, 20139},
+    {25183, 3240, 20147},
+    {25184, 3241, 20148},
+    {25185, 3242, 20141},
+    {25186, 3243, 20142},
+    {65087, 7193, 20574},
+    {25188, 3244, 20140},
+    {25189, 3245, 20143},
+    {65090, 7198, 20731},
+    {65091, 7199, 20856},
+    {25192, 3246, 20144},
     {25193, 12074, 0},
     {25194, 17814, 0},
     {25195, 13783, 0},
     {25196, 15374, 0},
-    {65097, 7640, 20702},
-    {65098, 7641, 20335},
-    {65099, 7642, 20356},
-    {65100, 7643, 20733},
-    {25201, 3247, 20209},
-    {25202, 3248, 20210},
-    {65103, 7646, 20333},
-    {25204, 3249, 20211},
-    {25205, 3250, 20212},
-    {65106, 7649, 20398},
+    {65097, 7640, 20711},
+    {65098, 7641, 20342},
+    {65099, 7642, 20363},
+    {65100, 7643, 20742},
+    {25201, 3247, 20216},
+    {25202, 3248, 20217},
+    {65103, 7646, 20340},
+    {25204, 3249, 20218},
+    {25205, 3250, 20219},
+    {65106, 7649, 20406},
     {25207, 3251, 0},
-    {25208, 3252, 20213},
-    {65109, 7651, 20713},
-    {25210, 3253, 20214},
-    {25211, 3254, 20215},
+    {25208, 3252, 20220},
+    {65109, 7651, 20722},
+    {25210, 3253, 20221},
+    {25211, 3254, 20222},
     {25212, 10248, 0},
-    {25213, 3255, 20216},
-    {65114, 7655, 20842},
-    {65115, 7656, 20358},
-    {65116, 7657, 20437},
-    {25217, 3256, 20217},
-    {25218, 3257, 20218},
-    {25219, 3258, 20219},
-    {65120, 7661, 20355},
-    {25221, 3259, 20220},
-    {25222, 3260, 20221},
-    {25223, 3261, 20222},
-    {25224, 3262, 20223},
-    {65125, 7666, 20488},
-    {65126, 7667, 20331},
+    {25213, 3255, 20223},
+    {65114, 7655, 20851},
+    {65115, 7656, 20365},
+    {65116, 7657, 20446},
+    {25217, 3256, 20224},
+    {25218, 3257, 20225},
+    {25219, 3258, 20226},
+    {65120, 7661, 20362},
+    {25221, 3259, 20227},
+    {25222, 3260, 20228},
+    {25223, 3261, 20229},
+    {25224, 3262, 20230},
+    {65125, 7666, 20497},
+    {65126, 7667, 20338},
     {25227, 3263, 0},
-    {25228, 3264, 20224},
-    {25229, 3265, 20225},
-    {25230, 3266, 20226},
-    {25231, 3267, 20227},
+    {25228, 3264, 20231},
+    {25229, 3265, 20232},
+    {25230, 3266, 20233},
+    {25231, 3267, 20234},
     {25232, 3268, 0},
     {25233, 15539, 0},
     {25234, 14032, 0},
@@ -29393,55 +29393,55 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {25378, 17821, 0},
     {25379, 16140, 0},
     {25380, 11328, 0},
-    {65281, 6556, 20429},
+    {65281, 6556, 20438},
     {25382, 3331, 20049},
     {25383, 3332, 20050},
-    {65284, 6246, 20327},
+    {65284, 6246, 20334},
     {25385, 3333, 20052},
-    {65286, 6561, 20704},
-    {65287, 6562, 20368},
+    {65286, 6561, 20713},
+    {65287, 6562, 20375},
     {25388, 3334, 20053},
     {25389, 3335, 20054},
     {25390, 3336, 20055},
-    {65291, 6566, 20844},
+    {65291, 6566, 20853},
     {25392, 3337, 20056},
     {25393, 3338, 20057},
-    {65294, 6569, 21556},
+    {65294, 6569, 21564},
     {25395, 3339, 20058},
     {25396, 3340, 20059},
     {25397, 3341, 20060},
     {25398, 3342, 20061},
     {25399, 3343, 20062},
     {25400, 3344, 20063},
-    {65301, 6576, 20890},
-    {65302, 6577, 20768},
+    {65301, 6576, 20898},
+    {65302, 6577, 20777},
     {25403, 3345, 20064},
     {25404, 3346, 20065},
-    {65305, 6580, 20776},
+    {65305, 6580, 20785},
     {25406, 3347, 20066},
     {25407, 3348, 20067},
     {25408, 3349, 20068},
     {25409, 3350, 20069},
-    {65310, 6585, 20782},
-    {65311, 6586, 20892},
+    {65310, 6585, 20791},
+    {65311, 6586, 20900},
     {25412, 3351, 20070},
-    {65313, 6588, 20769},
-    {65314, 6589, 20633},
+    {65313, 6588, 20778},
+    {65314, 6589, 20642},
     {25415, 3352, 20071},
     {25416, 3353, 20072},
-    {65317, 6592, 20853},
+    {65317, 6592, 20862},
     {25418, 3354, 20073},
-    {65319, 6594, 20891},
-    {65320, 6595, 20329},
-    {65321, 6596, 20418},
-    {65322, 6597, 20744},
-    {65323, 6598, 20701},
-    {65324, 6599, 20486},
+    {65319, 6594, 20899},
+    {65320, 6595, 20336},
+    {65321, 6596, 20426},
+    {65322, 6597, 20753},
+    {65323, 6598, 20710},
+    {65324, 6599, 20495},
     {25425, 3355, 20074},
     {25426, 3356, 20075},
     {25427, 3357, 20076},
     {25428, 3358, 20077},
-    {65329, 6604, 20348},
+    {65329, 6604, 20355},
     {25430, 3359, 20078},
     {25431, 3360, 20079},
     {25432, 3361, 20080},
@@ -29450,43 +29450,43 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {25435, 3364, 20083},
     {25436, 3365, 20084},
     {25437, 3366, 20085},
-    {65338, 6613, 20636},
-    {65339, 6614, 20762},
+    {65338, 6613, 20645},
+    {65339, 6614, 20771},
     {25440, 3367, 20086},
-    {65341, 6616, 20442},
-    {65342, 6617, 20428},
-    {65343, 6618, 20370},
+    {65341, 6616, 20451},
+    {65342, 6617, 20437},
+    {65343, 6618, 20378},
     {25444, 3368, 20087},
     {25445, 3369, 20088},
     {25446, 3370, 20089},
-    {65347, 6622, 20711},
+    {65347, 6622, 20720},
     {25448, 3371, 20090},
-    {65349, 6624, 20896},
+    {65349, 6624, 20904},
     {25450, 3372, 20091},
     {25451, 3373, 20092},
     {25452, 3374, 20093},
-    {65353, 6628, 20895},
-    {65354, 6629, 20485},
+    {65353, 6628, 20903},
+    {65354, 6629, 20494},
     {25455, 3375, 20094},
     {25456, 3376, 20095},
-    {65357, 6632, 20893},
+    {65357, 6632, 20901},
     {25458, 3377, 20096},
     {25459, 3378, 20097},
     {25460, 3379, 20098},
     {25461, 3380, 20099},
-    {65362, 6637, 20364},
-    {65363, 6638, 20448},
+    {65362, 6637, 20371},
+    {65363, 6638, 20457},
     {25464, 3381, 20100},
     {25465, 3382, 20101},
-    {65366, 6641, 20894},
-    {65367, 6642, 20699},
+    {65366, 6641, 20902},
+    {65367, 6642, 20708},
     {25468, 3383, 20102},
     {25469, 3384, 20103},
     {25470, 3385, 20104},
     {25471, 3386, 20105},
-    {65372, 6647, 20789},
+    {65372, 6647, 20798},
     {25473, 3387, 20106},
-    {65374, 6186, 20374},
+    {65374, 6186, 20382},
     {25475, 3388, 0},
     {25476, 3389, 0},
     {25477, 3390, 0},
@@ -29617,10 +29617,10 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {25602, 12452, 0},
     {25603, 3461, 0},
     {25604, 3462, 19989},
-    {65505, 6249, 20445},
-    {25606, 3463, 20206},
+    {65505, 6249, 20454},
+    {25606, 3463, 20213},
     {25607, 3464, 20107},
-    {25608, 3465, 20207},
+    {25608, 3465, 20214},
     {25609, 3466, 20051},
     {25610, 3467, 0},
     {25611, 17850, 0},
@@ -31705,7 +31705,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {27690, 20255, 0},
     {27691, 4913, 0},
     {27692, 4914, 0},
-    {27693, 4915, 20204},
+    {27693, 4915, 20211},
     {27694, 9985, 0},
     {27695, 12485, 0},
     {27696, 13467, 0},
@@ -32170,19 +32170,19 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28155, 14422, 0},
     {28156, 20636, 0},
     {28157, 5159, 0},
-    {28158, 5160, 20208},
+    {28158, 5160, 20215},
     {28159, 5161, 0},
     {28160, 5162, 0},
-    {28161, 5163, 20176},
+    {28161, 5163, 20183},
     {28162, 5164, 19954},
-    {28163, 5165, 20177},
+    {28163, 5165, 20184},
     {28164, 5166, 19955},
     {28165, 13464, 0},
     {28166, 5167, 19956},
     {28167, 5168, 19957},
     {28168, 5169, 0},
     {28169, 5170, 0},
-    {8220, 6191, 20831},
+    {8220, 6191, 20840},
     {28171, 5171, 19958},
     {28172, 18948, 0},
     {28173, 16488, 0},
@@ -32191,8 +32191,8 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28176, 11500, 0},
     {28177, 18942, 0},
     {28178, 5173, 0},
-    {28179, 5174, 20178},
-    {8230, 6188, 20826},
+    {28179, 5174, 20185},
+    {8230, 6188, 20835},
     {28181, 5175, 0},
     {28182, 18946, 0},
     {28183, 13863, 0},
@@ -32204,16 +32204,16 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28189, 15744, 0},
     {28190, 5180, 19990},
     {28191, 5181, 0},
-    {8242, 6243, 20727},
-    {8243, 6244, 20380},
+    {8242, 6243, 20736},
+    {8243, 6244, 20388},
     {28194, 5182, 0},
-    {8245, 7416, 20839},
+    {8245, 7416, 20848},
     {28196, 9424, 0},
     {28197, 18960, 0},
     {28198, 5183, 0},
     {28199, 5184, 0},
     {28200, 5185, 0},
-    {8251, 6264, 20780},
+    {8251, 6264, 20789},
     {28202, 5186, 0},
     {28203, 18950, 0},
     {28204, 5187, 0},
@@ -32415,11 +32415,11 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28400, 5320, 0},
     {28401, 5321, 19988},
     {28402, 5322, 0},
-    {28403, 5323, 20179},
+    {28403, 5323, 20186},
     {28404, 10021, 0},
     {28405, 5324, 0},
     {28406, 5325, 0},
-    {28407, 5326, 20180},
+    {28407, 5326, 20187},
     {28408, 5327, 0},
     {28409, 18984, 0},
     {28410, 5328, 0},
@@ -32443,7 +32443,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28428, 5343, 0},
     {28429, 5344, 0},
     {28430, 5345, 0},
-    {8481, 7625, 20662},
+    {8481, 7625, 20671},
     {28432, 5346, 0},
     {28433, 5347, 0},
     {28434, 5348, 0},
@@ -32516,21 +32516,21 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28501, 5397, 20044},
     {28502, 5398, 20045},
     {28503, 5399, 20046},
-    {8554, 6456, 20707},
+    {8554, 6456, 20716},
     {28505, 5400, 20047},
     {28506, 5401, 0},
     {28507, 5402, 0},
     {28508, 13412, 0},
     {28509, 5403, 0},
-    {8560, 6366, 20666},
+    {8560, 6366, 20675},
     {28511, 5404, 19996},
     {28512, 5405, 19997},
     {28513, 5406, 19998},
-    {8564, 6370, 21189},
+    {8564, 6370, 21197},
     {28515, 5407, 19999},
     {28516, 5408, 20000},
     {28517, 5409, 20001},
-    {8568, 6374, 20646},
+    {8568, 6374, 20655},
     {28519, 5410, 20002},
     {28520, 5411, 0},
     {28521, 5412, 0},
@@ -32560,10 +32560,10 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28545, 5429, 19995},
     {28546, 5430, 0},
     {28547, 5431, 0},
-    {8598, 7419, 20357},
-    {28549, 5432, 20181},
-    {28550, 5433, 20182},
-    {28551, 5434, 20183},
+    {8598, 7419, 20364},
+    {28549, 5432, 20188},
+    {28550, 5433, 20189},
+    {28551, 5434, 20190},
     {28552, 9621, 0},
     {28553, 18992, 0},
     {28554, 5435, 0},
@@ -32687,7 +32687,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28672, 5534, 0},
     {28673, 5535, 0},
     {28674, 5536, 0},
-    {28675, 5537, 20184},
+    {28675, 5537, 20191},
     {28676, 5538, 0},
     {28677, 5539, 0},
     {28678, 5540, 0},
@@ -32697,11 +32697,11 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28682, 5544, 0},
     {28683, 5545, 19979},
     {28684, 5546, 19985},
-    {28685, 5547, 20185},
+    {28685, 5547, 20192},
     {28686, 5548, 19971},
     {28687, 5549, 0},
     {28688, 5550, 0},
-    {8739, 7425, 20718},
+    {8739, 7425, 20727},
     {28690, 5551, 0},
     {28691, 5552, 19970},
     {28692, 5553, 0},
@@ -32719,7 +32719,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28704, 5563, 0},
     {28705, 5564, 0},
     {28706, 5565, 19986},
-    {8757, 6238, 21286},
+    {8757, 6238, 21294},
     {28708, 5566, 19959},
     {28709, 5567, 19967},
     {28710, 5568, 0},
@@ -32748,7 +32748,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28733, 5589, 0},
     {28734, 5590, 0},
     {28735, 5591, 0},
-    {28736, 5592, 20186},
+    {28736, 5592, 20193},
     {28737, 5593, 0},
     {28738, 5594, 0},
     {28739, 5595, 0},
@@ -32763,13 +32763,13 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28748, 10799, 0},
     {28749, 5604, 0},
     {28750, 5605, 19980},
-    {8801, 6227, 21287},
+    {8801, 6227, 21295},
     {28752, 5606, 0},
     {28753, 5607, 0},
     {28754, 5608, 19983},
     {28755, 5609, 19984},
-    {28756, 5610, 20187},
-    {28757, 5611, 20188},
+    {28756, 5610, 20194},
+    {28757, 5611, 20195},
     {28758, 5612, 0},
     {28759, 5613, 0},
     {28760, 5614, 0},
@@ -32815,7 +32815,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28800, 20455, 0},
     {28801, 5642, 0},
     {28802, 5643, 0},
-    {28803, 5644, 20189},
+    {28803, 5644, 20196},
     {28804, 5645, 0},
     {28805, 20078, 0},
     {28806, 5646, 0},
@@ -32857,7 +32857,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28842, 5672, 0},
     {28843, 20462, 0},
     {28844, 11755, 0},
-    {8895, 7429, 20764},
+    {8895, 7429, 20773},
     {28846, 13073, 0},
     {28847, 11713, 0},
     {28848, 5673, 0},
@@ -33278,11 +33278,11 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29263, 5987, 20029},
     {29264, 5988, 20030},
     {29265, 5989, 20031},
-    {9316, 6426, 21606},
+    {9316, 6426, 21614},
     {29267, 5990, 20032},
     {29268, 5991, 20033},
     {29269, 5992, 20034},
-    {9320, 6430, 21607},
+    {9320, 6430, 21615},
     {29271, 5993, 20035},
     {29272, 5994, 0},
     {29273, 15327, 0},
@@ -33294,41 +33294,41 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29279, 12843, 0},
     {29280, 5998, 0},
     {29281, 12846, 0},
-    {9332, 6402, 20637},
+    {9332, 6402, 20646},
     {29283, 5999, 20016},
     {29284, 6000, 20017},
     {29285, 6001, 20018},
-    {9336, 6406, 21551},
-    {9337, 6407, 20693},
+    {9336, 6406, 21559},
+    {9337, 6407, 20702},
     {29288, 6002, 20019},
-    {9339, 6409, 20784},
+    {9339, 6409, 20793},
     {29290, 6003, 20020},
     {29291, 6004, 20021},
     {29292, 6005, 20022},
     {29293, 6006, 20023},
-    {9344, 6414, 21550},
-    {9345, 6415, 21552},
+    {9344, 6414, 21558},
+    {9345, 6415, 21560},
     {29296, 6007, 20024},
     {29297, 6008, 20025},
-    {9348, 6418, 20748},
+    {9348, 6418, 20757},
     {29299, 6009, 20026},
     {29300, 6010, 20027},
-    {9351, 6421, 20721},
+    {9351, 6421, 20730},
     {29302, 6011, 20003},
     {29303, 6012, 20004},
     {29304, 6013, 20005},
-    {9355, 6385, 20765},
-    {9356, 6386, 20785},
+    {9355, 6385, 20774},
+    {9356, 6386, 20794},
     {29307, 6014, 20006},
     {29308, 6015, 20007},
     {29309, 6016, 20008},
-    {9360, 6390, 21553},
-    {9361, 6391, 21554},
-    {9362, 6392, 20786},
-    {9363, 6393, 20640},
+    {9360, 6390, 21561},
+    {9361, 6391, 21562},
+    {9362, 6392, 20795},
+    {9363, 6393, 20649},
     {29314, 6017, 20009},
     {29315, 6018, 20010},
-    {9366, 6396, 21555},
+    {9366, 6396, 21563},
     {29317, 6019, 20011},
     {29318, 6020, 20012},
     {29319, 6021, 20013},
@@ -33434,122 +33434,122 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29419, 7800, 0},
     {29420, 10197, 0},
     {29421, 14948, 0},
-    {9472, 7699, 20750},
-    {9473, 7700, 20897},
-    {9474, 7701, 20845},
-    {9475, 7702, 20828},
-    {9476, 7703, 20898},
-    {9477, 7704, 20902},
-    {9478, 7705, 20899},
-    {9479, 7706, 20228},
-    {9480, 7707, 20229},
-    {9481, 7708, 20900},
-    {9482, 7709, 20642},
-    {9483, 7710, 20230},
-    {9484, 7711, 20904},
-    {9485, 7712, 20957},
-    {9486, 7713, 20635},
-    {9487, 7714, 20231},
-    {9488, 7715, 20232},
-    {9489, 7716, 20233},
-    {9490, 7717, 20234},
-    {9491, 7718, 20901},
-    {9492, 7719, 20235},
-    {9493, 7720, 20903},
-    {9494, 7721, 20236},
-    {9495, 7722, 20237},
-    {9496, 7723, 20238},
-    {9497, 7724, 20239},
-    {9498, 7725, 20240},
-    {9499, 7726, 20241},
-    {9500, 7727, 20961},
-    {9501, 7728, 20242},
-    {9502, 7729, 20243},
-    {9503, 7730, 20244},
-    {9504, 7731, 20648},
-    {9505, 7732, 20245},
-    {9506, 7733, 20246},
-    {9507, 7734, 20247},
-    {9508, 7735, 20248},
-    {9509, 7736, 20959},
-    {9510, 7737, 20249},
-    {9511, 7738, 20964},
-    {9512, 7739, 20354},
-    {9513, 7740, 20958},
-    {9514, 7741, 20250},
-    {9515, 7742, 20251},
-    {9516, 7743, 20252},
-    {9517, 7744, 20679},
-    {9518, 7745, 20349},
-    {9519, 7746, 20963},
-    {9520, 7747, 20962},
-    {9521, 7748, 20253},
-    {9522, 7749, 20254},
-    {9523, 7750, 20960},
-    {9524, 7751, 20965},
-    {9525, 7752, 20255},
-    {9526, 7753, 20256},
-    {9527, 7754, 20967},
-    {9528, 7755, 20257},
-    {9529, 7756, 20258},
-    {9530, 7757, 20259},
-    {9531, 7758, 20799},
-    {9532, 7759, 20851},
-    {9533, 7760, 20675},
-    {9534, 7761, 20968},
-    {9535, 7762, 20260},
-    {9536, 7763, 20792},
-    {9537, 7764, 20261},
-    {9538, 7765, 20262},
-    {9539, 7766, 20970},
-    {9540, 7767, 20263},
-    {9541, 7768, 20264},
-    {9542, 7769, 20423},
-    {9543, 7770, 20265},
-    {9544, 7771, 20266},
-    {9545, 7772, 21548},
-    {9546, 7773, 20969},
-    {9547, 7774, 20966},
+    {9472, 7699, 20759},
+    {9473, 7700, 20905},
+    {9474, 7701, 20854},
+    {9475, 7702, 20837},
+    {9476, 7703, 20906},
+    {9477, 7704, 20910},
+    {9478, 7705, 20907},
+    {9479, 7706, 20235},
+    {9480, 7707, 20236},
+    {9481, 7708, 20908},
+    {9482, 7709, 20651},
+    {9483, 7710, 20237},
+    {9484, 7711, 20912},
+    {9485, 7712, 20965},
+    {9486, 7713, 20644},
+    {9487, 7714, 20238},
+    {9488, 7715, 20239},
+    {9489, 7716, 20240},
+    {9490, 7717, 20241},
+    {9491, 7718, 20909},
+    {9492, 7719, 20242},
+    {9493, 7720, 20911},
+    {9494, 7721, 20243},
+    {9495, 7722, 20244},
+    {9496, 7723, 20245},
+    {9497, 7724, 20246},
+    {9498, 7725, 20247},
+    {9499, 7726, 20248},
+    {9500, 7727, 20969},
+    {9501, 7728, 20249},
+    {9502, 7729, 20250},
+    {9503, 7730, 20251},
+    {9504, 7731, 20657},
+    {9505, 7732, 20252},
+    {9506, 7733, 20253},
+    {9507, 7734, 20254},
+    {9508, 7735, 20255},
+    {9509, 7736, 20967},
+    {9510, 7737, 20256},
+    {9511, 7738, 20972},
+    {9512, 7739, 20361},
+    {9513, 7740, 20966},
+    {9514, 7741, 20257},
+    {9515, 7742, 20258},
+    {9516, 7743, 20259},
+    {9517, 7744, 20688},
+    {9518, 7745, 20356},
+    {9519, 7746, 20971},
+    {9520, 7747, 20970},
+    {9521, 7748, 20260},
+    {9522, 7749, 20261},
+    {9523, 7750, 20968},
+    {9524, 7751, 20973},
+    {9525, 7752, 20262},
+    {9526, 7753, 20263},
+    {9527, 7754, 20975},
+    {9528, 7755, 20264},
+    {9529, 7756, 20265},
+    {9530, 7757, 20266},
+    {9531, 7758, 20808},
+    {9532, 7759, 20860},
+    {9533, 7760, 20684},
+    {9534, 7761, 20976},
+    {9535, 7762, 20267},
+    {9536, 7763, 20801},
+    {9537, 7764, 20268},
+    {9538, 7765, 20269},
+    {9539, 7766, 20978},
+    {9540, 7767, 20270},
+    {9541, 7768, 20271},
+    {9542, 7769, 20431},
+    {9543, 7770, 20272},
+    {9544, 7771, 20273},
+    {9545, 7772, 21556},
+    {9546, 7773, 20977},
+    {9547, 7774, 20974},
     {29498, 7840, 0},
     {29499, 7841, 0},
     {29500, 7842, 0},
     {29501, 7843, 0},
-    {9552, 7430, 20425},
-    {9553, 7431, 20833},
-    {9554, 7432, 20267},
-    {9555, 7433, 20268},
-    {9556, 7434, 20269},
-    {9557, 7435, 20270},
-    {9558, 7436, 20271},
-    {9559, 7437, 20272},
-    {9560, 7438, 20273},
-    {9561, 7439, 20274},
-    {9562, 7440, 20275},
-    {9563, 7441, 20276},
-    {9564, 7442, 20277},
-    {9565, 7443, 20278},
-    {9566, 7444, 20279},
-    {9567, 7445, 20972},
-    {9568, 7446, 20280},
-    {9569, 7447, 20281},
-    {9570, 7448, 20971},
-    {9571, 7449, 20282},
-    {9572, 7450, 21549},
-    {9573, 7451, 20283},
-    {9574, 7452, 20284},
-    {9575, 7453, 20285},
-    {9576, 7454, 20286},
-    {9577, 7455, 20973},
-    {9578, 7456, 20287},
-    {9579, 7457, 20288},
-    {9580, 7458, 20289},
-    {9581, 7459, 20290},
-    {9582, 7460, 20291},
-    {9583, 7461, 20292},
-    {9584, 7462, 20293},
-    {9585, 7463, 20294},
-    {9586, 7464, 20974},
-    {9587, 7465, 20295},
+    {9552, 7430, 20434},
+    {9553, 7431, 20842},
+    {9554, 7432, 20274},
+    {9555, 7433, 20275},
+    {9556, 7434, 20276},
+    {9557, 7435, 20277},
+    {9558, 7436, 20278},
+    {9559, 7437, 20279},
+    {9560, 7438, 20280},
+    {9561, 7439, 20281},
+    {9562, 7440, 20282},
+    {9563, 7441, 20283},
+    {9564, 7442, 20284},
+    {9565, 7443, 20285},
+    {9566, 7444, 20286},
+    {9567, 7445, 20980},
+    {9568, 7446, 20287},
+    {9569, 7447, 20288},
+    {9570, 7448, 20979},
+    {9571, 7449, 20289},
+    {9572, 7450, 21557},
+    {9573, 7451, 20290},
+    {9574, 7452, 20291},
+    {9575, 7453, 20292},
+    {9576, 7454, 20293},
+    {9577, 7455, 20981},
+    {9578, 7456, 20294},
+    {9579, 7457, 20295},
+    {9580, 7458, 20296},
+    {9581, 7459, 20297},
+    {9582, 7460, 20298},
+    {9583, 7461, 20299},
+    {9584, 7462, 20300},
+    {9585, 7463, 20301},
+    {9586, 7464, 20982},
+    {9587, 7465, 20302},
     {29538, 7873, 0},
     {29539, 7874, 0},
     {29540, 7875, 0},
@@ -33563,27 +33563,27 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29548, 18544, 0},
     {29549, 14346, 0},
     {29550, 7883, 0},
-    {9601, 7466, 20975},
-    {9602, 7467, 20296},
-    {9603, 7468, 20297},
-    {9604, 7469, 20298},
-    {9605, 7470, 20299},
-    {9606, 7471, 20300},
-    {9607, 7472, 20301},
-    {9608, 7473, 20302},
-    {9609, 7474, 20303},
-    {9610, 7475, 20304},
-    {9611, 7476, 20305},
-    {9612, 7477, 20306},
-    {9613, 7478, 20307},
-    {9614, 7479, 20308},
-    {9615, 7480, 20309},
+    {9601, 7466, 20983},
+    {9602, 7467, 20303},
+    {9603, 7468, 20304},
+    {9604, 7469, 20305},
+    {9605, 7470, 20306},
+    {9606, 7471, 20307},
+    {9607, 7472, 20308},
+    {9608, 7473, 20309},
+    {9609, 7474, 20310},
+    {9610, 7475, 20311},
+    {9611, 7476, 20312},
+    {9612, 7477, 20313},
+    {9613, 7478, 20314},
+    {9614, 7479, 20315},
+    {9615, 7480, 20316},
     {29566, 18546, 0},
     {29567, 7992, 0},
     {29568, 7993, 0},
-    {9619, 7481, 20310},
-    {9620, 7482, 20311},
-    {9621, 7483, 20312},
+    {9619, 7481, 20317},
+    {9620, 7482, 20318},
+    {9621, 7483, 20319},
     {29572, 15199, 0},
     {29573, 7997, 0},
     {29574, 7998, 0},
@@ -33594,8 +33594,8 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29579, 14620, 0},
     {29580, 8001, 0},
     {29581, 8002, 0},
-    {9632, 6261, 21518},
-    {9633, 6260, 20313},
+    {9632, 6261, 21526},
+    {9633, 6260, 20320},
     {29584, 8004, 0},
     {29585, 19540, 0},
     {29586, 8005, 0},
@@ -33612,8 +33612,8 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29597, 8014, 0},
     {29598, 8015, 0},
     {29599, 19543, 0},
-    {9650, 6263, 20314},
-    {9651, 6262, 20315},
+    {9650, 6263, 20321},
+    {9651, 6262, 20322},
     {29602, 19542, 0},
     {29603, 8018, 0},
     {29604, 8019, 0},
@@ -33622,8 +33622,8 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29607, 8022, 0},
     {29608, 8023, 0},
     {29609, 14605, 0},
-    {9660, 7484, 20316},
-    {9661, 7485, 20677},
+    {9660, 7484, 20323},
+    {9661, 7485, 20686},
     {29612, 8025, 0},
     {29613, 8026, 0},
     {29614, 19541, 0},
@@ -33632,16 +33632,16 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29617, 8027, 0},
     {29618, 12320, 0},
     {29619, 19548, 0},
-    {9670, 6259, 20317},
-    {9671, 6258, 20318},
+    {9670, 6259, 20324},
+    {9671, 6258, 20325},
     {29622, 8030, 0},
     {29623, 19547, 0},
     {29624, 8031, 0},
-    {9675, 6255, 20319},
+    {9675, 6255, 20326},
     {29626, 19559, 0},
     {29627, 9408, 0},
-    {9678, 6257, 20320},
-    {9679, 6256, 20321},
+    {9678, 6257, 20327},
+    {9679, 6256, 20328},
     {29630, 8035, 0},
     {29631, 8036, 0},
     {29632, 19549, 0},
@@ -33660,10 +33660,10 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29645, 16123, 0},
     {29646, 8045, 0},
     {29647, 19544, 0},
-    {9698, 7486, 20388},
-    {9699, 7487, 21519},
-    {9700, 7488, 20322},
-    {9701, 7489, 20323},
+    {9698, 7486, 20396},
+    {9699, 7487, 21527},
+    {9700, 7488, 20329},
+    {9701, 7489, 20330},
     {29652, 8048, 0},
     {29653, 8049, 0},
     {29654, 8050, 0},
@@ -33695,11 +33695,11 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29680, 8069, 0},
     {29681, 8070, 0},
     {29682, 19560, 0},
-    {9733, 6254, 20324},
-    {9734, 6253, 20325},
+    {9733, 6254, 20331},
+    {9734, 6253, 20332},
     {29685, 8073, 0},
     {29686, 8074, 0},
-    {9737, 7490, 20326},
+    {9737, 7490, 20333},
     {29688, 8170, 0},
     {29689, 8171, 0},
     {29690, 8172, 0},
@@ -33754,9 +33754,9 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29739, 8207, 0},
     {29740, 19569, 0},
     {29741, 8208, 0},
-    {9792, 6241, 21522},
+    {9792, 6241, 21530},
     {29743, 8209, 0},
-    {9794, 6240, 21521},
+    {9794, 6240, 21529},
     {29745, 8210, 0},
     {29746, 8211, 0},
     {29747, 12308, 0},
@@ -36234,64 +36234,64 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {32219, 11654, 0},
     {32220, 11655, 0},
     {32221, 11656, 0},
-    {12272, 7673, 20452},
-    {12273, 7674, 20453},
-    {12274, 7675, 20454},
-    {12275, 7676, 20455},
-    {12276, 7677, 20456},
-    {12277, 7678, 20457},
-    {12278, 7679, 20458},
-    {12279, 7680, 20459},
-    {12280, 7681, 20460},
-    {12281, 7682, 20461},
-    {12282, 7683, 20462},
-    {12283, 7684, 20463},
+    {12272, 7673, 20461},
+    {12273, 7674, 20462},
+    {12274, 7675, 20463},
+    {12275, 7676, 20464},
+    {12276, 7677, 20465},
+    {12277, 7678, 20466},
+    {12278, 7679, 20467},
+    {12279, 7680, 20468},
+    {12280, 7681, 20469},
+    {12281, 7682, 20470},
+    {12282, 7683, 20471},
+    {12283, 7684, 20472},
     {32234, 11669, 0},
     {32235, 11670, 0},
     {32236, 11671, 0},
     {32237, 11672, 0},
     {12288, 6176, 20048},
-    {12289, 6177, 20465},
-    {12290, 6178, 20466},
-    {12291, 6183, 20467},
+    {12289, 6177, 20474},
+    {12290, 6178, 20475},
+    {12291, 6183, 20476},
     {32242, 11677, 0},
-    {12293, 6184, 20468},
-    {12294, 7637, 20469},
-    {12295, 7685, 20470},
-    {12296, 6195, 20471},
-    {12297, 6196, 20472},
-    {12298, 6197, 20473},
-    {12299, 6198, 20474},
-    {12300, 6199, 20475},
-    {12301, 6200, 20491},
-    {12302, 6201, 20492},
-    {12303, 6202, 20493},
-    {12304, 6205, 20494},
-    {12305, 6206, 20495},
-    {12306, 7492, 20496},
-    {12307, 6269, 20497},
-    {12308, 6193, 20498},
-    {12309, 6194, 20499},
-    {12310, 6203, 20500},
-    {12311, 6204, 20501},
+    {12293, 6184, 20477},
+    {12294, 7637, 20478},
+    {12295, 7685, 20479},
+    {12296, 6195, 20480},
+    {12297, 6196, 20481},
+    {12298, 6197, 20482},
+    {12299, 6198, 20483},
+    {12300, 6199, 20484},
+    {12301, 6200, 20500},
+    {12302, 6201, 20501},
+    {12303, 6202, 20502},
+    {12304, 6205, 20503},
+    {12305, 6206, 20504},
+    {12306, 7492, 20505},
+    {12307, 6269, 20506},
+    {12308, 6193, 20507},
+    {12309, 6194, 20508},
+    {12310, 6203, 20509},
+    {12311, 6204, 20510},
     {32262, 11791, 0},
     {32263, 11792, 0},
     {32264, 11793, 0},
     {32265, 11794, 0},
     {32266, 11795, 0},
-    {12317, 7493, 20502},
-    {12318, 7494, 20503},
+    {12317, 7493, 20511},
+    {12318, 7494, 20512},
     {32269, 11798, 0},
     {32270, 11799, 0},
-    {12321, 7600, 20504},
-    {12322, 7601, 20505},
-    {12323, 7602, 20506},
-    {12324, 7603, 20507},
-    {12325, 7604, 20508},
-    {12326, 7605, 20509},
-    {12327, 7606, 20510},
-    {12328, 7607, 20511},
-    {12329, 7608, 20512},
+    {12321, 7600, 20513},
+    {12322, 7601, 20514},
+    {12323, 7602, 20515},
+    {12324, 7603, 20516},
+    {12325, 7604, 20517},
+    {12326, 7605, 20518},
+    {12327, 7606, 20519},
+    {12328, 7607, 20520},
+    {12329, 7608, 20521},
     {32280, 11809, 0},
     {32281, 11810, 0},
     {32282, 11811, 0},
@@ -36312,92 +36312,92 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {32297, 11826, 0},
     {32298, 11827, 0},
     {32299, 11828, 0},
-    {12350, 7672, 20513},
+    {12350, 7672, 20522},
     {32301, 11830, 0},
     {32302, 11831, 0},
-    {12353, 6746, 20514},
-    {12354, 6747, 20515},
-    {12355, 6748, 20516},
-    {12356, 6749, 20517},
-    {12357, 6750, 20518},
-    {12358, 6751, 20519},
-    {12359, 6752, 20520},
-    {12360, 6753, 20521},
-    {12361, 6754, 20522},
-    {12362, 6755, 20523},
-    {12363, 6756, 20524},
-    {12364, 6757, 20525},
+    {12353, 6746, 20523},
+    {12354, 6747, 20524},
+    {12355, 6748, 20525},
+    {12356, 6749, 20526},
+    {12357, 6750, 20527},
+    {12358, 6751, 20528},
+    {12359, 6752, 20529},
+    {12360, 6753, 20530},
+    {12361, 6754, 20531},
+    {12362, 6755, 20532},
+    {12363, 6756, 20533},
+    {12364, 6757, 20534},
     {12365, 6758, 22583},
-    {12366, 6759, 20526},
-    {12367, 6760, 20527},
-    {12368, 6761, 20528},
-    {12369, 6762, 20529},
-    {12370, 6763, 20530},
-    {12371, 6764, 20389},
-    {12372, 6765, 20531},
-    {12373, 6766, 20532},
-    {12374, 6767, 20533},
-    {12375, 6768, 20534},
-    {12376, 6769, 20535},
+    {12366, 6759, 20535},
+    {12367, 6760, 20536},
+    {12368, 6761, 20537},
+    {12369, 6762, 20538},
+    {12370, 6763, 20539},
+    {12371, 6764, 20397},
+    {12372, 6765, 20540},
+    {12373, 6766, 20541},
+    {12374, 6767, 20542},
+    {12375, 6768, 20543},
+    {12376, 6769, 20544},
     {12377, 6770, 22290},
-    {12378, 6771, 20536},
-    {12379, 6772, 20537},
-    {12380, 6773, 20538},
-    {12381, 6774, 20539},
-    {12382, 6775, 20540},
-    {12383, 6776, 20541},
-    {12384, 6777, 20542},
-    {12385, 6778, 20543},
-    {12386, 6779, 20544},
-    {12387, 6780, 20545},
-    {12388, 6781, 20546},
-    {12389, 6782, 20547},
-    {12390, 6783, 20548},
-    {12391, 6784, 20549},
-    {12392, 6785, 20550},
-    {12393, 6786, 20551},
-    {12394, 6787, 20552},
-    {12395, 6788, 20553},
-    {12396, 6789, 20554},
-    {12397, 6790, 20555},
-    {12398, 6791, 20556},
-    {12399, 6792, 20557},
-    {12400, 6793, 20567},
-    {12401, 6794, 20568},
-    {12402, 6795, 20569},
-    {12403, 6796, 20570},
-    {12404, 6797, 20571},
-    {12405, 6798, 20572},
-    {12406, 6799, 20573},
-    {12407, 6800, 20574},
-    {12408, 6801, 20575},
-    {12409, 6802, 20576},
-    {12410, 6803, 20577},
-    {12411, 6804, 20578},
-    {12412, 6805, 20579},
-    {12413, 6806, 20580},
-    {12414, 6807, 20581},
-    {12415, 6808, 20582},
-    {12416, 6809, 20583},
-    {12417, 6810, 20584},
-    {12418, 6811, 20585},
-    {12419, 6812, 20586},
-    {12420, 6813, 20587},
-    {12421, 6814, 20588},
-    {12422, 6815, 20589},
-    {12423, 6816, 20590},
-    {12424, 6817, 20591},
-    {12425, 6818, 20592},
-    {12426, 6819, 20593},
-    {12427, 6820, 20594},
-    {12428, 6821, 20595},
-    {12429, 6822, 20596},
-    {12430, 6823, 20597},
-    {12431, 6824, 20598},
-    {12432, 6825, 20599},
-    {12433, 6826, 20600},
-    {12434, 6827, 20601},
-    {12435, 6828, 20602},
+    {12378, 6771, 20545},
+    {12379, 6772, 20546},
+    {12380, 6773, 20547},
+    {12381, 6774, 20548},
+    {12382, 6775, 20549},
+    {12383, 6776, 20550},
+    {12384, 6777, 20551},
+    {12385, 6778, 20552},
+    {12386, 6779, 20553},
+    {12387, 6780, 20554},
+    {12388, 6781, 20555},
+    {12389, 6782, 20556},
+    {12390, 6783, 20557},
+    {12391, 6784, 20558},
+    {12392, 6785, 20559},
+    {12393, 6786, 20560},
+    {12394, 6787, 20561},
+    {12395, 6788, 20562},
+    {12396, 6789, 20563},
+    {12397, 6790, 20564},
+    {12398, 6791, 20565},
+    {12399, 6792, 20566},
+    {12400, 6793, 20576},
+    {12401, 6794, 20577},
+    {12402, 6795, 20578},
+    {12403, 6796, 20579},
+    {12404, 6797, 20580},
+    {12405, 6798, 20581},
+    {12406, 6799, 20582},
+    {12407, 6800, 20583},
+    {12408, 6801, 20584},
+    {12409, 6802, 20585},
+    {12410, 6803, 20586},
+    {12411, 6804, 20587},
+    {12412, 6805, 20588},
+    {12413, 6806, 20589},
+    {12414, 6807, 20590},
+    {12415, 6808, 20591},
+    {12416, 6809, 20592},
+    {12417, 6810, 20593},
+    {12418, 6811, 20594},
+    {12419, 6812, 20595},
+    {12420, 6813, 20596},
+    {12421, 6814, 20597},
+    {12422, 6815, 20598},
+    {12423, 6816, 20599},
+    {12424, 6817, 20600},
+    {12425, 6818, 20601},
+    {12426, 6819, 20602},
+    {12427, 6820, 20603},
+    {12428, 6821, 20604},
+    {12429, 6822, 20605},
+    {12430, 6823, 20606},
+    {12431, 6824, 20607},
+    {12432, 6825, 20608},
+    {12433, 6826, 20609},
+    {12434, 6827, 20610},
+    {12435, 6828, 20611},
     {32386, 16510, 0},
     {32387, 12006, 0},
     {32388, 12007, 0},
@@ -36405,149 +36405,149 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {32390, 12009, 0},
     {32391, 12010, 0},
     {32392, 12011, 0},
-    {12443, 7633, 20603},
-    {12444, 7634, 20604},
-    {12445, 7638, 20605},
-    {12446, 7639, 20606},
+    {12443, 7633, 20612},
+    {12444, 7634, 20613},
+    {12445, 7638, 20614},
+    {12446, 7639, 20615},
     {32397, 12016, 0},
     {32398, 12017, 0},
-    {12449, 6936, 20607},
-    {12450, 6937, 20608},
-    {12451, 6938, 20609},
-    {12452, 6939, 20610},
-    {12453, 6940, 20611},
-    {12454, 6941, 20612},
-    {12455, 6942, 20613},
-    {12456, 6943, 20614},
-    {12457, 6944, 20615},
-    {12458, 6945, 20616},
-    {12459, 6946, 20617},
-    {12460, 6947, 20618},
+    {12449, 6936, 20616},
+    {12450, 6937, 20617},
+    {12451, 6938, 20618},
+    {12452, 6939, 20619},
+    {12453, 6940, 20620},
+    {12454, 6941, 20621},
+    {12455, 6942, 20622},
+    {12456, 6943, 20623},
+    {12457, 6944, 20624},
+    {12458, 6945, 20625},
+    {12459, 6946, 20626},
+    {12460, 6947, 20627},
     {12461, 6948, 22291},
-    {12462, 6949, 20619},
-    {12463, 6950, 20620},
-    {12464, 6951, 20621},
-    {12465, 6952, 21384},
-    {12466, 6953, 20482},
-    {12467, 6954, 21385},
-    {12468, 6955, 20422},
-    {12469, 6956, 21386},
-    {12470, 6957, 20791},
-    {12471, 6958, 21387},
-    {12472, 6959, 20834},
-    {12473, 6960, 20436},
-    {12474, 6961, 21388},
-    {12475, 6962, 21389},
-    {12476, 6963, 20439},
-    {12477, 6964, 20737},
-    {12478, 6965, 20779},
-    {12479, 6966, 21486},
-    {12480, 6967, 20622},
-    {12481, 6968, 20365},
-    {12482, 6969, 21487},
-    {12483, 6970, 20742},
-    {12484, 6971, 20402},
-    {12485, 6972, 20694},
-    {12486, 6973, 20623},
-    {12487, 6974, 20855},
-    {12488, 6975, 20669},
-    {12489, 6976, 20395},
-    {12490, 6977, 20848},
-    {12491, 6978, 20781},
-    {12492, 6979, 20391},
-    {12493, 6980, 20624},
-    {12494, 6981, 20625},
-    {12495, 6982, 20703},
-    {12496, 6983, 21488},
-    {12497, 6984, 20794},
-    {12498, 6985, 21489},
-    {12499, 6986, 21490},
-    {12500, 6987, 21491},
-    {12501, 6988, 20645},
-    {12502, 6989, 20856},
-    {12503, 6990, 20747},
-    {12504, 6991, 20787},
-    {12505, 6992, 20846},
-    {12506, 6993, 20850},
-    {12507, 6994, 21492},
-    {12508, 6995, 20336},
-    {12509, 6996, 21493},
-    {12510, 6997, 21494},
-    {12511, 6998, 20746},
-    {12512, 6999, 20818},
-    {12513, 7000, 20477},
-    {12514, 7001, 21495},
-    {12515, 7002, 20337},
-    {12516, 7003, 20739},
-    {12517, 7004, 20449},
-    {12518, 7005, 21496},
-    {12519, 7006, 20734},
-    {12520, 7007, 20626},
-    {12521, 7008, 21497},
-    {12522, 7009, 20430},
-    {12523, 7010, 20406},
-    {12524, 7011, 20805},
-    {12525, 7012, 21498},
-    {12526, 7013, 20670},
-    {12527, 7014, 20490},
-    {12528, 7015, 20447},
-    {12529, 7016, 20770},
-    {12530, 7017, 21499},
-    {12531, 7018, 21500},
-    {12532, 7019, 20487},
-    {12533, 7020, 20801},
-    {12534, 7021, 20627},
+    {12462, 6949, 20628},
+    {12463, 6950, 20629},
+    {12464, 6951, 20630},
+    {12465, 6952, 21392},
+    {12466, 6953, 20491},
+    {12467, 6954, 21393},
+    {12468, 6955, 20430},
+    {12469, 6956, 21394},
+    {12470, 6957, 20800},
+    {12471, 6958, 21395},
+    {12472, 6959, 20843},
+    {12473, 6960, 20445},
+    {12474, 6961, 21396},
+    {12475, 6962, 21397},
+    {12476, 6963, 20448},
+    {12477, 6964, 20746},
+    {12478, 6965, 20788},
+    {12479, 6966, 21494},
+    {12480, 6967, 20631},
+    {12481, 6968, 20372},
+    {12482, 6969, 21495},
+    {12483, 6970, 20751},
+    {12484, 6971, 20410},
+    {12485, 6972, 20703},
+    {12486, 6973, 20632},
+    {12487, 6974, 20864},
+    {12488, 6975, 20678},
+    {12489, 6976, 20403},
+    {12490, 6977, 20857},
+    {12491, 6978, 20790},
+    {12492, 6979, 20399},
+    {12493, 6980, 20633},
+    {12494, 6981, 20634},
+    {12495, 6982, 20712},
+    {12496, 6983, 21496},
+    {12497, 6984, 20803},
+    {12498, 6985, 21497},
+    {12499, 6986, 21498},
+    {12500, 6987, 21499},
+    {12501, 6988, 20654},
+    {12502, 6989, 20865},
+    {12503, 6990, 20756},
+    {12504, 6991, 20796},
+    {12505, 6992, 20855},
+    {12506, 6993, 20859},
+    {12507, 6994, 21500},
+    {12508, 6995, 20343},
+    {12509, 6996, 21501},
+    {12510, 6997, 21502},
+    {12511, 6998, 20755},
+    {12512, 6999, 20827},
+    {12513, 7000, 20486},
+    {12514, 7001, 21503},
+    {12515, 7002, 20344},
+    {12516, 7003, 20748},
+    {12517, 7004, 20458},
+    {12518, 7005, 21504},
+    {12519, 7006, 20743},
+    {12520, 7007, 20635},
+    {12521, 7008, 21505},
+    {12522, 7009, 20439},
+    {12523, 7010, 20414},
+    {12524, 7011, 20814},
+    {12525, 7012, 21506},
+    {12526, 7013, 20679},
+    {12527, 7014, 20499},
+    {12528, 7015, 20456},
+    {12529, 7016, 20779},
+    {12530, 7017, 21507},
+    {12531, 7018, 21508},
+    {12532, 7019, 20496},
+    {12533, 7020, 20810},
+    {12534, 7021, 20636},
     {32485, 14226, 0},
     {32486, 14393, 0},
     {32487, 11349, 0},
     {32488, 19491, 0},
     {32489, 11313, 0},
-    {12540, 7632, 20804},
-    {12541, 7635, 21501},
-    {12542, 7636, 20628},
+    {12540, 7632, 20813},
+    {12541, 7635, 21509},
+    {12542, 7636, 20637},
     {32493, 15193, 0},
     {32494, 19493, 0},
     {32495, 19494, 0},
     {32496, 9819, 0},
     {32497, 19495, 0},
     {32498, 19496, 0},
-    {12549, 7542, 20749},
-    {12550, 7543, 20778},
-    {12551, 7544, 20681},
-    {12552, 7545, 21503},
-    {12553, 7546, 20341},
-    {12554, 7547, 20361},
-    {12555, 7548, 20629},
-    {12556, 7549, 21504},
-    {12557, 7550, 21505},
-    {12558, 7551, 20854},
-    {12559, 7552, 20840},
-    {12560, 7553, 21506},
-    {12561, 7554, 20668},
-    {12562, 7555, 20852},
-    {12563, 7556, 21507},
-    {12564, 7557, 21508},
-    {12565, 7558, 21509},
-    {12566, 7559, 20441},
-    {12567, 7560, 20684},
-    {12568, 7561, 20634},
-    {12569, 7562, 21510},
-    {12570, 7563, 21511},
-    {12571, 7564, 20435},
-    {12572, 7565, 20630},
-    {12573, 7566, 21512},
-    {12574, 7567, 21513},
-    {12575, 7568, 21502},
-    {12576, 7569, 20381},
-    {12577, 7570, 21514},
-    {12578, 7571, 20631},
-    {12579, 7572, 21515},
-    {12580, 7573, 21516},
-    {12581, 7574, 20427},
-    {12582, 7575, 20372},
-    {12583, 7576, 20667},
-    {12584, 7577, 20343},
-    {12585, 7578, 21517},
+    {12549, 7542, 20758},
+    {12550, 7543, 20787},
+    {12551, 7544, 20690},
+    {12552, 7545, 21511},
+    {12553, 7546, 20348},
+    {12554, 7547, 20368},
+    {12555, 7548, 20638},
+    {12556, 7549, 21512},
+    {12557, 7550, 21513},
+    {12558, 7551, 20863},
+    {12559, 7552, 20849},
+    {12560, 7553, 21514},
+    {12561, 7554, 20677},
+    {12562, 7555, 20861},
+    {12563, 7556, 21515},
+    {12564, 7557, 21516},
+    {12565, 7558, 21517},
+    {12566, 7559, 20450},
+    {12567, 7560, 20693},
+    {12568, 7561, 20643},
+    {12569, 7562, 21518},
+    {12570, 7563, 21519},
+    {12571, 7564, 20444},
+    {12572, 7565, 20639},
+    {12573, 7566, 21520},
+    {12574, 7567, 21521},
+    {12575, 7568, 21510},
+    {12576, 7569, 20389},
+    {12577, 7570, 21522},
+    {12578, 7571, 20640},
+    {12579, 7572, 21523},
+    {12580, 7573, 21524},
+    {12581, 7574, 20436},
+    {12582, 7575, 20380},
+    {12583, 7576, 20676},
+    {12584, 7577, 20350},
+    {12585, 7578, 21525},
     {32536, 15886, 0},
     {32537, 19513, 0},
     {32538, 10576, 0},
@@ -36794,16 +36794,16 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {32779, 21458, 0},
     {32780, 10253, 0},
     {32781, 14158, 0},
-    {12832, 6434, 20657},
-    {12833, 6435, 20658},
-    {12834, 6436, 20695},
-    {12835, 6437, 20659},
+    {12832, 6434, 20666},
+    {12833, 6435, 20667},
+    {12834, 6436, 20704},
+    {12835, 6437, 20668},
     {12836, 6438, 22238},
-    {12837, 6439, 20660},
+    {12837, 6439, 20669},
     {12838, 6440, 22239},
-    {12839, 6441, 20407},
+    {12839, 6441, 20415},
     {12840, 6442, 22240},
-    {12841, 6443, 20419},
+    {12841, 6443, 20427},
     {32792, 15902, 0},
     {32793, 9075, 0},
     {32794, 12378, 0},
@@ -36811,7 +36811,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {32796, 21449, 0},
     {32797, 12380, 0},
     {32798, 12381, 0},
-    {12849, 7626, 20661},
+    {12849, 7626, 20670},
     {32800, 21450, 0},
     {32801, 12383, 0},
     {32802, 21451, 0},
@@ -36925,7 +36925,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {32910, 12547, 0},
     {32911, 12548, 0},
     {32912, 12549, 0},
-    {12963, 7609, 20674},
+    {12963, 7609, 20683},
     {32914, 12551, 0},
     {32915, 20268, 0},
     {32916, 12552, 0},
@@ -37160,8 +37160,8 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {33145, 10570, 0},
     {33146, 14972, 0},
     {33147, 12894, 0},
-    {13198, 7610, 21609},
-    {13199, 7611, 21610},
+    {13198, 7610, 21617},
+    {13199, 7611, 21618},
     {33150, 14403, 0},
     {33151, 14575, 0},
     {33152, 9107, 0},
@@ -37174,12 +37174,12 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {33159, 12771, 0},
     {33160, 20320, 0},
     {33161, 12772, 0},
-    {13212, 7612, 20347},
-    {13213, 7613, 20687},
-    {13214, 7614, 20688},
+    {13212, 7612, 20354},
+    {13213, 7613, 20696},
+    {13214, 7614, 20697},
     {33165, 12775, 0},
     {33166, 12776, 0},
-    {13217, 7615, 20403},
+    {13217, 7615, 20411},
     {33168, 12777, 0},
     {33169, 20322, 0},
     {33170, 12778, 0},
@@ -37214,7 +37214,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {33199, 12799, 0},
     {33200, 12800, 0},
     {33201, 12801, 0},
-    {13252, 7616, 20689},
+    {13252, 7616, 20698},
     {33203, 13812, 0},
     {33204, 12803, 0},
     {33205, 12804, 0},
@@ -37224,14 +37224,14 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {33209, 12808, 0},
     {33210, 18588, 0},
     {33211, 20329, 0},
-    {13262, 7617, 20690},
+    {13262, 7617, 20699},
     {33213, 12810, 0},
     {33214, 12811, 0},
-    {13265, 7618, 20691},
-    {13266, 7619, 20772},
+    {13265, 7618, 20700},
+    {13266, 7619, 20781},
     {33217, 20426, 0},
     {33218, 9274, 0},
-    {13269, 7620, 20823},
+    {13269, 7620, 20832},
     {33220, 12813, 0},
     {33221, 12814, 0},
     {33222, 15545, 0},
@@ -41406,570 +41406,570 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {37391, 18471, 0},
     {37392, 18472, 0},
     {37393, 18473, 0},
-    {57344, 7886, 20905},
-    {57345, 7887, 20906},
-    {57346, 7888, 20907},
-    {57347, 7889, 20908},
-    {57348, 7890, 20909},
-    {57349, 7891, 20910},
-    {57350, 7892, 20911},
-    {57351, 7893, 20912},
-    {57352, 7894, 20913},
-    {57353, 7895, 20914},
-    {57354, 7896, 20915},
-    {57355, 7897, 20916},
-    {57356, 7898, 20917},
-    {57357, 7899, 20918},
-    {57358, 7900, 20919},
-    {57359, 7901, 20920},
-    {57360, 7902, 20921},
-    {57361, 7903, 20922},
-    {57362, 7904, 20923},
-    {57363, 7905, 20924},
-    {57364, 7906, 20925},
-    {57365, 7907, 20926},
-    {57366, 7908, 20927},
-    {57367, 7909, 20928},
-    {57368, 7910, 20929},
-    {57369, 7911, 20930},
-    {57370, 7912, 20931},
-    {57371, 7913, 20932},
-    {57372, 7914, 20933},
-    {57373, 7915, 20934},
-    {57374, 7916, 20935},
-    {57375, 7917, 20936},
-    {57376, 7918, 20937},
-    {57377, 7919, 20938},
-    {57378, 7920, 20939},
-    {57379, 7921, 20940},
-    {57380, 7922, 20941},
-    {57381, 7923, 20942},
-    {57382, 7924, 20943},
-    {57383, 7925, 20944},
-    {57384, 7926, 20945},
-    {57385, 7927, 20946},
-    {57386, 7928, 20947},
-    {57387, 7929, 20948},
-    {57388, 7930, 20949},
-    {57389, 7931, 20950},
-    {57390, 7932, 20951},
-    {57391, 7933, 20952},
-    {57392, 7934, 20953},
-    {57393, 7935, 20954},
-    {57394, 7936, 20955},
-    {57395, 7937, 20956},
-    {57396, 7938, 20997},
-    {57397, 7939, 20998},
-    {57398, 7940, 20999},
-    {57399, 7941, 21000},
-    {57400, 7942, 21001},
-    {57401, 7943, 21002},
-    {57402, 7944, 21003},
-    {57403, 7945, 21004},
-    {57404, 7946, 21005},
-    {57405, 7947, 21006},
-    {57406, 7948, 21007},
-    {57407, 7949, 21008},
-    {57408, 7950, 21009},
-    {57409, 7951, 21010},
-    {57410, 7952, 21011},
-    {57411, 7953, 21012},
-    {57412, 7954, 21013},
-    {57413, 7955, 21014},
-    {57414, 7956, 21015},
-    {57415, 7957, 21016},
-    {57416, 7958, 21017},
-    {57417, 7959, 21018},
-    {57418, 7960, 21019},
-    {57419, 7961, 21020},
-    {57420, 7962, 21021},
-    {57421, 7963, 21022},
-    {57422, 7964, 21023},
-    {57423, 7965, 21024},
-    {57424, 7966, 21025},
-    {57425, 7967, 21026},
-    {57426, 7968, 21027},
-    {57427, 7969, 21028},
-    {57428, 7970, 21029},
-    {57429, 7971, 21030},
-    {57430, 7972, 21031},
-    {57431, 7973, 21032},
-    {57432, 7974, 21033},
-    {57433, 7975, 21034},
-    {57434, 7976, 21035},
-    {57435, 7977, 21036},
-    {57436, 7978, 21037},
-    {57437, 7979, 21038},
-    {57438, 8076, 21039},
-    {57439, 8077, 21040},
-    {57440, 8078, 21041},
-    {57441, 8079, 21042},
-    {57442, 8080, 20443},
-    {57443, 8081, 21043},
-    {57444, 8082, 21044},
-    {57445, 8083, 21045},
-    {57446, 8084, 21046},
-    {57447, 8085, 21047},
-    {57448, 8086, 21048},
-    {57449, 8087, 21049},
-    {57450, 8088, 21050},
-    {57451, 8089, 21051},
-    {57452, 8090, 21052},
-    {57453, 8091, 21053},
-    {57454, 8092, 21054},
-    {57455, 8093, 21055},
-    {57456, 8094, 21056},
-    {57457, 8095, 21057},
-    {57458, 8096, 21058},
-    {57459, 8097, 21059},
-    {57460, 8098, 21060},
-    {57461, 8099, 21061},
-    {57462, 8100, 21062},
-    {57463, 8101, 21063},
-    {57464, 8102, 21064},
-    {57465, 8103, 21065},
-    {57466, 8104, 21066},
-    {57467, 8105, 21067},
+    {57344, 7886, 20913},
+    {57345, 7887, 20914},
+    {57346, 7888, 20915},
+    {57347, 7889, 20916},
+    {57348, 7890, 20917},
+    {57349, 7891, 20918},
+    {57350, 7892, 20919},
+    {57351, 7893, 20920},
+    {57352, 7894, 20921},
+    {57353, 7895, 20922},
+    {57354, 7896, 20923},
+    {57355, 7897, 20924},
+    {57356, 7898, 20925},
+    {57357, 7899, 20926},
+    {57358, 7900, 20927},
+    {57359, 7901, 20928},
+    {57360, 7902, 20929},
+    {57361, 7903, 20930},
+    {57362, 7904, 20931},
+    {57363, 7905, 20932},
+    {57364, 7906, 20933},
+    {57365, 7907, 20934},
+    {57366, 7908, 20935},
+    {57367, 7909, 20936},
+    {57368, 7910, 20937},
+    {57369, 7911, 20938},
+    {57370, 7912, 20939},
+    {57371, 7913, 20940},
+    {57372, 7914, 20941},
+    {57373, 7915, 20942},
+    {57374, 7916, 20943},
+    {57375, 7917, 20944},
+    {57376, 7918, 20945},
+    {57377, 7919, 20946},
+    {57378, 7920, 20947},
+    {57379, 7921, 20948},
+    {57380, 7922, 20949},
+    {57381, 7923, 20950},
+    {57382, 7924, 20951},
+    {57383, 7925, 20952},
+    {57384, 7926, 20953},
+    {57385, 7927, 20954},
+    {57386, 7928, 20955},
+    {57387, 7929, 20956},
+    {57388, 7930, 20957},
+    {57389, 7931, 20958},
+    {57390, 7932, 20959},
+    {57391, 7933, 20960},
+    {57392, 7934, 20961},
+    {57393, 7935, 20962},
+    {57394, 7936, 20963},
+    {57395, 7937, 20964},
+    {57396, 7938, 21005},
+    {57397, 7939, 21006},
+    {57398, 7940, 21007},
+    {57399, 7941, 21008},
+    {57400, 7942, 21009},
+    {57401, 7943, 21010},
+    {57402, 7944, 21011},
+    {57403, 7945, 21012},
+    {57404, 7946, 21013},
+    {57405, 7947, 21014},
+    {57406, 7948, 21015},
+    {57407, 7949, 21016},
+    {57408, 7950, 21017},
+    {57409, 7951, 21018},
+    {57410, 7952, 21019},
+    {57411, 7953, 21020},
+    {57412, 7954, 21021},
+    {57413, 7955, 21022},
+    {57414, 7956, 21023},
+    {57415, 7957, 21024},
+    {57416, 7958, 21025},
+    {57417, 7959, 21026},
+    {57418, 7960, 21027},
+    {57419, 7961, 21028},
+    {57420, 7962, 21029},
+    {57421, 7963, 21030},
+    {57422, 7964, 21031},
+    {57423, 7965, 21032},
+    {57424, 7966, 21033},
+    {57425, 7967, 21034},
+    {57426, 7968, 21035},
+    {57427, 7969, 21036},
+    {57428, 7970, 21037},
+    {57429, 7971, 21038},
+    {57430, 7972, 21039},
+    {57431, 7973, 21040},
+    {57432, 7974, 21041},
+    {57433, 7975, 21042},
+    {57434, 7976, 21043},
+    {57435, 7977, 21044},
+    {57436, 7978, 21045},
+    {57437, 7979, 21046},
+    {57438, 8076, 21047},
+    {57439, 8077, 21048},
+    {57440, 8078, 21049},
+    {57441, 8079, 21050},
+    {57442, 8080, 20452},
+    {57443, 8081, 21051},
+    {57444, 8082, 21052},
+    {57445, 8083, 21053},
+    {57446, 8084, 21054},
+    {57447, 8085, 21055},
+    {57448, 8086, 21056},
+    {57449, 8087, 21057},
+    {57450, 8088, 21058},
+    {57451, 8089, 21059},
+    {57452, 8090, 21060},
+    {57453, 8091, 21061},
+    {57454, 8092, 21062},
+    {57455, 8093, 21063},
+    {57456, 8094, 21064},
+    {57457, 8095, 21065},
+    {57458, 8096, 21066},
+    {57459, 8097, 21067},
+    {57460, 8098, 21068},
+    {57461, 8099, 21069},
+    {57462, 8100, 21070},
+    {57463, 8101, 21071},
+    {57464, 8102, 21072},
+    {57465, 8103, 21073},
+    {57466, 8104, 21074},
+    {57467, 8105, 21075},
     {57468, 8106, 22399},
-    {57469, 8107, 21068},
-    {57470, 8108, 21069},
-    {57471, 8109, 21070},
-    {57472, 8110, 21071},
-    {57473, 8111, 21072},
-    {57474, 8112, 21073},
-    {57475, 8113, 21074},
-    {57476, 8114, 21075},
-    {57477, 8115, 21076},
-    {57478, 8116, 21077},
-    {57479, 8117, 21078},
-    {57480, 8118, 21079},
-    {57481, 8119, 21080},
-    {57482, 8120, 21081},
-    {57483, 8121, 21082},
-    {57484, 8122, 21083},
-    {57485, 8123, 21084},
-    {57486, 8124, 21085},
-    {57487, 8125, 21086},
-    {57488, 8126, 21087},
-    {57489, 8127, 21088},
-    {57490, 8128, 21089},
-    {57491, 8129, 21090},
-    {57492, 8130, 21091},
-    {57493, 8131, 21092},
-    {57494, 8132, 21093},
-    {57495, 8133, 21094},
-    {57496, 8134, 21095},
-    {57497, 8135, 21096},
-    {57498, 8136, 21097},
-    {57499, 8137, 21098},
+    {57469, 8107, 21076},
+    {57470, 8108, 21077},
+    {57471, 8109, 21078},
+    {57472, 8110, 21079},
+    {57473, 8111, 21080},
+    {57474, 8112, 21081},
+    {57475, 8113, 21082},
+    {57476, 8114, 21083},
+    {57477, 8115, 21084},
+    {57478, 8116, 21085},
+    {57479, 8117, 21086},
+    {57480, 8118, 21087},
+    {57481, 8119, 21088},
+    {57482, 8120, 21089},
+    {57483, 8121, 21090},
+    {57484, 8122, 21091},
+    {57485, 8123, 21092},
+    {57486, 8124, 21093},
+    {57487, 8125, 21094},
+    {57488, 8126, 21095},
+    {57489, 8127, 21096},
+    {57490, 8128, 21097},
+    {57491, 8129, 21098},
+    {57492, 8130, 21099},
+    {57493, 8131, 21100},
+    {57494, 8132, 21101},
+    {57495, 8133, 21102},
+    {57496, 8134, 21103},
+    {57497, 8135, 21104},
+    {57498, 8136, 21105},
+    {57499, 8137, 21106},
     {57500, 8138, 22400},
-    {57501, 8139, 21099},
-    {57502, 8140, 21100},
-    {57503, 8141, 21101},
-    {57504, 8142, 21102},
-    {57505, 8143, 21103},
-    {57506, 8144, 21104},
-    {57507, 8145, 21105},
-    {57508, 8146, 21106},
-    {57509, 8147, 21107},
-    {57510, 8148, 21108},
-    {57511, 8149, 21109},
-    {57512, 8150, 21110},
-    {57513, 8151, 21111},
-    {57514, 8152, 21112},
-    {57515, 8153, 21113},
-    {57516, 8154, 21114},
-    {57517, 8155, 21115},
-    {57518, 8156, 21116},
-    {57519, 8157, 21117},
-    {57520, 8158, 21118},
-    {57521, 8159, 21119},
-    {57522, 8160, 21120},
-    {57523, 8161, 21121},
-    {57524, 8162, 21122},
-    {57525, 8163, 21123},
+    {57501, 8139, 21107},
+    {57502, 8140, 21108},
+    {57503, 8141, 21109},
+    {57504, 8142, 21110},
+    {57505, 8143, 21111},
+    {57506, 8144, 21112},
+    {57507, 8145, 21113},
+    {57508, 8146, 21114},
+    {57509, 8147, 21115},
+    {57510, 8148, 21116},
+    {57511, 8149, 21117},
+    {57512, 8150, 21118},
+    {57513, 8151, 21119},
+    {57514, 8152, 21120},
+    {57515, 8153, 21121},
+    {57516, 8154, 21122},
+    {57517, 8155, 21123},
+    {57518, 8156, 21124},
+    {57519, 8157, 21125},
+    {57520, 8158, 21126},
+    {57521, 8159, 21127},
+    {57522, 8160, 21128},
+    {57523, 8161, 21129},
+    {57524, 8162, 21130},
+    {57525, 8163, 21131},
     {57526, 8164, 22401},
-    {57527, 8165, 21124},
-    {57528, 8166, 21125},
-    {57529, 8167, 21126},
-    {57530, 8168, 21127},
-    {57531, 8169, 21128},
-    {57532, 8266, 21129},
-    {57533, 8267, 21130},
-    {57534, 8268, 21131},
-    {57535, 8269, 21132},
-    {57536, 8270, 21133},
-    {57537, 8271, 21134},
-    {57538, 8272, 21135},
-    {57539, 8273, 21136},
-    {57540, 8274, 21137},
-    {57541, 8275, 21138},
-    {57542, 8276, 21139},
-    {57543, 8277, 21140},
-    {57544, 8278, 21141},
-    {57545, 8279, 21142},
-    {57546, 8280, 21143},
-    {57547, 8281, 21144},
-    {57548, 8282, 21145},
-    {57549, 8283, 21146},
-    {57550, 8284, 21147},
-    {57551, 8285, 21148},
-    {57552, 8286, 21149},
-    {57553, 8287, 21150},
-    {57554, 8288, 21151},
-    {57555, 8289, 21152},
-    {57556, 8290, 21153},
-    {57557, 8291, 21154},
-    {57558, 8292, 21155},
-    {57559, 8293, 21156},
-    {57560, 8294, 21157},
-    {57561, 8295, 21158},
-    {57562, 8296, 21159},
-    {57563, 8297, 21160},
-    {57564, 8298, 21161},
-    {57565, 8299, 21162},
-    {57566, 8300, 21163},
-    {57567, 8301, 21164},
-    {57568, 8302, 21165},
-    {57569, 8303, 21166},
-    {57570, 8304, 21167},
-    {57571, 8305, 21168},
-    {57572, 8306, 21169},
-    {57573, 8307, 21170},
-    {57574, 8308, 21171},
-    {57575, 8309, 21172},
-    {57576, 8310, 21173},
-    {57577, 8311, 21174},
-    {57578, 8312, 21175},
-    {57579, 8313, 21176},
-    {57580, 8314, 21177},
-    {57581, 8315, 21178},
-    {57582, 8316, 21179},
-    {57583, 8317, 21180},
-    {57584, 8318, 21181},
-    {57585, 8319, 21182},
-    {57586, 8320, 21183},
-    {57587, 8321, 21184},
-    {57588, 8322, 21185},
-    {57589, 8323, 21186},
-    {57590, 8324, 21187},
-    {57591, 8325, 21188},
-    {57592, 8326, 21190},
-    {57593, 8327, 21191},
-    {57594, 8328, 21192},
-    {57595, 8329, 21193},
-    {57596, 8330, 21194},
-    {57597, 8331, 21195},
-    {57598, 8332, 21196},
-    {57599, 8333, 21197},
-    {57600, 8334, 21198},
-    {57601, 8335, 21199},
-    {57602, 8336, 21200},
-    {57603, 8337, 21201},
-    {57604, 8338, 21202},
-    {57605, 8339, 21203},
-    {57606, 8340, 21204},
-    {57607, 8341, 21205},
-    {57608, 8342, 21206},
-    {57609, 8343, 21207},
-    {57610, 8344, 21208},
-    {57611, 8345, 21209},
-    {57612, 8346, 21210},
-    {57613, 8347, 21211},
-    {57614, 8348, 21212},
-    {57615, 8349, 21213},
-    {57616, 8350, 21214},
-    {57617, 8351, 21215},
-    {57618, 8352, 21216},
-    {57619, 8353, 21217},
-    {57620, 8354, 21218},
-    {57621, 8355, 21219},
-    {57622, 8356, 21220},
-    {57623, 8357, 21221},
-    {57624, 8358, 21222},
-    {57625, 8359, 21223},
-    {57626, 8456, 21224},
-    {57627, 8457, 21225},
-    {57628, 8458, 21226},
-    {57629, 8459, 21227},
-    {57630, 8460, 21228},
-    {57631, 8461, 21229},
-    {57632, 8462, 21230},
-    {57633, 8463, 21231},
-    {57634, 8464, 21232},
-    {57635, 8465, 21233},
-    {57636, 8466, 21234},
-    {57637, 8467, 21235},
-    {57638, 8468, 21236},
-    {57639, 8469, 21237},
-    {57640, 8470, 21238},
-    {57641, 8471, 21239},
-    {57642, 8472, 21240},
-    {57643, 8473, 21241},
+    {57527, 8165, 21132},
+    {57528, 8166, 21133},
+    {57529, 8167, 21134},
+    {57530, 8168, 21135},
+    {57531, 8169, 21136},
+    {57532, 8266, 21137},
+    {57533, 8267, 21138},
+    {57534, 8268, 21139},
+    {57535, 8269, 21140},
+    {57536, 8270, 21141},
+    {57537, 8271, 21142},
+    {57538, 8272, 21143},
+    {57539, 8273, 21144},
+    {57540, 8274, 21145},
+    {57541, 8275, 21146},
+    {57542, 8276, 21147},
+    {57543, 8277, 21148},
+    {57544, 8278, 21149},
+    {57545, 8279, 21150},
+    {57546, 8280, 21151},
+    {57547, 8281, 21152},
+    {57548, 8282, 21153},
+    {57549, 8283, 21154},
+    {57550, 8284, 21155},
+    {57551, 8285, 21156},
+    {57552, 8286, 21157},
+    {57553, 8287, 21158},
+    {57554, 8288, 21159},
+    {57555, 8289, 21160},
+    {57556, 8290, 21161},
+    {57557, 8291, 21162},
+    {57558, 8292, 21163},
+    {57559, 8293, 21164},
+    {57560, 8294, 21165},
+    {57561, 8295, 21166},
+    {57562, 8296, 21167},
+    {57563, 8297, 21168},
+    {57564, 8298, 21169},
+    {57565, 8299, 21170},
+    {57566, 8300, 21171},
+    {57567, 8301, 21172},
+    {57568, 8302, 21173},
+    {57569, 8303, 21174},
+    {57570, 8304, 21175},
+    {57571, 8305, 21176},
+    {57572, 8306, 21177},
+    {57573, 8307, 21178},
+    {57574, 8308, 21179},
+    {57575, 8309, 21180},
+    {57576, 8310, 21181},
+    {57577, 8311, 21182},
+    {57578, 8312, 21183},
+    {57579, 8313, 21184},
+    {57580, 8314, 21185},
+    {57581, 8315, 21186},
+    {57582, 8316, 21187},
+    {57583, 8317, 21188},
+    {57584, 8318, 21189},
+    {57585, 8319, 21190},
+    {57586, 8320, 21191},
+    {57587, 8321, 21192},
+    {57588, 8322, 21193},
+    {57589, 8323, 21194},
+    {57590, 8324, 21195},
+    {57591, 8325, 21196},
+    {57592, 8326, 21198},
+    {57593, 8327, 21199},
+    {57594, 8328, 21200},
+    {57595, 8329, 21201},
+    {57596, 8330, 21202},
+    {57597, 8331, 21203},
+    {57598, 8332, 21204},
+    {57599, 8333, 21205},
+    {57600, 8334, 21206},
+    {57601, 8335, 21207},
+    {57602, 8336, 21208},
+    {57603, 8337, 21209},
+    {57604, 8338, 21210},
+    {57605, 8339, 21211},
+    {57606, 8340, 21212},
+    {57607, 8341, 21213},
+    {57608, 8342, 21214},
+    {57609, 8343, 21215},
+    {57610, 8344, 21216},
+    {57611, 8345, 21217},
+    {57612, 8346, 21218},
+    {57613, 8347, 21219},
+    {57614, 8348, 21220},
+    {57615, 8349, 21221},
+    {57616, 8350, 21222},
+    {57617, 8351, 21223},
+    {57618, 8352, 21224},
+    {57619, 8353, 21225},
+    {57620, 8354, 21226},
+    {57621, 8355, 21227},
+    {57622, 8356, 21228},
+    {57623, 8357, 21229},
+    {57624, 8358, 21230},
+    {57625, 8359, 21231},
+    {57626, 8456, 21232},
+    {57627, 8457, 21233},
+    {57628, 8458, 21234},
+    {57629, 8459, 21235},
+    {57630, 8460, 21236},
+    {57631, 8461, 21237},
+    {57632, 8462, 21238},
+    {57633, 8463, 21239},
+    {57634, 8464, 21240},
+    {57635, 8465, 21241},
+    {57636, 8466, 21242},
+    {57637, 8467, 21243},
+    {57638, 8468, 21244},
+    {57639, 8469, 21245},
+    {57640, 8470, 21246},
+    {57641, 8471, 21247},
+    {57642, 8472, 21248},
+    {57643, 8473, 21249},
     {57644, 8474, 22402},
-    {57645, 8475, 21242},
-    {57646, 8476, 21243},
-    {57647, 8477, 21244},
-    {57648, 8478, 21245},
-    {57649, 8479, 21246},
-    {57650, 8480, 21247},
-    {57651, 8481, 21248},
-    {57652, 8482, 21249},
-    {57653, 8483, 21250},
-    {57654, 8484, 21251},
-    {57655, 8485, 21252},
-    {57656, 8486, 21253},
-    {57657, 8487, 21254},
-    {57658, 8488, 21255},
-    {57659, 8489, 21256},
-    {57660, 8490, 21257},
-    {57661, 8491, 21258},
-    {57662, 8492, 21259},
-    {57663, 8493, 21260},
-    {57664, 8494, 21261},
-    {57665, 8495, 21262},
-    {57666, 8496, 21263},
-    {57667, 8497, 21264},
-    {57668, 8498, 21265},
-    {57669, 8499, 21266},
-    {57670, 8500, 21267},
-    {57671, 8501, 21268},
-    {57672, 8502, 21269},
-    {57673, 8503, 21270},
-    {57674, 8504, 21271},
-    {57675, 8505, 21272},
-    {57676, 8506, 21273},
-    {57677, 8507, 21274},
-    {57678, 8508, 21275},
-    {57679, 8509, 21276},
-    {57680, 8510, 21277},
-    {57681, 8511, 21278},
-    {57682, 8512, 21279},
-    {57683, 8513, 21280},
-    {57684, 8514, 21281},
-    {57685, 8515, 21282},
-    {57686, 8516, 21283},
-    {57687, 8517, 21284},
+    {57645, 8475, 21250},
+    {57646, 8476, 21251},
+    {57647, 8477, 21252},
+    {57648, 8478, 21253},
+    {57649, 8479, 21254},
+    {57650, 8480, 21255},
+    {57651, 8481, 21256},
+    {57652, 8482, 21257},
+    {57653, 8483, 21258},
+    {57654, 8484, 21259},
+    {57655, 8485, 21260},
+    {57656, 8486, 21261},
+    {57657, 8487, 21262},
+    {57658, 8488, 21263},
+    {57659, 8489, 21264},
+    {57660, 8490, 21265},
+    {57661, 8491, 21266},
+    {57662, 8492, 21267},
+    {57663, 8493, 21268},
+    {57664, 8494, 21269},
+    {57665, 8495, 21270},
+    {57666, 8496, 21271},
+    {57667, 8497, 21272},
+    {57668, 8498, 21273},
+    {57669, 8499, 21274},
+    {57670, 8500, 21275},
+    {57671, 8501, 21276},
+    {57672, 8502, 21277},
+    {57673, 8503, 21278},
+    {57674, 8504, 21279},
+    {57675, 8505, 21280},
+    {57676, 8506, 21281},
+    {57677, 8507, 21282},
+    {57678, 8508, 21283},
+    {57679, 8509, 21284},
+    {57680, 8510, 21285},
+    {57681, 8511, 21286},
+    {57682, 8512, 21287},
+    {57683, 8513, 21288},
+    {57684, 8514, 21289},
+    {57685, 8515, 21290},
+    {57686, 8516, 21291},
+    {57687, 8517, 21292},
     {57688, 8518, 22403},
-    {57689, 8519, 21285},
-    {57690, 8520, 21288},
-    {57691, 8521, 21289},
-    {57692, 8522, 21290},
-    {57693, 8523, 21291},
-    {57694, 8524, 21292},
-    {57695, 8525, 21293},
-    {57696, 8526, 21294},
-    {57697, 8527, 21295},
-    {57698, 8528, 21296},
-    {57699, 8529, 21297},
-    {57700, 8530, 21298},
-    {57701, 8531, 21299},
-    {57702, 8532, 21300},
-    {57703, 8533, 21301},
-    {57704, 8534, 21302},
-    {57705, 8535, 21303},
-    {57706, 8536, 21304},
-    {57707, 8537, 21305},
-    {57708, 8538, 21306},
-    {57709, 8539, 21307},
-    {57710, 8540, 21308},
-    {57711, 8541, 21309},
-    {57712, 8542, 21310},
-    {57713, 8543, 21311},
-    {57714, 8544, 21312},
-    {57715, 8545, 21313},
-    {57716, 8546, 21314},
-    {57717, 8547, 21315},
-    {57718, 8548, 21316},
-    {57719, 8549, 21317},
-    {57720, 8646, 21318},
-    {57721, 8647, 21319},
-    {57722, 8648, 21320},
-    {57723, 8649, 21321},
-    {57724, 8650, 21322},
+    {57689, 8519, 21293},
+    {57690, 8520, 21296},
+    {57691, 8521, 21297},
+    {57692, 8522, 21298},
+    {57693, 8523, 21299},
+    {57694, 8524, 21300},
+    {57695, 8525, 21301},
+    {57696, 8526, 21302},
+    {57697, 8527, 21303},
+    {57698, 8528, 21304},
+    {57699, 8529, 21305},
+    {57700, 8530, 21306},
+    {57701, 8531, 21307},
+    {57702, 8532, 21308},
+    {57703, 8533, 21309},
+    {57704, 8534, 21310},
+    {57705, 8535, 21311},
+    {57706, 8536, 21312},
+    {57707, 8537, 21313},
+    {57708, 8538, 21314},
+    {57709, 8539, 21315},
+    {57710, 8540, 21316},
+    {57711, 8541, 21317},
+    {57712, 8542, 21318},
+    {57713, 8543, 21319},
+    {57714, 8544, 21320},
+    {57715, 8545, 21321},
+    {57716, 8546, 21322},
+    {57717, 8547, 21323},
+    {57718, 8548, 21324},
+    {57719, 8549, 21325},
+    {57720, 8646, 21326},
+    {57721, 8647, 21327},
+    {57722, 8648, 21328},
+    {57723, 8649, 21329},
+    {57724, 8650, 21330},
     {57725, 8651, 22405},
-    {57726, 8652, 21323},
-    {57727, 8653, 21324},
-    {57728, 8654, 21325},
-    {57729, 8655, 21326},
-    {57730, 8656, 21327},
-    {57731, 8657, 21328},
-    {57732, 8658, 21329},
-    {57733, 8659, 21330},
-    {57734, 8660, 21331},
-    {57735, 8661, 21332},
-    {57736, 8662, 21333},
-    {57737, 8663, 21334},
-    {57738, 8664, 21335},
-    {57739, 8665, 21336},
-    {57740, 8666, 21337},
-    {57741, 8667, 21338},
-    {57742, 8668, 21339},
-    {57743, 8669, 21340},
-    {57744, 8670, 21341},
-    {57745, 8671, 21342},
-    {57746, 8672, 21343},
-    {57747, 8673, 21344},
-    {57748, 8674, 21345},
-    {57749, 8675, 21346},
-    {57750, 8676, 21347},
-    {57751, 8677, 21348},
-    {57752, 8678, 21349},
-    {57753, 8679, 21350},
-    {57754, 8680, 21351},
-    {57755, 8681, 21352},
-    {57756, 8682, 21353},
-    {57757, 8683, 21354},
-    {57758, 8684, 21355},
-    {57759, 8685, 21356},
-    {57760, 8686, 21357},
-    {57761, 8687, 21358},
-    {57762, 8688, 21359},
-    {57763, 8689, 21360},
-    {57764, 8690, 21361},
-    {57765, 8691, 21362},
-    {57766, 8692, 21363},
-    {57767, 8693, 21364},
-    {57768, 8694, 21365},
-    {57769, 8695, 21366},
-    {57770, 8696, 21367},
-    {57771, 8697, 21368},
-    {57772, 8698, 21369},
-    {57773, 8699, 21370},
-    {57774, 8700, 21371},
-    {57775, 8701, 21372},
-    {57776, 8702, 21373},
-    {57777, 8703, 21374},
-    {57778, 8704, 21375},
-    {57779, 8705, 21376},
-    {57780, 8706, 21377},
-    {57781, 8707, 21378},
-    {57782, 8708, 21379},
-    {57783, 8709, 21380},
+    {57726, 8652, 21331},
+    {57727, 8653, 21332},
+    {57728, 8654, 21333},
+    {57729, 8655, 21334},
+    {57730, 8656, 21335},
+    {57731, 8657, 21336},
+    {57732, 8658, 21337},
+    {57733, 8659, 21338},
+    {57734, 8660, 21339},
+    {57735, 8661, 21340},
+    {57736, 8662, 21341},
+    {57737, 8663, 21342},
+    {57738, 8664, 21343},
+    {57739, 8665, 21344},
+    {57740, 8666, 21345},
+    {57741, 8667, 21346},
+    {57742, 8668, 21347},
+    {57743, 8669, 21348},
+    {57744, 8670, 21349},
+    {57745, 8671, 21350},
+    {57746, 8672, 21351},
+    {57747, 8673, 21352},
+    {57748, 8674, 21353},
+    {57749, 8675, 21354},
+    {57750, 8676, 21355},
+    {57751, 8677, 21356},
+    {57752, 8678, 21357},
+    {57753, 8679, 21358},
+    {57754, 8680, 21359},
+    {57755, 8681, 21360},
+    {57756, 8682, 21361},
+    {57757, 8683, 21362},
+    {57758, 8684, 21363},
+    {57759, 8685, 21364},
+    {57760, 8686, 21365},
+    {57761, 8687, 21366},
+    {57762, 8688, 21367},
+    {57763, 8689, 21368},
+    {57764, 8690, 21369},
+    {57765, 8691, 21370},
+    {57766, 8692, 21371},
+    {57767, 8693, 21372},
+    {57768, 8694, 21373},
+    {57769, 8695, 21374},
+    {57770, 8696, 21375},
+    {57771, 8697, 21376},
+    {57772, 8698, 21377},
+    {57773, 8699, 21378},
+    {57774, 8700, 21379},
+    {57775, 8701, 21380},
+    {57776, 8702, 21381},
+    {57777, 8703, 21382},
+    {57778, 8704, 21383},
+    {57779, 8705, 21384},
+    {57780, 8706, 21385},
+    {57781, 8707, 21386},
+    {57782, 8708, 21387},
+    {57783, 8709, 21388},
     {57784, 8710, 22404},
-    {57785, 8711, 21381},
-    {57786, 8712, 21382},
-    {57787, 8713, 21383},
-    {57788, 8714, 21390},
-    {57789, 8715, 21391},
-    {57790, 8716, 21392},
-    {57791, 8717, 21393},
-    {57792, 8718, 21394},
-    {57793, 8719, 21395},
-    {57794, 8720, 21396},
-    {57795, 8721, 21397},
+    {57785, 8711, 21389},
+    {57786, 8712, 21390},
+    {57787, 8713, 21391},
+    {57788, 8714, 21398},
+    {57789, 8715, 21399},
+    {57790, 8716, 21400},
+    {57791, 8717, 21401},
+    {57792, 8718, 21402},
+    {57793, 8719, 21403},
+    {57794, 8720, 21404},
+    {57795, 8721, 21405},
     {57796, 8722, 22589},
-    {57797, 8723, 21398},
-    {57798, 8724, 21399},
-    {57799, 8725, 21400},
-    {57800, 8726, 21401},
-    {57801, 8727, 21402},
-    {57802, 8728, 21403},
-    {57803, 8729, 21404},
-    {57804, 8730, 21405},
-    {57805, 8731, 21406},
-    {57806, 8732, 21407},
-    {57807, 8733, 21408},
-    {57808, 8734, 21409},
-    {57809, 8735, 21410},
-    {57810, 8736, 21411},
-    {57811, 8737, 21412},
-    {57812, 8738, 21413},
-    {57813, 8739, 21414},
-    {57814, 8836, 21415},
-    {57815, 8837, 21416},
-    {57816, 8838, 21417},
-    {57817, 8839, 21418},
-    {57818, 8840, 21419},
-    {57819, 8841, 21420},
-    {57820, 8842, 21421},
-    {57821, 8843, 21422},
-    {57822, 8844, 21423},
-    {57823, 8845, 21424},
-    {57824, 8846, 21425},
-    {57825, 8847, 21426},
-    {57826, 8848, 21427},
-    {57827, 8849, 21428},
-    {57828, 8850, 21429},
-    {57829, 8851, 21430},
-    {57830, 8852, 21431},
-    {57831, 8853, 21432},
-    {57832, 8854, 21433},
-    {57833, 8855, 21434},
-    {57834, 8856, 21435},
-    {57835, 8857, 21436},
-    {57836, 8858, 21437},
-    {57837, 8859, 21438},
-    {57838, 8860, 21439},
-    {57839, 8861, 21440},
-    {57840, 8862, 21441},
-    {57841, 8863, 21442},
-    {57842, 8864, 21443},
-    {57843, 8865, 21444},
-    {57844, 8866, 21445},
-    {57845, 8867, 21446},
-    {57846, 8868, 21447},
-    {57847, 8869, 21448},
-    {57848, 8870, 21449},
-    {57849, 8871, 21450},
-    {57850, 8872, 21451},
-    {57851, 8873, 21452},
-    {57852, 8874, 21453},
-    {57853, 8875, 21454},
-    {57854, 8876, 21455},
-    {57855, 8877, 21456},
-    {57856, 8878, 21457},
-    {57857, 8879, 21458},
-    {57858, 8880, 21459},
-    {57859, 8881, 21460},
-    {57860, 8882, 21461},
-    {57861, 8883, 21462},
-    {57862, 8884, 21463},
-    {57863, 8885, 21464},
-    {57864, 8886, 21465},
-    {57865, 8887, 21466},
-    {57866, 8888, 21467},
-    {57867, 8889, 21468},
-    {57868, 8890, 21469},
-    {57869, 8891, 21470},
-    {57870, 8892, 21471},
-    {57871, 8893, 21472},
-    {57872, 8894, 21473},
-    {57873, 8895, 21474},
-    {57874, 8896, 21475},
-    {57875, 8897, 21476},
-    {57876, 8898, 21477},
-    {57877, 8899, 21478},
-    {57878, 8900, 21479},
-    {57879, 8901, 21480},
-    {57880, 8902, 21481},
-    {57881, 8903, 21482},
-    {57882, 8904, 21483},
-    {57883, 8905, 21484},
-    {57884, 8906, 21485},
-    {57885, 8907, 21523},
-    {57886, 8908, 21524},
-    {57887, 8909, 21525},
-    {57888, 8910, 21526},
-    {57889, 8911, 21527},
-    {57890, 8912, 21528},
-    {57891, 8913, 21529},
-    {57892, 8914, 21530},
-    {57893, 8915, 21531},
-    {57894, 8916, 21532},
-    {57895, 8917, 21533},
-    {57896, 8918, 21534},
-    {57897, 8919, 21535},
-    {57898, 8920, 21536},
-    {57899, 8921, 21537},
+    {57797, 8723, 21406},
+    {57798, 8724, 21407},
+    {57799, 8725, 21408},
+    {57800, 8726, 21409},
+    {57801, 8727, 21410},
+    {57802, 8728, 21411},
+    {57803, 8729, 21412},
+    {57804, 8730, 21413},
+    {57805, 8731, 21414},
+    {57806, 8732, 21415},
+    {57807, 8733, 21416},
+    {57808, 8734, 21417},
+    {57809, 8735, 21418},
+    {57810, 8736, 21419},
+    {57811, 8737, 21420},
+    {57812, 8738, 21421},
+    {57813, 8739, 21422},
+    {57814, 8836, 21423},
+    {57815, 8837, 21424},
+    {57816, 8838, 21425},
+    {57817, 8839, 21426},
+    {57818, 8840, 21427},
+    {57819, 8841, 21428},
+    {57820, 8842, 21429},
+    {57821, 8843, 21430},
+    {57822, 8844, 21431},
+    {57823, 8845, 21432},
+    {57824, 8846, 21433},
+    {57825, 8847, 21434},
+    {57826, 8848, 21435},
+    {57827, 8849, 21436},
+    {57828, 8850, 21437},
+    {57829, 8851, 21438},
+    {57830, 8852, 21439},
+    {57831, 8853, 21440},
+    {57832, 8854, 21441},
+    {57833, 8855, 21442},
+    {57834, 8856, 21443},
+    {57835, 8857, 21444},
+    {57836, 8858, 21445},
+    {57837, 8859, 21446},
+    {57838, 8860, 21447},
+    {57839, 8861, 21448},
+    {57840, 8862, 21449},
+    {57841, 8863, 21450},
+    {57842, 8864, 21451},
+    {57843, 8865, 21452},
+    {57844, 8866, 21453},
+    {57845, 8867, 21454},
+    {57846, 8868, 21455},
+    {57847, 8869, 21456},
+    {57848, 8870, 21457},
+    {57849, 8871, 21458},
+    {57850, 8872, 21459},
+    {57851, 8873, 21460},
+    {57852, 8874, 21461},
+    {57853, 8875, 21462},
+    {57854, 8876, 21463},
+    {57855, 8877, 21464},
+    {57856, 8878, 21465},
+    {57857, 8879, 21466},
+    {57858, 8880, 21467},
+    {57859, 8881, 21468},
+    {57860, 8882, 21469},
+    {57861, 8883, 21470},
+    {57862, 8884, 21471},
+    {57863, 8885, 21472},
+    {57864, 8886, 21473},
+    {57865, 8887, 21474},
+    {57866, 8888, 21475},
+    {57867, 8889, 21476},
+    {57868, 8890, 21477},
+    {57869, 8891, 21478},
+    {57870, 8892, 21479},
+    {57871, 8893, 21480},
+    {57872, 8894, 21481},
+    {57873, 8895, 21482},
+    {57874, 8896, 21483},
+    {57875, 8897, 21484},
+    {57876, 8898, 21485},
+    {57877, 8899, 21486},
+    {57878, 8900, 21487},
+    {57879, 8901, 21488},
+    {57880, 8902, 21489},
+    {57881, 8903, 21490},
+    {57882, 8904, 21491},
+    {57883, 8905, 21492},
+    {57884, 8906, 21493},
+    {57885, 8907, 21531},
+    {57886, 8908, 21532},
+    {57887, 8909, 21533},
+    {57888, 8910, 21534},
+    {57889, 8911, 21535},
+    {57890, 8912, 21536},
+    {57891, 8913, 21537},
+    {57892, 8914, 21538},
+    {57893, 8915, 21539},
+    {57894, 8916, 21540},
+    {57895, 8917, 21541},
+    {57896, 8918, 21542},
+    {57897, 8919, 21543},
+    {57898, 8920, 21544},
+    {57899, 8921, 21545},
     {57900, 8922, 22406},
-    {57901, 8923, 21538},
-    {57902, 8924, 21539},
-    {57903, 8925, 21540},
-    {57904, 8926, 21541},
-    {57905, 8927, 21542},
-    {57906, 8928, 21543},
-    {57907, 8929, 21544},
+    {57901, 8923, 21546},
+    {57902, 8924, 21547},
+    {57903, 8925, 21548},
+    {57904, 8926, 21549},
+    {57905, 8927, 21550},
+    {57906, 8928, 21551},
+    {57907, 8929, 21552},
     {37958, 19592, 22707},
     {37959, 19593, 22708},
     {37960, 19594, 22709},
@@ -42628,727 +42628,727 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {38613, 10056, 23938},
     {38614, 20185, 23939},
     {38615, 20186, 23940},
-    {58566, 6080, 21557},
-    {58567, 6081, 21558},
-    {58568, 6082, 21559},
-    {58569, 6083, 21560},
-    {58570, 6084, 21561},
-    {58571, 6085, 21562},
-    {58572, 6086, 21563},
-    {58573, 6087, 21564},
+    {58566, 6080, 21565},
+    {58567, 6081, 21566},
+    {58568, 6082, 21567},
+    {58569, 6083, 21568},
+    {58570, 6084, 21569},
+    {58571, 6085, 21570},
+    {58572, 6086, 21571},
+    {58573, 6087, 21572},
     {58574, 6088, 22398},
-    {58575, 6089, 21565},
-    {58576, 6090, 21566},
-    {58577, 6091, 21567},
-    {58578, 6092, 21568},
-    {58579, 6093, 21569},
-    {58580, 6094, 21570},
-    {58581, 6095, 21571},
-    {58582, 6096, 20827},
+    {58575, 6089, 21573},
+    {58576, 6090, 21574},
+    {58577, 6091, 21575},
+    {58578, 6092, 21576},
+    {58579, 6093, 21577},
+    {58580, 6094, 21578},
+    {58581, 6095, 21579},
+    {58582, 6096, 20836},
     {58583, 6097, 22374},
-    {58584, 6098, 20807},
-    {58585, 6099, 21572},
-    {58586, 6100, 21573},
-    {58587, 6101, 21574},
-    {58588, 6102, 21575},
+    {58584, 6098, 20816},
+    {58585, 6099, 21580},
+    {58586, 6100, 21581},
+    {58587, 6101, 21582},
+    {58588, 6102, 21583},
     {58589, 6103, 22376},
-    {58590, 6104, 21576},
-    {58591, 6105, 21577},
-    {58592, 6106, 21578},
+    {58590, 6104, 21584},
+    {58591, 6105, 21585},
+    {58592, 6106, 21586},
     {58593, 6107, 22375},
-    {58594, 6108, 21579},
-    {58595, 6109, 21580},
-    {58596, 6110, 20650},
-    {58597, 6111, 20638},
-    {58598, 6112, 21581},
-    {58599, 6113, 20338},
-    {58600, 6114, 21582},
-    {58601, 6115, 21583},
-    {58602, 6116, 21584},
-    {58603, 6117, 21585},
-    {58604, 6118, 20783},
-    {58605, 6119, 21586},
-    {58606, 6120, 20802},
+    {58594, 6108, 21587},
+    {58595, 6109, 21588},
+    {58596, 6110, 20659},
+    {58597, 6111, 20647},
+    {58598, 6112, 21589},
+    {58599, 6113, 20345},
+    {58600, 6114, 21590},
+    {58601, 6115, 21591},
+    {58602, 6116, 21592},
+    {58603, 6117, 21593},
+    {58604, 6118, 20792},
+    {58605, 6119, 21594},
+    {58606, 6120, 20811},
     {58607, 6121, 22378},
-    {58608, 6122, 21587},
-    {58609, 6123, 21588},
-    {58610, 6124, 20797},
-    {58611, 6125, 21589},
+    {58608, 6122, 21595},
+    {58609, 6123, 21596},
+    {58610, 6124, 20806},
+    {58611, 6125, 21597},
     {58612, 6126, 22377},
-    {58613, 6127, 20843},
+    {58613, 6127, 20852},
     {58614, 6128, 22379},
-    {58615, 6129, 20678},
-    {58616, 6130, 21590},
-    {58617, 6131, 21591},
-    {58618, 6132, 21592},
-    {58619, 6133, 20432},
+    {58615, 6129, 20687},
+    {58616, 6130, 21598},
+    {58617, 6131, 21599},
+    {58618, 6132, 21600},
+    {58619, 6133, 20441},
     {58620, 6134, 22381},
     {58621, 6135, 22380},
-    {58622, 6136, 21593},
-    {58623, 6137, 21594},
-    {58624, 6138, 21595},
-    {58625, 6139, 20698},
-    {58626, 6140, 21596},
-    {58627, 6141, 21597},
-    {58628, 6142, 20649},
-    {58629, 6143, 21598},
-    {58630, 6144, 21599},
-    {58631, 6145, 21600},
-    {58632, 6146, 21601},
-    {58633, 6147, 21602},
-    {58634, 6148, 20758},
-    {58635, 6149, 21603},
-    {58636, 6150, 20788},
-    {58637, 6151, 21604},
-    {58638, 6152, 21605},
-    {58639, 6153, 21611},
-    {58640, 6154, 21612},
-    {58641, 6155, 21613},
-    {58642, 6156, 21614},
-    {58643, 6157, 21615},
-    {58644, 6158, 21616},
-    {58645, 6159, 21617},
-    {58646, 6160, 21618},
-    {58647, 6161, 21619},
+    {58622, 6136, 21601},
+    {58623, 6137, 21602},
+    {58624, 6138, 21603},
+    {58625, 6139, 20707},
+    {58626, 6140, 21604},
+    {58627, 6141, 21605},
+    {58628, 6142, 20658},
+    {58629, 6143, 21606},
+    {58630, 6144, 21607},
+    {58631, 6145, 21608},
+    {58632, 6146, 21609},
+    {58633, 6147, 21610},
+    {58634, 6148, 20767},
+    {58635, 6149, 21611},
+    {58636, 6150, 20797},
+    {58637, 6151, 21612},
+    {58638, 6152, 21613},
+    {58639, 6153, 21619},
+    {58640, 6154, 21620},
+    {58641, 6155, 21621},
+    {58642, 6156, 21622},
+    {58643, 6157, 21623},
+    {58644, 6158, 21624},
+    {58645, 6159, 21625},
+    {58646, 6160, 21626},
+    {58647, 6161, 21627},
     {58648, 6162, 22382},
-    {58649, 6163, 21620},
-    {58650, 6164, 21621},
+    {58649, 6163, 21628},
+    {58650, 6164, 21629},
     {58651, 6165, 22383},
-    {58652, 6166, 21622},
-    {58653, 6167, 21623},
+    {58652, 6166, 21630},
+    {58653, 6167, 21631},
     {58654, 6168, 22384},
-    {58655, 6169, 21624},
-    {58656, 6170, 20664},
-    {58657, 6171, 21625},
-    {58658, 6172, 21626},
-    {58659, 6173, 21627},
-    {58660, 6174, 21628},
-    {58661, 6175, 21629},
-    {58662, 6270, 20332},
-    {58663, 6271, 20712},
-    {58664, 6272, 21630},
-    {58665, 6273, 21631},
-    {58666, 6274, 21632},
-    {58667, 6275, 21633},
+    {58655, 6169, 21632},
+    {58656, 6170, 20673},
+    {58657, 6171, 21633},
+    {58658, 6172, 21634},
+    {58659, 6173, 21635},
+    {58660, 6174, 21636},
+    {58661, 6175, 21637},
+    {58662, 6270, 20339},
+    {58663, 6271, 20721},
+    {58664, 6272, 21638},
+    {58665, 6273, 21639},
+    {58666, 6274, 21640},
+    {58667, 6275, 21641},
     {58668, 6276, 22385},
-    {58669, 6277, 21634},
-    {58670, 6278, 21635},
-    {58671, 6279, 21636},
-    {58672, 6280, 21637},
-    {58673, 6281, 21638},
-    {58674, 6282, 21639},
-    {58675, 6283, 21640},
-    {58676, 6284, 21641},
-    {58677, 6285, 21642},
-    {58678, 6286, 21643},
-    {58679, 6287, 21644},
-    {58680, 6288, 21645},
-    {58681, 6289, 21646},
-    {58682, 6290, 21647},
-    {58683, 6291, 21648},
-    {58684, 6292, 21649},
-    {58685, 6293, 21650},
-    {58686, 6294, 21651},
-    {58687, 6295, 21652},
-    {58688, 6296, 20725},
+    {58669, 6277, 21642},
+    {58670, 6278, 21643},
+    {58671, 6279, 21644},
+    {58672, 6280, 21645},
+    {58673, 6281, 21646},
+    {58674, 6282, 21647},
+    {58675, 6283, 21648},
+    {58676, 6284, 21649},
+    {58677, 6285, 21650},
+    {58678, 6286, 21651},
+    {58679, 6287, 21652},
+    {58680, 6288, 21653},
+    {58681, 6289, 21654},
+    {58682, 6290, 21655},
+    {58683, 6291, 21656},
+    {58684, 6292, 21657},
+    {58685, 6293, 21658},
+    {58686, 6294, 21659},
+    {58687, 6295, 21660},
+    {58688, 6296, 20734},
     {58689, 6297, 22373},
-    {58690, 6298, 21653},
-    {58691, 6299, 21654},
-    {58692, 6300, 20481},
-    {58693, 6301, 21655},
-    {58694, 6302, 21656},
-    {58695, 6303, 20480},
-    {58696, 6304, 21657},
-    {58697, 6305, 20375},
-    {58698, 6306, 21658},
-    {58699, 6307, 21659},
-    {58700, 6308, 20392},
-    {58701, 6309, 21660},
-    {58702, 6310, 20562},
-    {58703, 6311, 20680},
-    {58704, 6312, 20685},
-    {58705, 6313, 21661},
-    {58706, 6314, 21662},
-    {58707, 6315, 20862},
-    {58708, 6316, 21663},
-    {58709, 6317, 21664},
-    {58710, 6318, 21665},
-    {58711, 6319, 20405},
-    {58712, 6320, 21666},
-    {58713, 6321, 21667},
-    {58714, 6322, 21668},
-    {58715, 6323, 21669},
-    {58716, 6324, 21670},
-    {58717, 6325, 21671},
-    {58718, 6326, 21672},
-    {58719, 6327, 21673},
-    {58720, 6328, 21674},
-    {58721, 6329, 20451},
-    {58722, 6330, 20806},
-    {58723, 6331, 21675},
-    {58724, 6332, 20330},
-    {58725, 6333, 21676},
-    {58726, 6334, 21677},
-    {58727, 6335, 21678},
-    {58728, 6336, 21679},
-    {58729, 6337, 21680},
+    {58690, 6298, 21661},
+    {58691, 6299, 21662},
+    {58692, 6300, 20490},
+    {58693, 6301, 21663},
+    {58694, 6302, 21664},
+    {58695, 6303, 20489},
+    {58696, 6304, 21665},
+    {58697, 6305, 20383},
+    {58698, 6306, 21666},
+    {58699, 6307, 21667},
+    {58700, 6308, 20400},
+    {58701, 6309, 21668},
+    {58702, 6310, 20571},
+    {58703, 6311, 20689},
+    {58704, 6312, 20694},
+    {58705, 6313, 21669},
+    {58706, 6314, 21670},
+    {58707, 6315, 20871},
+    {58708, 6316, 21671},
+    {58709, 6317, 21672},
+    {58710, 6318, 21673},
+    {58711, 6319, 20413},
+    {58712, 6320, 21674},
+    {58713, 6321, 21675},
+    {58714, 6322, 21676},
+    {58715, 6323, 21677},
+    {58716, 6324, 21678},
+    {58717, 6325, 21679},
+    {58718, 6326, 21680},
+    {58719, 6327, 21681},
+    {58720, 6328, 21682},
+    {58721, 6329, 20460},
+    {58722, 6330, 20815},
+    {58723, 6331, 21683},
+    {58724, 6332, 20337},
+    {58725, 6333, 21684},
+    {58726, 6334, 21685},
+    {58727, 6335, 21686},
+    {58728, 6336, 21687},
+    {58729, 6337, 21688},
     {58730, 6338, 22565},
-    {58731, 6339, 21681},
-    {58732, 6340, 21682},
-    {58733, 6341, 21683},
-    {58734, 6342, 21684},
-    {58735, 6343, 21685},
-    {58736, 6344, 21686},
-    {58737, 6345, 21687},
-    {58738, 6346, 21688},
+    {58731, 6339, 21689},
+    {58732, 6340, 21690},
+    {58733, 6341, 21691},
+    {58734, 6342, 21692},
+    {58735, 6343, 21693},
+    {58736, 6344, 21694},
+    {58737, 6345, 21695},
+    {58738, 6346, 21696},
     {58739, 6347, 22566},
-    {58740, 6348, 21689},
-    {58741, 6349, 21690},
-    {58742, 6350, 21691},
-    {58743, 6351, 21692},
-    {58744, 6352, 21693},
-    {58745, 6353, 20798},
-    {58746, 6354, 21694},
-    {58747, 6355, 20328},
-    {58748, 6356, 21695},
-    {58749, 6357, 21696},
-    {58750, 6358, 21697},
+    {58740, 6348, 21697},
+    {58741, 6349, 21698},
+    {58742, 6350, 21699},
+    {58743, 6351, 21700},
+    {58744, 6352, 21701},
+    {58745, 6353, 20807},
+    {58746, 6354, 21702},
+    {58747, 6355, 20335},
+    {58748, 6356, 21703},
+    {58749, 6357, 21704},
+    {58750, 6358, 21705},
     {58751, 6359, 22567},
     {58752, 6360, 22568},
-    {58753, 6361, 21698},
+    {58753, 6361, 21706},
     {58754, 6362, 22569},
-    {58755, 6363, 21699},
-    {58756, 6364, 21700},
-    {58757, 6365, 21701},
-    {58758, 6460, 20723},
-    {58759, 6461, 21702},
-    {58760, 6462, 21703},
-    {58761, 6463, 21704},
-    {58762, 6464, 21705},
-    {58763, 6465, 21706},
-    {58764, 6466, 21714},
-    {58765, 6467, 21715},
-    {58766, 6468, 20484},
-    {58767, 6469, 21716},
-    {58768, 6470, 21717},
+    {58755, 6363, 21707},
+    {58756, 6364, 21708},
+    {58757, 6365, 21709},
+    {58758, 6460, 20732},
+    {58759, 6461, 21710},
+    {58760, 6462, 21711},
+    {58761, 6463, 21712},
+    {58762, 6464, 21713},
+    {58763, 6465, 21714},
+    {58764, 6466, 21723},
+    {58765, 6467, 21724},
+    {58766, 6468, 20493},
+    {58767, 6469, 21725},
+    {58768, 6470, 21726},
     {58769, 6471, 22572},
-    {58770, 6472, 21718},
-    {58771, 6473, 21719},
-    {58772, 6474, 21720},
-    {58773, 6475, 21721},
-    {58774, 6476, 21722},
-    {58775, 6477, 21723},
-    {58776, 6478, 21724},
+    {58770, 6472, 21727},
+    {58771, 6473, 21728},
+    {58772, 6474, 21729},
+    {58773, 6475, 21730},
+    {58774, 6476, 21731},
+    {58775, 6477, 21732},
+    {58776, 6478, 21733},
     {58777, 6479, 22571},
-    {58778, 6480, 21725},
-    {58779, 6481, 20342},
-    {58780, 6482, 21726},
+    {58778, 6480, 21734},
+    {58779, 6481, 20349},
+    {58780, 6482, 21735},
     {58781, 6483, 22570},
-    {58782, 6484, 21727},
-    {58783, 6485, 21728},
+    {58782, 6484, 21736},
+    {58783, 6485, 21737},
     {58784, 6486, 22573},
-    {58785, 6487, 21729},
+    {58785, 6487, 21738},
     {58786, 6488, 22574},
-    {58787, 6489, 21730},
-    {58788, 6490, 21731},
-    {58789, 6491, 21732},
-    {58790, 6492, 21733},
-    {58791, 6493, 21734},
-    {58792, 6494, 21735},
-    {58793, 6495, 21736},
-    {58794, 6496, 21737},
-    {58795, 6497, 21738},
-    {58796, 6498, 21739},
-    {58797, 6499, 21740},
-    {58798, 6500, 21741},
-    {58799, 6501, 21742},
-    {58800, 6502, 21743},
-    {58801, 6503, 21744},
-    {58802, 6504, 21745},
-    {58803, 6505, 21746},
-    {58804, 6506, 21747},
-    {58805, 6507, 21748},
-    {58806, 6508, 21749},
-    {58807, 6509, 21750},
-    {58808, 6510, 21751},
-    {58809, 6511, 21752},
-    {58810, 6512, 21753},
-    {58811, 6513, 21754},
-    {58812, 6514, 21755},
-    {58813, 6515, 21756},
-    {58814, 6516, 21757},
-    {58815, 6517, 21758},
-    {58816, 6518, 21759},
-    {58817, 6519, 21760},
-    {58818, 6520, 21761},
-    {58819, 6521, 21762},
-    {58820, 6522, 21763},
-    {58821, 6523, 21764},
-    {58822, 6524, 21765},
-    {58823, 6525, 21766},
-    {58824, 6526, 21767},
-    {58825, 6527, 21768},
-    {58826, 6528, 21769},
-    {58827, 6529, 21770},
-    {58828, 6530, 21771},
-    {58829, 6531, 21772},
-    {58830, 6532, 21773},
-    {58831, 6533, 21774},
-    {58832, 6534, 21775},
-    {58833, 6535, 21776},
-    {58834, 6536, 21777},
-    {58835, 6537, 21778},
-    {58836, 6538, 20777},
-    {58837, 6539, 20735},
-    {58838, 6540, 21779},
-    {58839, 6541, 20417},
-    {58840, 6542, 21545},
-    {58841, 6543, 21546},
-    {58842, 6544, 21547},
-    {58843, 6545, 20483},
-    {58844, 6546, 21780},
-    {58845, 6547, 21781},
-    {58846, 6548, 21782},
-    {58847, 6549, 21783},
-    {58848, 6550, 21784},
-    {58849, 6551, 20819},
-    {58850, 6552, 21785},
-    {58851, 6553, 20835},
-    {58852, 6554, 20745},
+    {58787, 6489, 21739},
+    {58788, 6490, 21740},
+    {58789, 6491, 21741},
+    {58790, 6492, 21742},
+    {58791, 6493, 21743},
+    {58792, 6494, 21744},
+    {58793, 6495, 21745},
+    {58794, 6496, 21746},
+    {58795, 6497, 21747},
+    {58796, 6498, 21748},
+    {58797, 6499, 21749},
+    {58798, 6500, 21750},
+    {58799, 6501, 21751},
+    {58800, 6502, 21752},
+    {58801, 6503, 21753},
+    {58802, 6504, 21754},
+    {58803, 6505, 21755},
+    {58804, 6506, 21756},
+    {58805, 6507, 21757},
+    {58806, 6508, 21758},
+    {58807, 6509, 21759},
+    {58808, 6510, 21760},
+    {58809, 6511, 21761},
+    {58810, 6512, 21762},
+    {58811, 6513, 21763},
+    {58812, 6514, 21764},
+    {58813, 6515, 21765},
+    {58814, 6516, 21766},
+    {58815, 6517, 21767},
+    {58816, 6518, 21768},
+    {58817, 6519, 21769},
+    {58818, 6520, 21770},
+    {58819, 6521, 21771},
+    {58820, 6522, 21772},
+    {58821, 6523, 21773},
+    {58822, 6524, 21774},
+    {58823, 6525, 21775},
+    {58824, 6526, 21776},
+    {58825, 6527, 21777},
+    {58826, 6528, 21778},
+    {58827, 6529, 21779},
+    {58828, 6530, 21780},
+    {58829, 6531, 21781},
+    {58830, 6532, 21782},
+    {58831, 6533, 21783},
+    {58832, 6534, 21784},
+    {58833, 6535, 21785},
+    {58834, 6536, 21786},
+    {58835, 6537, 21787},
+    {58836, 6538, 20786},
+    {58837, 6539, 20744},
+    {58838, 6540, 21788},
+    {58839, 6541, 20425},
+    {58840, 6542, 21553},
+    {58841, 6543, 21554},
+    {58842, 6544, 21555},
+    {58843, 6545, 20492},
+    {58844, 6546, 21789},
+    {58845, 6547, 21790},
+    {58846, 6548, 21791},
+    {58847, 6549, 21792},
+    {58848, 6550, 21793},
+    {58849, 6551, 20828},
+    {58850, 6552, 21794},
+    {58851, 6553, 20844},
+    {58852, 6554, 20754},
     {38903, 20592, 0},
-    {58854, 6650, 21786},
-    {58855, 6651, 21787},
-    {58856, 6652, 21788},
-    {58857, 6653, 21789},
-    {58858, 6654, 21790},
-    {58859, 6655, 21791},
-    {58860, 6656, 21792},
-    {58861, 6657, 21793},
-    {58862, 6658, 21794},
-    {58863, 6659, 21795},
-    {58864, 6660, 21796},
-    {58865, 6661, 21797},
-    {58866, 6662, 21798},
-    {58867, 6663, 21799},
-    {58868, 6664, 21800},
-    {58869, 6665, 21801},
-    {58870, 6666, 21802},
-    {58871, 6667, 21803},
-    {58872, 6668, 21804},
-    {58873, 6669, 21805},
-    {58874, 6670, 21806},
-    {58875, 6671, 21807},
-    {58876, 6672, 21808},
-    {58877, 6673, 21813},
-    {58878, 6674, 21814},
-    {58879, 6675, 21815},
-    {58880, 6676, 21816},
-    {58881, 6677, 21817},
-    {58882, 6678, 21818},
-    {58883, 6679, 21819},
-    {58884, 6680, 21820},
-    {58885, 6681, 21821},
-    {58886, 6682, 21822},
-    {58887, 6683, 21823},
-    {58888, 6684, 21824},
-    {58889, 6685, 21825},
-    {58890, 6686, 21826},
-    {58891, 6687, 21827},
-    {58892, 6688, 21828},
-    {58893, 6689, 21829},
-    {58894, 6690, 21830},
-    {58895, 6691, 21831},
-    {58896, 6692, 21832},
-    {58897, 6693, 21833},
-    {58898, 6694, 21834},
-    {58899, 6695, 21835},
-    {58900, 6696, 21836},
-    {58901, 6697, 21837},
-    {58902, 6698, 21838},
-    {58903, 6699, 21839},
-    {58904, 6700, 21840},
-    {58905, 6701, 21841},
-    {58906, 6702, 21842},
-    {58907, 6703, 21843},
-    {58908, 6704, 21844},
-    {58909, 6705, 21845},
-    {58910, 6706, 21846},
-    {58911, 6707, 21847},
-    {58912, 6708, 21848},
-    {58913, 6709, 21849},
-    {58914, 6710, 21850},
-    {58915, 6711, 21851},
-    {58916, 6712, 21852},
-    {58917, 6713, 21853},
-    {58918, 6714, 21854},
-    {58919, 6715, 21855},
-    {58920, 6716, 21856},
-    {58921, 6717, 21857},
-    {58922, 6718, 21858},
-    {58923, 6719, 21859},
-    {58924, 6720, 21860},
-    {58925, 6721, 21861},
-    {58926, 6722, 21862},
-    {58927, 6723, 21863},
-    {58928, 6724, 21864},
-    {58929, 6725, 21865},
-    {58930, 6726, 21866},
-    {58931, 6727, 21867},
-    {58932, 6728, 21868},
-    {58933, 6729, 21869},
-    {58934, 6730, 21870},
-    {58935, 6731, 21871},
-    {58936, 6732, 21872},
-    {58937, 6733, 21873},
-    {58938, 6734, 21874},
-    {58939, 6735, 21875},
-    {58940, 6736, 21876},
-    {58941, 6737, 21877},
-    {58942, 6738, 21878},
-    {58943, 6739, 21879},
-    {58944, 6740, 21880},
-    {58945, 6741, 21881},
-    {58946, 6742, 21882},
-    {58947, 6743, 21883},
-    {58948, 6744, 21884},
-    {58949, 6745, 21885},
-    {58950, 6840, 21886},
-    {58951, 6841, 21887},
-    {58952, 6842, 21888},
-    {58953, 6843, 21889},
-    {58954, 6844, 21890},
-    {58955, 6845, 21891},
-    {58956, 6846, 21892},
-    {58957, 6847, 21893},
-    {58958, 6848, 21894},
-    {58959, 6849, 21895},
-    {58960, 6850, 21896},
-    {58961, 6851, 21897},
-    {58962, 6852, 21898},
-    {58963, 6853, 21899},
-    {58964, 6854, 21900},
-    {58965, 6855, 21901},
-    {58966, 6856, 21902},
-    {58967, 6857, 21903},
-    {58968, 6858, 21904},
-    {58969, 6859, 21905},
-    {58970, 6860, 21906},
-    {58971, 6861, 21907},
-    {58972, 6862, 21908},
-    {58973, 6863, 21909},
-    {58974, 6864, 21910},
-    {58975, 6865, 21911},
-    {58976, 6866, 21912},
-    {58977, 6867, 21913},
-    {58978, 6868, 21914},
-    {58979, 6869, 20814},
-    {58980, 6870, 20377},
-    {58981, 6871, 20726},
+    {58854, 6650, 21795},
+    {58855, 6651, 21796},
+    {58856, 6652, 21797},
+    {58857, 6653, 21798},
+    {58858, 6654, 21799},
+    {58859, 6655, 21800},
+    {58860, 6656, 21801},
+    {58861, 6657, 21802},
+    {58862, 6658, 21803},
+    {58863, 6659, 21804},
+    {58864, 6660, 21805},
+    {58865, 6661, 21806},
+    {58866, 6662, 21807},
+    {58867, 6663, 21808},
+    {58868, 6664, 21809},
+    {58869, 6665, 21810},
+    {58870, 6666, 21811},
+    {58871, 6667, 21812},
+    {58872, 6668, 21813},
+    {58873, 6669, 21814},
+    {58874, 6670, 21815},
+    {58875, 6671, 21816},
+    {58876, 6672, 21817},
+    {58877, 6673, 21822},
+    {58878, 6674, 21823},
+    {58879, 6675, 21824},
+    {58880, 6676, 21825},
+    {58881, 6677, 21826},
+    {58882, 6678, 21827},
+    {58883, 6679, 21828},
+    {58884, 6680, 21829},
+    {58885, 6681, 21830},
+    {58886, 6682, 21831},
+    {58887, 6683, 21832},
+    {58888, 6684, 21833},
+    {58889, 6685, 21834},
+    {58890, 6686, 21835},
+    {58891, 6687, 21836},
+    {58892, 6688, 21837},
+    {58893, 6689, 21838},
+    {58894, 6690, 21839},
+    {58895, 6691, 21840},
+    {58896, 6692, 21841},
+    {58897, 6693, 21842},
+    {58898, 6694, 21843},
+    {58899, 6695, 21844},
+    {58900, 6696, 21845},
+    {58901, 6697, 21846},
+    {58902, 6698, 21847},
+    {58903, 6699, 21848},
+    {58904, 6700, 21849},
+    {58905, 6701, 21850},
+    {58906, 6702, 21851},
+    {58907, 6703, 21852},
+    {58908, 6704, 21853},
+    {58909, 6705, 21854},
+    {58910, 6706, 21855},
+    {58911, 6707, 21856},
+    {58912, 6708, 21857},
+    {58913, 6709, 21858},
+    {58914, 6710, 21859},
+    {58915, 6711, 21860},
+    {58916, 6712, 21861},
+    {58917, 6713, 21862},
+    {58918, 6714, 21863},
+    {58919, 6715, 21864},
+    {58920, 6716, 21865},
+    {58921, 6717, 21866},
+    {58922, 6718, 21867},
+    {58923, 6719, 21868},
+    {58924, 6720, 21869},
+    {58925, 6721, 21870},
+    {58926, 6722, 21871},
+    {58927, 6723, 21872},
+    {58928, 6724, 21873},
+    {58929, 6725, 21874},
+    {58930, 6726, 21875},
+    {58931, 6727, 21876},
+    {58932, 6728, 21877},
+    {58933, 6729, 21878},
+    {58934, 6730, 21879},
+    {58935, 6731, 21880},
+    {58936, 6732, 21881},
+    {58937, 6733, 21882},
+    {58938, 6734, 21883},
+    {58939, 6735, 21884},
+    {58940, 6736, 21885},
+    {58941, 6737, 21886},
+    {58942, 6738, 21887},
+    {58943, 6739, 21888},
+    {58944, 6740, 21889},
+    {58945, 6741, 21890},
+    {58946, 6742, 21891},
+    {58947, 6743, 21892},
+    {58948, 6744, 21893},
+    {58949, 6745, 21894},
+    {58950, 6840, 21895},
+    {58951, 6841, 21896},
+    {58952, 6842, 21897},
+    {58953, 6843, 21898},
+    {58954, 6844, 21899},
+    {58955, 6845, 21900},
+    {58956, 6846, 21901},
+    {58957, 6847, 21902},
+    {58958, 6848, 21903},
+    {58959, 6849, 21904},
+    {58960, 6850, 21905},
+    {58961, 6851, 21906},
+    {58962, 6852, 21907},
+    {58963, 6853, 21908},
+    {58964, 6854, 21909},
+    {58965, 6855, 21910},
+    {58966, 6856, 21911},
+    {58967, 6857, 21912},
+    {58968, 6858, 21913},
+    {58969, 6859, 21914},
+    {58970, 6860, 21915},
+    {58971, 6861, 21916},
+    {58972, 6862, 21917},
+    {58973, 6863, 21918},
+    {58974, 6864, 21919},
+    {58975, 6865, 21920},
+    {58976, 6866, 21921},
+    {58977, 6867, 21922},
+    {58978, 6868, 21923},
+    {58979, 6869, 20823},
+    {58980, 6870, 20385},
+    {58981, 6871, 20735},
     {58982, 6872, 22241},
-    {58983, 6873, 20796},
-    {58984, 6874, 20759},
-    {58985, 6875, 20803},
-    {58986, 6876, 21520},
-    {58987, 6877, 20775},
-    {58988, 6878, 20410},
-    {58989, 6879, 20382},
+    {58983, 6873, 20805},
+    {58984, 6874, 20768},
+    {58985, 6875, 20812},
+    {58986, 6876, 21528},
+    {58987, 6877, 20784},
+    {58988, 6878, 20418},
+    {58989, 6879, 20390},
     {58990, 6880, 22242},
-    {58991, 6881, 20334},
-    {58992, 6882, 20761},
+    {58991, 6881, 20341},
+    {58992, 6882, 20770},
     {58993, 6883, 22243},
-    {58994, 6884, 20829},
-    {58995, 6885, 20663},
-    {58996, 6886, 20653},
-    {58997, 6887, 20717},
-    {58998, 6888, 20479},
+    {58994, 6884, 20838},
+    {58995, 6885, 20672},
+    {58996, 6886, 20662},
+    {58997, 6887, 20726},
+    {58998, 6888, 20488},
     {58999, 6889, 22277},
-    {59000, 6890, 20440},
-    {59001, 6891, 21915},
+    {59000, 6890, 20449},
+    {59001, 6891, 21924},
     {59002, 6892, 22278},
     {59003, 6893, 22279},
-    {59004, 6894, 21916},
+    {59004, 6894, 21925},
     {59005, 6895, 22280},
-    {59006, 6896, 20815},
-    {59007, 6897, 20716},
-    {59008, 6898, 21917},
-    {59009, 6899, 20771},
+    {59006, 6896, 20824},
+    {59007, 6897, 20725},
+    {59008, 6898, 21926},
+    {59009, 6899, 20780},
     {59010, 6900, 22281},
-    {59011, 6901, 21918},
-    {59012, 6902, 20822},
-    {59013, 6903, 20563},
-    {59014, 6904, 20766},
-    {59015, 6905, 21919},
+    {59011, 6901, 21927},
+    {59012, 6902, 20831},
+    {59013, 6903, 20572},
+    {59014, 6904, 20775},
+    {59015, 6905, 21928},
     {59016, 6906, 22282},
     {59017, 6907, 22283},
-    {59018, 6908, 20810},
-    {59019, 6909, 20385},
+    {59018, 6908, 20819},
+    {59019, 6909, 20393},
     {59020, 6910, 22284},
     {59021, 6911, 22285},
-    {59022, 6912, 20373},
+    {59022, 6912, 20381},
     {59023, 6913, 22286},
     {59024, 6914, 22287},
-    {59025, 6915, 21920},
-    {59026, 6916, 20353},
+    {59025, 6915, 21929},
+    {59026, 6916, 20360},
     {59027, 6917, 22288},
     {59028, 6918, 22289},
-    {59029, 6919, 20729},
-    {59030, 6920, 21921},
-    {59031, 6921, 21922},
-    {59032, 6922, 21923},
-    {59033, 6923, 21924},
-    {59034, 6924, 21925},
-    {59035, 6925, 21926},
-    {59036, 6926, 21927},
-    {59037, 6927, 21928},
-    {59038, 6928, 21929},
-    {59039, 6929, 21930},
-    {59040, 6930, 21931},
-    {59041, 6931, 21932},
-    {59042, 6932, 21933},
-    {59043, 6933, 21934},
-    {59044, 6934, 21935},
-    {59045, 6935, 21936},
-    {59046, 7030, 21937},
-    {59047, 7031, 21938},
-    {59048, 7032, 21939},
-    {59049, 7033, 21940},
-    {59050, 7034, 21941},
-    {59051, 7035, 21942},
-    {59052, 7036, 21943},
-    {59053, 7037, 21944},
-    {59054, 7038, 21945},
-    {59055, 7039, 21946},
-    {59056, 7040, 21947},
-    {59057, 7041, 21948},
-    {59058, 7042, 21949},
-    {59059, 7043, 21950},
-    {59060, 7044, 21951},
-    {59061, 7045, 21952},
-    {59062, 7046, 21953},
-    {59063, 7047, 21954},
-    {59064, 7048, 21955},
-    {59065, 7049, 21956},
-    {59066, 7050, 21957},
-    {59067, 7051, 21958},
-    {59068, 7052, 20396},
-    {59069, 7053, 21959},
-    {59070, 7054, 21960},
-    {59071, 7055, 21707},
-    {59072, 7056, 21708},
-    {59073, 7057, 21709},
-    {59074, 7058, 21961},
-    {59075, 7059, 21710},
-    {59076, 7060, 21962},
-    {59077, 7061, 21963},
-    {59078, 7062, 20715},
-    {59079, 7063, 21711},
-    {59080, 7064, 21712},
-    {59081, 7065, 21964},
-    {59082, 7066, 21965},
-    {59083, 7067, 21966},
-    {59084, 7068, 20393},
-    {59085, 7069, 20751},
-    {59086, 7070, 21967},
-    {59087, 7071, 21968},
-    {59088, 7072, 21969},
-    {59089, 7073, 21970},
-    {59090, 7074, 21971},
-    {59091, 7075, 21972},
-    {59092, 7076, 21973},
-    {59093, 7077, 20976},
+    {59029, 6919, 20738},
+    {59030, 6920, 21930},
+    {59031, 6921, 21931},
+    {59032, 6922, 21932},
+    {59033, 6923, 21933},
+    {59034, 6924, 21934},
+    {59035, 6925, 21935},
+    {59036, 6926, 21936},
+    {59037, 6927, 21937},
+    {59038, 6928, 21938},
+    {59039, 6929, 21939},
+    {59040, 6930, 21940},
+    {59041, 6931, 21941},
+    {59042, 6932, 21942},
+    {59043, 6933, 21943},
+    {59044, 6934, 21944},
+    {59045, 6935, 21945},
+    {59046, 7030, 21946},
+    {59047, 7031, 21947},
+    {59048, 7032, 21948},
+    {59049, 7033, 21949},
+    {59050, 7034, 21950},
+    {59051, 7035, 21951},
+    {59052, 7036, 21952},
+    {59053, 7037, 21953},
+    {59054, 7038, 21954},
+    {59055, 7039, 21955},
+    {59056, 7040, 21956},
+    {59057, 7041, 21957},
+    {59058, 7042, 21958},
+    {59059, 7043, 21959},
+    {59060, 7044, 21960},
+    {59061, 7045, 21961},
+    {59062, 7046, 21962},
+    {59063, 7047, 21963},
+    {59064, 7048, 21964},
+    {59065, 7049, 21965},
+    {59066, 7050, 21966},
+    {59067, 7051, 21967},
+    {59068, 7052, 20404},
+    {59069, 7053, 21968},
+    {59070, 7054, 21969},
+    {59071, 7055, 21715},
+    {59072, 7056, 21716},
+    {59073, 7057, 21717},
+    {59074, 7058, 21970},
+    {59075, 7059, 21718},
+    {59076, 7060, 21971},
+    {59077, 7061, 21972},
+    {59078, 7062, 20724},
+    {59079, 7063, 21719},
+    {59080, 7064, 21720},
+    {59081, 7065, 21973},
+    {59082, 7066, 21974},
+    {59083, 7067, 21975},
+    {59084, 7068, 20401},
+    {59085, 7069, 20760},
+    {59086, 7070, 21976},
+    {59087, 7071, 21977},
+    {59088, 7072, 21978},
+    {59089, 7073, 21979},
+    {59090, 7074, 21980},
+    {59091, 7075, 21981},
+    {59092, 7076, 21982},
+    {59093, 7077, 20984},
     {59094, 7078, 22576},
-    {59095, 7079, 21974},
-    {59096, 7080, 21975},
-    {59097, 7081, 21976},
-    {59098, 7082, 21977},
-    {59099, 7083, 21978},
-    {59100, 7084, 21979},
-    {59101, 7085, 21980},
-    {59102, 7086, 21981},
-    {59103, 7087, 21982},
-    {59104, 7088, 21983},
-    {59105, 7089, 21984},
-    {59106, 7090, 21985},
-    {59107, 7091, 21986},
-    {59108, 7092, 21987},
-    {59109, 7093, 21988},
-    {59110, 7094, 21989},
-    {59111, 7095, 21990},
-    {59112, 7096, 21991},
-    {59113, 7097, 21992},
-    {59114, 7098, 21993},
-    {59115, 7099, 21994},
-    {59116, 7100, 21995},
-    {59117, 7101, 21996},
-    {59118, 7102, 21997},
-    {59119, 7103, 21998},
-    {59120, 7104, 21999},
-    {59121, 7105, 22000},
-    {59122, 7106, 22001},
-    {59123, 7107, 22002},
-    {59124, 7108, 22003},
-    {59125, 7109, 22004},
-    {59126, 7110, 22005},
-    {59127, 7111, 22006},
-    {59128, 7112, 22007},
-    {59129, 7113, 22008},
-    {59130, 7114, 22009},
+    {59095, 7079, 21983},
+    {59096, 7080, 21984},
+    {59097, 7081, 21985},
+    {59098, 7082, 21986},
+    {59099, 7083, 21987},
+    {59100, 7084, 21988},
+    {59101, 7085, 21989},
+    {59102, 7086, 21990},
+    {59103, 7087, 21991},
+    {59104, 7088, 21992},
+    {59105, 7089, 21993},
+    {59106, 7090, 21994},
+    {59107, 7091, 21995},
+    {59108, 7092, 21996},
+    {59109, 7093, 21997},
+    {59110, 7094, 21998},
+    {59111, 7095, 21999},
+    {59112, 7096, 22000},
+    {59113, 7097, 22001},
+    {59114, 7098, 22002},
+    {59115, 7099, 22003},
+    {59116, 7100, 22004},
+    {59117, 7101, 22005},
+    {59118, 7102, 22006},
+    {59119, 7103, 22007},
+    {59120, 7104, 22008},
+    {59121, 7105, 22009},
+    {59122, 7106, 22010},
+    {59123, 7107, 22011},
+    {59124, 7108, 22012},
+    {59125, 7109, 22013},
+    {59126, 7110, 22014},
+    {59127, 7111, 22015},
+    {59128, 7112, 22016},
+    {59129, 7113, 22017},
+    {59130, 7114, 22018},
     {59131, 7115, 22577},
-    {59132, 7116, 22010},
-    {59133, 7117, 22011},
-    {59134, 7118, 20350},
-    {59135, 7119, 22012},
-    {59136, 7120, 22013},
-    {59137, 7121, 22014},
-    {59138, 7122, 22015},
-    {59139, 7123, 22016},
-    {59140, 7124, 22017},
-    {59141, 7125, 22018},
-    {59142, 7220, 22019},
-    {59143, 7221, 22020},
-    {59144, 7222, 22021},
-    {59145, 7223, 22022},
-    {59146, 7224, 22023},
-    {59147, 7225, 22024},
-    {59148, 7226, 22025},
-    {59149, 7227, 22026},
-    {59150, 7228, 22027},
-    {59151, 7229, 22028},
-    {59152, 7230, 22029},
-    {59153, 7231, 22030},
-    {59154, 7232, 22031},
-    {59155, 7233, 22032},
-    {59156, 7234, 22033},
-    {59157, 7235, 22034},
-    {59158, 7236, 22035},
-    {59159, 7237, 22036},
-    {59160, 7238, 22037},
-    {59161, 7239, 22038},
-    {59162, 7240, 22039},
-    {59163, 7241, 22040},
+    {59132, 7116, 22019},
+    {59133, 7117, 22020},
+    {59134, 7118, 20357},
+    {59135, 7119, 22021},
+    {59136, 7120, 22022},
+    {59137, 7121, 22023},
+    {59138, 7122, 22024},
+    {59139, 7123, 22025},
+    {59140, 7124, 22026},
+    {59141, 7125, 22027},
+    {59142, 7220, 22028},
+    {59143, 7221, 22029},
+    {59144, 7222, 22030},
+    {59145, 7223, 22031},
+    {59146, 7224, 22032},
+    {59147, 7225, 22033},
+    {59148, 7226, 22034},
+    {59149, 7227, 22035},
+    {59150, 7228, 22036},
+    {59151, 7229, 22037},
+    {59152, 7230, 22038},
+    {59153, 7231, 22039},
+    {59154, 7232, 22040},
+    {59155, 7233, 22041},
+    {59156, 7234, 22042},
+    {59157, 7235, 22043},
+    {59158, 7236, 22044},
+    {59159, 7237, 22045},
+    {59160, 7238, 22046},
+    {59161, 7239, 22047},
+    {59162, 7240, 22048},
+    {59163, 7241, 22049},
     {59164, 7242, 22578},
-    {59165, 7243, 22041},
-    {59166, 7244, 22042},
-    {59167, 7245, 22043},
-    {59168, 7246, 22044},
-    {59169, 7247, 22045},
-    {59170, 7248, 22046},
-    {59171, 7249, 22047},
-    {59172, 7250, 22048},
-    {59173, 7251, 22049},
-    {59174, 7252, 22050},
-    {59175, 7253, 22051},
-    {59176, 7254, 22052},
-    {59177, 7255, 22053},
-    {59178, 7256, 22054},
-    {59179, 7257, 22055},
-    {59180, 7258, 22056},
-    {59181, 7259, 22057},
-    {59182, 7260, 22058},
-    {59183, 7261, 22059},
-    {59184, 7262, 22060},
-    {59185, 7263, 22061},
-    {59186, 7264, 22062},
-    {59187, 7265, 22063},
-    {59188, 7266, 22064},
-    {59189, 7267, 22065},
-    {59190, 7268, 22066},
-    {59191, 7269, 22067},
-    {59192, 7270, 22068},
-    {59193, 7271, 22069},
-    {59194, 7272, 22070},
-    {59195, 7273, 22071},
-    {59196, 7274, 22072},
-    {59197, 7275, 22073},
-    {59198, 7276, 22074},
-    {59199, 7277, 22075},
-    {59200, 7278, 22076},
-    {59201, 7279, 22077},
+    {59165, 7243, 22050},
+    {59166, 7244, 22051},
+    {59167, 7245, 22052},
+    {59168, 7246, 22053},
+    {59169, 7247, 22054},
+    {59170, 7248, 22055},
+    {59171, 7249, 22056},
+    {59172, 7250, 22057},
+    {59173, 7251, 22058},
+    {59174, 7252, 22059},
+    {59175, 7253, 22060},
+    {59176, 7254, 22061},
+    {59177, 7255, 22062},
+    {59178, 7256, 22063},
+    {59179, 7257, 22064},
+    {59180, 7258, 22065},
+    {59181, 7259, 22066},
+    {59182, 7260, 22067},
+    {59183, 7261, 22068},
+    {59184, 7262, 22069},
+    {59185, 7263, 22070},
+    {59186, 7264, 22071},
+    {59187, 7265, 22072},
+    {59188, 7266, 22073},
+    {59189, 7267, 22074},
+    {59190, 7268, 22075},
+    {59191, 7269, 22076},
+    {59192, 7270, 22077},
+    {59193, 7271, 22078},
+    {59194, 7272, 22079},
+    {59195, 7273, 22080},
+    {59196, 7274, 22081},
+    {59197, 7275, 22082},
+    {59198, 7276, 22083},
+    {59199, 7277, 22084},
+    {59200, 7278, 22085},
+    {59201, 7279, 22086},
     {59202, 7280, 22580},
     {59203, 7281, 22579},
-    {59204, 7282, 22078},
-    {59205, 7283, 22079},
-    {59206, 7284, 22080},
-    {59207, 7285, 22081},
-    {59208, 7286, 22082},
-    {59209, 7287, 22083},
-    {59210, 7288, 22084},
-    {59211, 7289, 22085},
-    {59212, 7290, 22086},
-    {59213, 7291, 22087},
-    {59214, 7292, 22088},
-    {59215, 7293, 22089},
-    {59216, 7294, 22090},
-    {59217, 7295, 20977},
-    {59218, 7296, 22091},
-    {59219, 7297, 20433},
-    {59220, 7298, 22092},
-    {59221, 7299, 20978},
-    {59222, 7300, 20979},
-    {59223, 7301, 20980},
-    {59224, 7302, 20981},
-    {59225, 7303, 20982},
-    {59226, 7304, 20983},
-    {59227, 7305, 20390},
-    {59228, 7306, 20820},
-    {59229, 7307, 20444},
-    {59230, 7308, 20753},
-    {59231, 7309, 20339},
-    {59232, 7310, 20760},
-    {59233, 7311, 22093},
-    {59234, 7312, 20984},
-    {59235, 7313, 20387},
-    {59236, 7314, 20732},
-    {59237, 7315, 20985},
-    {59238, 6376, 22094},
-    {59239, 6377, 22095},
-    {59240, 6378, 20446},
-    {59241, 6379, 22096},
-    {59242, 6380, 20346},
-    {59243, 6381, 20986},
+    {59204, 7282, 22087},
+    {59205, 7283, 22088},
+    {59206, 7284, 22089},
+    {59207, 7285, 22090},
+    {59208, 7286, 22091},
+    {59209, 7287, 22092},
+    {59210, 7288, 22093},
+    {59211, 7289, 22094},
+    {59212, 7290, 22095},
+    {59213, 7291, 22096},
+    {59214, 7292, 22097},
+    {59215, 7293, 22098},
+    {59216, 7294, 22099},
+    {59217, 7295, 20985},
+    {59218, 7296, 22100},
+    {59219, 7297, 20442},
+    {59220, 7298, 22101},
+    {59221, 7299, 20986},
+    {59222, 7300, 20987},
+    {59223, 7301, 20988},
+    {59224, 7302, 20989},
+    {59225, 7303, 20990},
+    {59226, 7304, 20991},
+    {59227, 7305, 20398},
+    {59228, 7306, 20829},
+    {59229, 7307, 20453},
+    {59230, 7308, 20762},
+    {59231, 7309, 20346},
+    {59232, 7310, 20769},
+    {59233, 7311, 22102},
+    {59234, 7312, 20992},
+    {59235, 7313, 20395},
+    {59236, 7314, 20741},
+    {59237, 7315, 20993},
+    {59238, 6376, 22103},
+    {59239, 6377, 22104},
+    {59240, 6378, 20455},
+    {59241, 6379, 22105},
+    {59242, 6380, 20353},
+    {59243, 6381, 20994},
     {39294, 21182, 0},
-    {59245, 6433, 20386},
-    {59246, 6444, 20987},
-    {59247, 6445, 20696},
-    {59248, 6458, 22097},
-    {59249, 6459, 22098},
-    {59250, 6829, 20988},
-    {59251, 6830, 20793},
-    {59252, 6831, 20413},
-    {59253, 6832, 20989},
-    {59254, 6833, 20632},
-    {59255, 6834, 22099},
-    {59256, 6835, 20990},
-    {59257, 6836, 20352},
-    {59258, 6837, 22145},
-    {59259, 6838, 20991},
-    {59260, 6839, 22146},
-    {59261, 7022, 20654},
-    {59262, 7023, 20992},
-    {59263, 7024, 20993},
-    {59264, 7025, 20673},
-    {59265, 7026, 20994},
-    {59266, 7027, 20995},
-    {59267, 7028, 20996},
-    {59268, 7029, 20754},
-    {59269, 7150, 20857},
-    {59270, 7151, 20880},
-    {59271, 7152, 20795},
-    {59272, 7153, 22147},
-    {59273, 7154, 22148},
-    {59274, 7155, 22149},
-    {59275, 7156, 22150},
-    {59276, 7157, 22151},
-    {59277, 7182, 22152},
-    {59278, 7183, 22153},
-    {59279, 7184, 22154},
-    {59280, 7185, 22155},
-    {59281, 7186, 22156},
-    {59282, 7187, 22157},
-    {59283, 7188, 22101},
-    {59284, 7201, 22158},
-    {59285, 7202, 22159},
-    {59286, 7208, 20888},
+    {59245, 6433, 20394},
+    {59246, 6444, 20995},
+    {59247, 6445, 20705},
+    {59248, 6458, 22106},
+    {59249, 6459, 22107},
+    {59250, 6829, 20996},
+    {59251, 6830, 20802},
+    {59252, 6831, 20421},
+    {59253, 6832, 20997},
+    {59254, 6833, 20641},
+    {59255, 6834, 22108},
+    {59256, 6835, 20998},
+    {59257, 6836, 20359},
+    {59258, 6837, 22153},
+    {59259, 6838, 20999},
+    {59260, 6839, 22154},
+    {59261, 7022, 20663},
+    {59262, 7023, 21000},
+    {59263, 7024, 21001},
+    {59264, 7025, 20682},
+    {59265, 7026, 21002},
+    {59266, 7027, 21003},
+    {59267, 7028, 21004},
+    {59268, 7029, 20763},
+    {59269, 7150, 20866},
+    {59270, 7151, 20889},
+    {59271, 7152, 20804},
+    {59272, 7153, 22155},
+    {59273, 7154, 22156},
+    {59274, 7155, 22157},
+    {59275, 7156, 22158},
+    {59276, 7157, 22159},
+    {39327, 21287, 0},
+    {39328, 21288, 0},
+    {39329, 21289, 0},
+    {39330, 21290, 0},
+    {39331, 21291, 0},
+    {39332, 21292, 0},
+    {39333, 21190, 0},
+    {39334, 21293, 0},
+    {39335, 21294, 0},
+    {39336, 17401, 0},
     {59287, 7211, 22160},
     {59288, 7212, 22161},
     {59289, 7213, 22162},
@@ -43484,7 +43484,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {39469, 21521, 0},
     {39470, 21522, 0},
     {39471, 21523, 0},
-    {39472, 21524, 23776},
+    {39472, 21524, 0},
     {39473, 21525, 0},
     {39474, 21526, 0},
     {39475, 21527, 0},
@@ -43492,19 +43492,19 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {39477, 21529, 0},
     {39478, 21530, 0},
     {39479, 21531, 0},
-    {39480, 21532, 23784},
+    {39480, 21532, 0},
     {39481, 21533, 0},
     {39482, 21534, 0},
     {39483, 21535, 0},
     {39484, 21536, 0},
-    {39485, 21537, 23789},
-    {39486, 21538, 23790},
+    {39485, 21537, 0},
+    {39486, 21538, 0},
     {39487, 21539, 0},
     {39488, 21540, 0},
     {39489, 21541, 0},
     {39490, 21542, 0},
     {39491, 21543, 23795},
-    {39492, 21544, 23796},
+    {39492, 21544, 0},
     {39493, 21545, 0},
     {39494, 21546, 0},
     {39495, 21547, 0},
@@ -43521,7 +43521,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {39506, 21558, 0},
     {39507, 21559, 0},
     {39508, 21560, 0},
-    {39509, 21561, 23813},
+    {39509, 21561, 0},
     {39510, 21562, 0},
     {39511, 21563, 0},
     {39512, 21564, 0},
@@ -43538,7 +43538,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {39523, 21669, 0},
     {39524, 21670, 0},
     {39525, 21671, 23836},
-    {39526, 21672, 23830},
+    {39526, 21672, 0},
     {39527, 21673, 23831},
     {39528, 21674, 0},
     {39529, 21675, 0},
@@ -43554,7 +43554,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {39539, 9426, 0},
     {39540, 12476, 0},
     {39541, 19349, 0},
-    {39542, 13992, 23846},
+    {39542, 13992, 0},
     {39543, 19350, 0},
     {39544, 19351, 0},
     {39545, 11737, 0},
@@ -44009,7 +44009,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {8552, 6454, 0},
     {8553, 6455, 0},
     {8555, 6457, 0},
-    {12288, 6555, 20464},
+    {12288, 6555, 20473},
     {65282, 6557, 0},
     {65283, 6558, 0},
     {65509, 6559, 0},
@@ -44078,7 +44078,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {925, 7138, 23624},
     {928, 7141, 23627},
     {929, 7142, 23628},
-    {931, 7143, 20359},
+    {931, 7143, 20366},
     {933, 7145, 23630},
     {934, 7146, 23631},
     {945, 7158, 23632},
@@ -44089,9 +44089,14 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {954, 7167, 23641},
     {955, 7168, 23642},
     {956, 7169, 23643},
-    {959, 7172, 21809},
+    {959, 7172, 21818},
     {960, 7173, 23644},
     {966, 7178, 23648},
+    {65042, 7183, 0},
+    {65041, 7184, 0},
+    {65044, 7186, 0},
+    {65045, 7187, 0},
+    {65046, 7188, 0},
     {65077, 7189, 0},
     {65078, 7190, 0},
     {65081, 7191, 0},
@@ -44101,6 +44106,8 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {65086, 7196, 0},
     {65089, 7197, 0},
     {65092, 7200, 0},
+    {65047, 7201, 0},
+    {65048, 7202, 0},
     {65083, 7203, 0},
     {65084, 7204, 0},
     {65080, 7206, 0},
@@ -44134,7 +44141,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {1094, 7387, 0},
     {1095, 7388, 0},
     {1102, 7395, 0},
-    {714, 7410, 20672},
+    {714, 7410, 20681},
     {715, 7411, 23273},
     {729, 7412, 23380},
     {8211, 7413, 0},
@@ -44164,7 +44171,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {249, 7525, 22557},
     {472, 7527, 23008},
     {474, 7528, 23010},
-    {593, 7532, 20809},
+    {593, 7532, 20818},
     {7743, 7533, 0},
     {505, 7536, 23041},
     {65506, 7622, 0},
@@ -44301,11 +44308,11 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {32465, 9108, 0},
     {38649, 9217, 0},
     {39281, 9220, 0},
-    {40077, 9226, 20859},
+    {40077, 9226, 20868},
     {32503, 9248, 0},
     {38829, 9277, 0},
     {32534, 9279, 0},
-    {40150, 9293, 20870},
+    {40150, 9293, 20879},
     {21035, 9295, 0},
     {39292, 9308, 0},
     {33162, 9423, 0},
@@ -44321,7 +44328,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {28548, 9641, 0},
     {25215, 9643, 0},
     {40831, 9656, 0},
-    {20914, 9664, 20878},
+    {20914, 9664, 20887},
     {32504, 9676, 0},
     {21021, 9680, 0},
     {21019, 9805, 0},
@@ -44330,6 +44337,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {21050, 9829, 0},
     {20174, 9836, 22446},
     {25387, 9861, 0},
+    {25140, 9872, 0},
     {20992, 9997, 0},
     {25443, 9998, 0},
     {21040, 10004, 0},
@@ -44340,7 +44348,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20993, 10058, 0},
     {39030, 10170, 0},
     {40718, 10171, 0},
-    {20908, 10177, 20408},
+    {20908, 10177, 20416},
     {28193, 10206, 0},
     {32526, 10213, 0},
     {39039, 10222, 0},
@@ -44365,7 +44373,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {21018, 10598, 0},
     {32434, 10602, 0},
     {33167, 10609, 0},
-    {40509, 10620, 20714},
+    {40509, 10620, 20723},
     {38761, 10624, 0},
     {32473, 10633, 0},
     {32789, 10636, 0},
@@ -44375,7 +44383,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {21038, 10781, 0},
     {20896, 10793, 23633},
     {39302, 10796, 0},
-    {40863, 10809, 20883},
+    {40863, 10809, 20892},
     {21053, 10819, 0},
     {20133, 10930, 22527},
     {38889, 10936, 0},
@@ -44386,6 +44394,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {32418, 11001, 0},
     {29492, 11004, 0},
     {20114, 11120, 22520},
+    {25143, 11122, 0},
     {29502, 11126, 0},
     {21010, 11129, 0},
     {32531, 11141, 0},
@@ -44612,12 +44621,12 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {29454, 12307, 0},
     {38678, 12311, 0},
     {38646, 12322, 0},
-    {40836, 12323, 20884},
+    {40836, 12323, 20893},
     {20278, 12325, 22676},
     {39046, 12331, 0},
     {39311, 12338, 0},
     {21016, 12340, 0},
-    {40857, 12345, 20882},
+    {40857, 12345, 20891},
     {32782, 12374, 0},
     {32783, 12375, 0},
     {32785, 12376, 0},
@@ -44849,7 +44858,6 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {20898, 17008, 23635},
     {20901, 17009, 23638},
     {21005, 17222, 0},
-    {39336, 17401, 0},
     {40729, 17402, 0},
     {25401, 17823, 0},
     {25419, 17824, 0},
@@ -45675,6 +45683,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {39129, 20438, 0},
     {39130, 20439, 0},
     {40785, 20445, 0},
+    {25149, 20495, 0},
     {38814, 20520, 0},
     {38815, 20521, 0},
     {38817, 20522, 0},
@@ -46062,7 +46071,6 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {39299, 21184, 0},
     {39305, 21185, 0},
     {40655, 21189, 0},
-    {39333, 21190, 0},
     {40480, 21200, 0},
     {40482, 21201, 0},
     {40488, 21202, 0},
@@ -46113,14 +46121,6 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {39324, 21284, 0},
     {39325, 21285, 0},
     {39326, 21286, 0},
-    {39327, 21287, 0},
-    {39328, 21288, 0},
-    {39329, 21289, 0},
-    {39330, 21290, 0},
-    {39331, 21291, 0},
-    {39332, 21292, 0},
-    {39334, 21293, 0},
-    {39335, 21294, 0},
     {39337, 21295, 0},
     {39338, 21296, 0},
     {39339, 21297, 0},
@@ -47737,7 +47737,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {13383, 23772, 0},
     {11912, 23773, 0},
     {11915, 23774, 0},
-    {59422, 23775, 0},
+    {40884, 23775, 0},
     {13726, 23776, 0},
     {13850, 23777, 0},
     {13838, 23778, 0},
@@ -47745,19 +47745,19 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {11927, 23780, 0},
     {14702, 23781, 0},
     {14616, 23782, 0},
-    {59430, 23783, 0},
+    {40885, 23783, 0},
     {14799, 23784, 0},
     {14815, 23785, 0},
     {14963, 23786, 0},
     {14800, 23787, 0},
-    {59435, 23788, 0},
-    {59436, 23789, 0},
+    {40886, 23788, 0},
+    {40887, 23789, 0},
     {15182, 23790, 0},
     {15470, 23791, 0},
     {15584, 23792, 0},
     {11943, 23793, 0},
     {59441, 23794, 0},
-    {59442, 23795, 0},
+    {40888, 23795, 0},
     {11946, 23796, 0},
     {16470, 23797, 0},
     {16735, 23798, 0},
@@ -47774,7 +47774,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {17622, 23809, 0},
     {18017, 23810, 0},
     {17996, 23811, 0},
-    {59459, 23812, 0},
+    {40889, 23812, 0},
     {18211, 23813, 0},
     {18217, 23814, 0},
     {18300, 23815, 0},
@@ -47791,7 +47791,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {18843, 23826, 0},
     {18871, 23827, 0},
     {18870, 23828, 0},
-    {59476, 23829, 0},
+    {40890, 23829, 0},
     {59477, 23830, 0},
     {19619, 23831, 0},
     {19615, 23832, 0},
@@ -47807,7 +47807,7 @@ LXB_API const lexbor_shs_hash_t lxb_encoding_multi_hash_gb18030[23941] =
     {19736, 23842, 0},
     {19737, 23843, 0},
     {19886, 23844, 0},
-    {59492, 23845, 0},
+    {40891, 23845, 0},
     {58472, 23846, 0},
     {58473, 23847, 0},
     {58474, 23848, 0},
diff --git a/ext/dom/lexbor/lexbor/encoding/iso_2022_jp_katakana.c b/ext/dom/lexbor/lexbor/encoding/iso_2022_jp_katakana.c
index c9771d5cdcfb5..dcd97f90d60d3 100644
--- a/ext/dom/lexbor/lexbor/encoding/iso_2022_jp_katakana.c
+++ b/ext/dom/lexbor/lexbor/encoding/iso_2022_jp_katakana.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2024 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/dom/lexbor/lexbor/encoding/jis0208.c b/ext/dom/lexbor/lexbor/encoding/jis0208.c
index 1d0c51abd6b56..b86eef3cf7a5b 100644
--- a/ext/dom/lexbor/lexbor/encoding/jis0208.c
+++ b/ext/dom/lexbor/lexbor/encoding/jis0208.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2024 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/dom/lexbor/lexbor/encoding/jis0212.c b/ext/dom/lexbor/lexbor/encoding/jis0212.c
index 74843bb9eac27..44500e80f0ca3 100644
--- a/ext/dom/lexbor/lexbor/encoding/jis0212.c
+++ b/ext/dom/lexbor/lexbor/encoding/jis0212.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 Alexander Borisov
+ * Copyright (C) 2024 Alexander Borisov
  *
  * Author: Alexander Borisov 
  */
diff --git a/ext/dom/node.c b/ext/dom/node.c
index 57009a539a1cd..1a433468ede35 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -740,11 +740,68 @@ zend_result dom_node_text_content_write(dom_object *obj, zval *newval)
 
 /* }}} */
 
-static xmlNodePtr dom_insert_fragment(xmlNodePtr nodep, xmlNodePtr prevsib, xmlNodePtr nextsib, xmlNodePtr fragment, dom_object *intern) /* {{{ */
+/* Returns true if the node had the same document reference, false otherwise. */
+static bool dom_set_document_ref_obj_single(xmlNodePtr node, php_libxml_ref_obj *document)
+{
+	dom_object *childobj = php_dom_object_get_data(node);
+	if (!childobj) {
+		return true;
+	}
+	if (!childobj->document) {
+		childobj->document = document;
+		document->refcount++;
+		return true;
+	}
+	return false;
+}
+
+void dom_set_document_ref_pointers_attr(xmlAttrPtr attr, php_libxml_ref_obj *document)
+{
+	ZEND_ASSERT(document != NULL);
+
+	dom_set_document_ref_obj_single((xmlNodePtr) attr, document);
+	for (xmlNodePtr attr_child = attr->children; attr_child; attr_child = attr_child->next) {
+		dom_set_document_ref_obj_single(attr_child, document);
+	}
+}
+
+static bool dom_set_document_ref_pointers_node(xmlNodePtr node, php_libxml_ref_obj *document)
 {
-	xmlNodePtr newchild, node;
+	ZEND_ASSERT(document != NULL);
+
+	if (!dom_set_document_ref_obj_single(node, document)) {
+		return false;
+	}
+
+	if (node->type == XML_ELEMENT_NODE) {
+		for (xmlAttrPtr attr = node->properties; attr; attr = attr->next) {
+			dom_set_document_ref_pointers_attr(attr, document);
+		}
+	}
+
+	return true;
+}
+
+void dom_set_document_ref_pointers(xmlNodePtr node, php_libxml_ref_obj *document)
+{
+	if (!document) {
+		return;
+	}
 
-	newchild = fragment->children;
+	if (!dom_set_document_ref_pointers_node(node, document)) {
+		return;
+	}
+
+	xmlNodePtr base = node;
+	node = node->children;
+	while (node != NULL && dom_set_document_ref_pointers_node(node, document)) {
+		node = php_dom_next_in_tree_order(node, base);
+	}
+}
+
+static xmlNodePtr dom_insert_fragment(xmlNodePtr nodep, xmlNodePtr prevsib, xmlNodePtr nextsib, xmlNodePtr fragment, dom_object *intern) /* {{{ */
+{
+	xmlNodePtr newchild = fragment->children;
 
 	if (newchild) {
 		if (prevsib == NULL) {
@@ -760,17 +817,10 @@ static xmlNodePtr dom_insert_fragment(xmlNodePtr nodep, xmlNodePtr prevsib, xmlN
 			nextsib->prev = fragment->last;
 		}
 
-		node = newchild;
+		/* Assign parent node pointer */
+		xmlNodePtr node = newchild;
 		while (node != NULL) {
 			node->parent = nodep;
-			if (node->doc != nodep->doc) {
-				xmlSetTreeDoc(node, nodep->doc);
-				dom_object *childobj = node->_private;
-				if (childobj != NULL) {
-					childobj->document = intern->document;
-					php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL);
-				}
-			}
 			if (node == fragment->last) {
 				break;
 			}
@@ -785,43 +835,57 @@ static xmlNodePtr dom_insert_fragment(xmlNodePtr nodep, xmlNodePtr prevsib, xmlN
 }
 /* }}} */
 
-/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727
-Since:
-*/
-static void dom_node_insert_before_legacy(zval *return_value, zval *ref, dom_object *intern, dom_object *childobj, xmlNodePtr parentp, xmlNodePtr child)
+static bool dom_node_check_legacy_insertion_validity(xmlNodePtr parentp, xmlNodePtr child, bool stricterror, bool warn_empty_fragment)
 {
-	if (!dom_node_children_valid(parentp)) {
-		RETURN_FALSE;
-	}
-
-	xmlNodePtr new_child = NULL;
-	bool stricterror = dom_get_strict_error(intern->document);
-
 	if (dom_node_is_read_only(parentp) == SUCCESS ||
 		(child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
 		php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror);
-		RETURN_FALSE;
+		return false;
 	}
 
 	if (dom_hierarchy(parentp, child) == FAILURE) {
 		php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror);
-		RETURN_FALSE;
+		return false;
 	}
 
 	if (child->doc != parentp->doc && child->doc != NULL) {
 		php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror);
-		RETURN_FALSE;
+		return false;
 	}
 
-	if (child->type == XML_DOCUMENT_FRAG_NODE && child->children == NULL) {
+	if (warn_empty_fragment && child->type == XML_DOCUMENT_FRAG_NODE && child->children == NULL) {
 		/* TODO Drop Warning? */
 		php_error_docref(NULL, E_WARNING, "Document Fragment is empty");
+		return false;
+	}
+
+	/* In old DOM only text nodes and entity nodes can be added as children to attributes. */
+	if (parentp->type == XML_ATTRIBUTE_NODE && child->type != XML_TEXT_NODE && child->type != XML_ENTITY_REF_NODE) {
+		php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror);
+		return false;
+	}
+
+	return true;
+}
+
+/* {{{ URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-952280727
+Since:
+*/
+static void dom_node_insert_before_legacy(zval *return_value, zval *ref, dom_object *intern, dom_object *childobj, xmlNodePtr parentp, xmlNodePtr child)
+{
+	if (!dom_node_children_valid(parentp)) {
+		RETURN_FALSE;
+	}
+
+	xmlNodePtr new_child = NULL;
+	bool stricterror = dom_get_strict_error(intern->document);
+
+	if (!dom_node_check_legacy_insertion_validity(parentp, child, stricterror, true)) {
 		RETURN_FALSE;
 	}
 
 	if (child->doc == NULL && parentp->doc != NULL) {
-		childobj->document = intern->document;
-		php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL);
+		dom_set_document_ref_pointers(child, intern->document);
 	}
 
 	php_libxml_invalidate_node_list_cache(intern->document);
@@ -841,9 +905,6 @@ static void dom_node_insert_before_legacy(zval *return_value, zval *ref, dom_obj
 
 		if (child->type == XML_TEXT_NODE && (refp->type == XML_TEXT_NODE ||
 			(refp->prev != NULL && refp->prev->type == XML_TEXT_NODE))) {
-			if (child->doc == NULL) {
-				xmlSetTreeDoc(child, parentp->doc);
-			}
 			new_child = child;
 			new_child->parent = refp->parent;
 			new_child->next = refp;
@@ -895,9 +956,6 @@ static void dom_node_insert_before_legacy(zval *return_value, zval *ref, dom_obj
 		}
 		if (child->type == XML_TEXT_NODE && parentp->last != NULL && parentp->last->type == XML_TEXT_NODE) {
 			child->parent = parentp;
-			if (child->doc == NULL) {
-				xmlSetTreeDoc(child, parentp->doc);
-			}
 			new_child = child;
 			if (parentp->children == NULL) {
 				parentp->children = child;
@@ -1123,14 +1181,7 @@ static void dom_node_replace_child(INTERNAL_FUNCTION_PARAMETERS, bool modern)
 			RETURN_FALSE;
 		}
 
-		if (dom_node_is_read_only(nodep) == SUCCESS ||
-			(newchild->parent != NULL && dom_node_is_read_only(newchild->parent) == SUCCESS)) {
-			php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror);
-			RETURN_FALSE;
-		}
-
-		if (dom_hierarchy(nodep, newchild) == FAILURE) {
-			php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror);
+		if (!dom_node_check_legacy_insertion_validity(nodep, newchild, stricterror, false)) {
 			RETURN_FALSE;
 		}
 
@@ -1140,6 +1191,10 @@ static void dom_node_replace_child(INTERNAL_FUNCTION_PARAMETERS, bool modern)
 		}
 	}
 
+	if (newchild->doc == NULL && nodep->doc != NULL) {
+		dom_set_document_ref_pointers(newchild, intern->document);
+	}
+
 	if (newchild->type == XML_DOCUMENT_FRAG_NODE) {
 		xmlNodePtr prevsib, nextsib;
 		prevsib = oldchild->prev;
@@ -1156,11 +1211,6 @@ static void dom_node_replace_child(INTERNAL_FUNCTION_PARAMETERS, bool modern)
 		xmlDtdPtr intSubset = xmlGetIntSubset(nodep->doc);
 		bool replacedoctype = (intSubset == (xmlDtd *) oldchild);
 
-		if (newchild->doc == NULL && nodep->doc != NULL) {
-			xmlSetTreeDoc(newchild, nodep->doc);
-			newchildobj->document = intern->document;
-			php_libxml_increment_doc_ref((php_libxml_node_object *)newchildobj, NULL);
-		}
 		xmlReplaceNode(oldchild, newchild);
 		if (!modern) {
 			dom_reconcile_ns(nodep->doc, newchild);
@@ -1245,31 +1295,12 @@ static void dom_node_append_child_legacy(zval *return_value, dom_object *intern,
 
 	bool stricterror = dom_get_strict_error(intern->document);
 
-	if (dom_node_is_read_only(nodep) == SUCCESS ||
-		(child->parent != NULL && dom_node_is_read_only(child->parent) == SUCCESS)) {
-		php_dom_throw_error(NO_MODIFICATION_ALLOWED_ERR, stricterror);
-		RETURN_FALSE;
-	}
-
-	if (dom_hierarchy(nodep, child) == FAILURE) {
-		php_dom_throw_error(HIERARCHY_REQUEST_ERR, stricterror);
-		RETURN_FALSE;
-	}
-
-	if (!(child->doc == NULL || child->doc == nodep->doc)) {
-		php_dom_throw_error(WRONG_DOCUMENT_ERR, stricterror);
-		RETURN_FALSE;
-	}
-
-	if (child->type == XML_DOCUMENT_FRAG_NODE && child->children == NULL) {
-		/* TODO Drop Warning? */
-		php_error_docref(NULL, E_WARNING, "Document Fragment is empty");
+	if (!dom_node_check_legacy_insertion_validity(nodep, child, stricterror, true)) {
 		RETURN_FALSE;
 	}
 
 	if (child->doc == NULL && nodep->doc != NULL) {
-		childobj->document = intern->document;
-		php_libxml_increment_doc_ref((php_libxml_node_object *)childobj, NULL);
+		dom_set_document_ref_pointers(child, intern->document);
 	}
 
 	if (child->parent != NULL){
@@ -1278,9 +1309,6 @@ static void dom_node_append_child_legacy(zval *return_value, dom_object *intern,
 
 	if (child->type == XML_TEXT_NODE && nodep->last != NULL && nodep->last->type == XML_TEXT_NODE) {
 		child->parent = nodep;
-		if (child->doc == NULL) {
-			xmlSetTreeDoc(child, nodep->doc);
-		}
 		new_child = child;
 		if (nodep->children == NULL) {
 			nodep->children = child;
@@ -2551,7 +2579,7 @@ PHP_METHOD(Dom_Node, compareDocumentPosition)
 
 PHP_METHOD(Dom_Node, __construct)
 {
-	ZEND_UNREACHABLE();
+	zend_throw_error(NULL, "Cannot directly construct %s, use document methods instead", ZSTR_VAL(Z_OBJCE_P(ZEND_THIS)->name));
 }
 
 PHP_METHOD(DOMNode, __sleep)
diff --git a/ext/dom/parentnode/tree.c b/ext/dom/parentnode/tree.c
index e3de2b9bfff03..ef1ad42b68c86 100644
--- a/ext/dom/parentnode/tree.c
+++ b/ext/dom/parentnode/tree.c
@@ -379,6 +379,11 @@ xmlNode* dom_zvals_to_single_node(php_libxml_ref_obj *document, xmlNode *context
 			newNodeObj = Z_DOMOBJ_P(&nodes[i]);
 			newNode = dom_object_get_node(newNodeObj);
 
+			if (UNEXPECTED(!newNode)) {
+				php_dom_throw_error(INVALID_STATE_ERR, /* strict */ true);
+				goto err;
+			}
+
 			if (!dom_is_pre_insert_valid_without_step_1(document, node, newNode, NULL, documentNode)) {
 				goto err;
 			}
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index 8198afe5b8bad..0593700d32016 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -451,12 +451,9 @@ zval *dom_write_property(zend_object *object, zend_string *name, zval *value, vo
 static int dom_property_exists(zend_object *object, zend_string *name, int check_empty, void **cache_slot)
 {
 	dom_object *obj = php_dom_obj_from_obj(object);
-	dom_prop_handler *hnd = NULL;
 	bool retval = false;
+	const dom_prop_handler *hnd = dom_get_prop_handler(obj, name, cache_slot);
 
-	if (obj->prop_handler != NULL) {
-		hnd = zend_hash_find_ptr(obj->prop_handler, name);
-	}
 	if (hnd) {
 		zval tmp;
 
@@ -478,6 +475,18 @@ static int dom_property_exists(zend_object *object, zend_string *name, int check
 }
 /* }}} */
 
+static void dom_unset_property(zend_object *object, zend_string *member, void **cache_slot)
+{
+	dom_object *obj = php_dom_obj_from_obj(object);
+
+	if (obj->prop_handler != NULL && zend_hash_exists(obj->prop_handler, member)) {
+		zend_throw_error(NULL, "Cannot unset %s::$%s", ZSTR_VAL(object->ce->name), ZSTR_VAL(member));
+		return;
+	}
+
+	zend_std_unset_property(object, member, cache_slot);
+}
+
 static HashTable* dom_get_debug_info_helper(zend_object *object, int *is_temp) /* {{{ */
 {
 	dom_object			*obj = php_dom_obj_from_obj(object);
@@ -755,6 +764,7 @@ PHP_MINIT_FUNCTION(dom)
 	dom_object_handlers.read_property = dom_read_property;
 	dom_object_handlers.write_property = dom_write_property;
 	dom_object_handlers.get_property_ptr_ptr = dom_get_property_ptr_ptr;
+	dom_object_handlers.unset_property = dom_unset_property;
 	dom_object_handlers.clone_obj = dom_objects_store_clone_obj;
 	dom_object_handlers.has_property = dom_property_exists;
 	dom_object_handlers.get_debug_info = dom_get_debug_info;
@@ -950,7 +960,7 @@ PHP_MINIT_FUNCTION(dom)
 	DOM_REGISTER_PROP_HANDLER(&dom_document_prop_handlers, "resolveExternals", dom_document_resolve_externals_read, dom_document_resolve_externals_write);
 	DOM_REGISTER_PROP_HANDLER(&dom_document_prop_handlers, "preserveWhiteSpace", dom_document_preserve_whitespace_read, dom_document_preserve_whitespace_write);
 	DOM_REGISTER_PROP_HANDLER(&dom_document_prop_handlers, "recover", dom_document_recover_read, dom_document_recover_write);
-	DOM_REGISTER_PROP_HANDLER(&dom_document_prop_handlers, "substituteEntities", dom_document_substitue_entities_read, dom_document_substitue_entities_write);
+	DOM_REGISTER_PROP_HANDLER(&dom_document_prop_handlers, "substituteEntities", dom_document_substitute_entities_read, dom_document_substitute_entities_write);
 	DOM_REGISTER_PROP_HANDLER(&dom_document_prop_handlers, "firstElementChild", dom_parent_node_first_element_child_read, NULL);
 	DOM_REGISTER_PROP_HANDLER(&dom_document_prop_handlers, "lastElementChild", dom_parent_node_last_element_child_read, NULL);
 	DOM_REGISTER_PROP_HANDLER(&dom_document_prop_handlers, "childElementCount", dom_parent_node_child_element_count, NULL);
@@ -1111,6 +1121,7 @@ PHP_MINIT_FUNCTION(dom)
 	DOM_REGISTER_PROP_HANDLER(&dom_modern_element_prop_handlers, "previousElementSibling", dom_node_previous_element_sibling_read, NULL);
 	DOM_REGISTER_PROP_HANDLER(&dom_modern_element_prop_handlers, "nextElementSibling", dom_node_next_element_sibling_read, NULL);
 	DOM_REGISTER_PROP_HANDLER(&dom_modern_element_prop_handlers, "innerHTML", dom_element_inner_html_read, dom_element_inner_html_write);
+	DOM_REGISTER_PROP_HANDLER(&dom_modern_element_prop_handlers, "outerHTML", dom_element_outer_html_read, dom_element_outer_html_write);
 	DOM_REGISTER_PROP_HANDLER(&dom_modern_element_prop_handlers, "substitutedNodeValue", dom_modern_element_substituted_node_value_read, dom_modern_element_substituted_node_value_write);
 	zend_hash_merge(&dom_modern_element_prop_handlers, &dom_modern_node_prop_handlers, NULL, false);
 	DOM_OVERWRITE_PROP_HANDLER(&dom_modern_element_prop_handlers, "textContent", dom_node_text_content_read, dom_node_text_content_write);
@@ -1463,7 +1474,7 @@ void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xml
 	const xmlChar* tmp;
 
 	if (local) {
-		int len = local_len > INT_MAX ? -1 : (int) local_len;
+		int len = (int) local_len;
 		if (doc != NULL && (tmp = xmlDictExists(doc->dict, (const xmlChar *)local, len)) != NULL) {
 			mapptr->local = BAD_CAST tmp;
 		} else {
@@ -1471,15 +1482,11 @@ void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xml
 			mapptr->free_local = true;
 		}
 		mapptr->local_lower = BAD_CAST estrdup(local);
-		if (len < 0) {
-			zend_str_tolower((char *) mapptr->local_lower, strlen((const char *) mapptr->local_lower));
-		} else {
-			zend_str_tolower((char *) mapptr->local_lower, len);
-		}
+		zend_str_tolower((char *) mapptr->local_lower, len);
 	}
 
 	if (ns) {
-		int len = ns_len > INT_MAX ? -1 : (int) ns_len;
+		int len = (int) ns_len;
 		if (doc != NULL && (tmp = xmlDictExists(doc->dict, (const xmlChar *)ns, len)) != NULL) {
 			mapptr->ns = BAD_CAST tmp;
 		} else {
@@ -2084,7 +2091,7 @@ int dom_validate_and_extract(const zend_string *namespace, const zend_string *qn
 	*localName = xmlSplitQName2(BAD_CAST ZSTR_VAL(qname), prefix);
 
 	/* 6. If prefix is non-null and namespace is null, then throw a "NamespaceError" DOMException.
-	 *    Note that null namespace means empty string here becaue of step 1. */
+	 *    Note that null namespace means empty string here because of step 1. */
 	if (*prefix != NULL && ZSTR_VAL(namespace)[0] == '\0') {
 		return NAMESPACE_ERR;
 	}
diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h
index bf671577980a2..851bc14d12574 100644
--- a/ext/dom/php_dom.h
+++ b/ext/dom/php_dom.h
@@ -181,6 +181,8 @@ bool dom_compare_value(const xmlAttr *attr, const xmlChar *value);
 void dom_attr_value_will_change(dom_object *obj, xmlAttrPtr attrp);
 bool php_dom_create_nullable_object(xmlNodePtr obj, zval *return_value, dom_object *domobj);
 xmlNodePtr dom_clone_node(php_dom_libxml_ns_mapper *ns_mapper, xmlNodePtr node, xmlDocPtr doc, bool recursive);
+void dom_set_document_ref_pointers(xmlNodePtr node, php_libxml_ref_obj *document);
+void dom_set_document_ref_pointers_attr(xmlAttrPtr attr, php_libxml_ref_obj *document);
 
 typedef enum {
 	DOM_LOAD_STRING = 0,
diff --git a/ext/dom/php_dom.stub.php b/ext/dom/php_dom.stub.php
index 0f7f748410420..587694f5dfa70 100644
--- a/ext/dom/php_dom.stub.php
+++ b/ext/dom/php_dom.stub.php
@@ -1234,7 +1234,7 @@ public static function quote(string $str): string {}
     }
 #endif
 
-    function dom_import_simplexml(object $node): DOMElement {}
+    function dom_import_simplexml(object $node): DOMAttr|DOMElement {}
 }
 
 namespace Dom
@@ -1688,6 +1688,9 @@ public function matches(string $selectors): bool {}
         /** @virtual */
         public string $innerHTML;
 
+        /** @virtual */
+        public string $outerHTML;
+
         /** @virtual */
         public string $substitutedNodeValue;
 
@@ -2168,5 +2171,5 @@ public static function quote(string $str): string {}
     }
 #endif
 
-    function import_simplexml(object $node): Element {}
+    function import_simplexml(object $node): Attr|Element {}
 }
diff --git a/ext/dom/php_dom_arginfo.h b/ext/dom/php_dom_arginfo.h
index e1f230ccbcf03..3d6f093eb22e9 100644
--- a/ext/dom/php_dom_arginfo.h
+++ b/ext/dom/php_dom_arginfo.h
@@ -1,11 +1,11 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: b79ad2b70757f7d65a6b4fd907222a4955264bf6 */
+ * Stub hash: 20c13a727cffb452475989a743ec29a8412a52f1 */
 
-ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_dom_import_simplexml, 0, 1, DOMElement, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_dom_import_simplexml, 0, 1, DOMAttr|DOMElement, 0)
 	ZEND_ARG_TYPE_INFO(0, node, IS_OBJECT, 0)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_Dom_import_simplexml, 0, 1, Dom\\Element, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_Dom_import_simplexml, 0, 1, Dom\\Attr|Dom\\Element, 0)
 	ZEND_ARG_TYPE_INFO(0, node, IS_OBJECT, 0)
 ZEND_END_ARG_INFO()
 
@@ -1874,9 +1874,7 @@ static zend_class_entry *register_class_DOMDocumentType(zend_class_entry *class_
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	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));
 
 	zval property_entities_default_value;
 	ZVAL_UNDEF(&property_entities_default_value);
@@ -2293,9 +2291,7 @@ 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_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	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));
 
 	zval property_specified_default_value;
 	ZVAL_UNDEF(&property_specified_default_value);
@@ -2305,9 +2301,7 @@ static zend_class_entry *register_class_DOMAttr(zend_class_entry *class_entry_DO
 
 	zval property_value_default_value;
 	ZVAL_UNDEF(&property_value_default_value);
-	zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1);
-	zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_value_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_VALUE), &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_ownerElement_default_value;
 	ZVAL_UNDEF(&property_ownerElement_default_value);
@@ -2552,9 +2546,7 @@ static zend_class_entry *register_class_DOMException(zend_class_entry *class_ent
 
 	zval property_code_default_value;
 	ZVAL_LONG(&property_code_default_value, 0);
-	zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
-	zend_declare_typed_property(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
-	zend_string_release(property_code_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_CODE), &property_code_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 
 	return class_entry;
 }
@@ -3078,6 +3070,12 @@ static zend_class_entry *register_class_Dom_Element(zend_class_entry *class_entr
 	zend_declare_typed_property(class_entry, property_innerHTML_name, &property_innerHTML_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 	zend_string_release(property_innerHTML_name);
 
+	zval property_outerHTML_default_value;
+	ZVAL_UNDEF(&property_outerHTML_default_value);
+	zend_string *property_outerHTML_name = zend_string_init("outerHTML", sizeof("outerHTML") - 1, 1);
+	zend_declare_typed_property(class_entry, property_outerHTML_name, &property_outerHTML_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
+	zend_string_release(property_outerHTML_name);
+
 	zval property_substitutedNodeValue_default_value;
 	ZVAL_UNDEF(&property_substitutedNodeValue_default_value);
 	zend_string *property_substitutedNodeValue_name = zend_string_init("substitutedNodeValue", sizeof("substitutedNodeValue") - 1, 1);
@@ -3124,15 +3122,11 @@ static zend_class_entry *register_class_Dom_Attr(zend_class_entry *class_entry_D
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	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));
 
 	zval property_value_default_value;
 	ZVAL_UNDEF(&property_value_default_value);
-	zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1);
-	zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_value_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_VALUE), &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_ownerElement_default_value;
 	ZVAL_UNDEF(&property_ownerElement_default_value);
@@ -3249,9 +3243,7 @@ static zend_class_entry *register_class_Dom_DocumentType(zend_class_entry *class
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	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));
 
 	zval property_entities_default_value;
 	ZVAL_UNDEF(&property_entities_default_value);
@@ -3541,9 +3533,7 @@ static zend_class_entry *register_class_Dom_TokenList(zend_class_entry *class_en
 
 	zval property_value_default_value;
 	ZVAL_UNDEF(&property_value_default_value);
-	zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1);
-	zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_value_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_VALUE), &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_VIRTUAL, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
diff --git a/ext/dom/serialize_common.h b/ext/dom/serialize_common.h
index 35203592da9ce..ed967c98a9eea 100644
--- a/ext/dom/serialize_common.h
+++ b/ext/dom/serialize_common.h
@@ -20,9 +20,10 @@
 #include 
 #include 
 
+/* The lengths are merely here for optimization purposes, this cannot be used to compare substrings. */
 static zend_always_inline bool dom_local_name_compare_ex(const xmlNode *node, const char *tag, size_t tag_length, size_t name_length)
 {
-	return name_length == tag_length && zend_binary_strcmp((const char *) node->name, name_length, tag, tag_length) == 0;
+	return name_length == tag_length && memcmp((const char *) node->name, tag, name_length + 1) == 0;
 }
 
 #endif
diff --git a/ext/dom/tests/DOMDocument_saveHTML_variant2.phpt b/ext/dom/tests/DOMDocument_saveHTML_variant2.phpt
index 375ff2289b223..dcea0875c36d4 100644
--- a/ext/dom/tests/DOMDocument_saveHTML_variant2.phpt
+++ b/ext/dom/tests/DOMDocument_saveHTML_variant2.phpt
@@ -1,5 +1,5 @@
 --TEST--
-DOMDocument::saveHTML() vs DOMDocumet::saveXML()
+DOMDocument::saveHTML() vs DOMDocument::saveXML()
 --EXTENSIONS--
 dom
 --FILE--
diff --git a/ext/dom/tests/bug69846.phpt b/ext/dom/tests/bug69846.phpt
index 2f41433e35021..2e7874246fa8e 100644
--- a/ext/dom/tests/bug69846.phpt
+++ b/ext/dom/tests/bug69846.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #69846 Segmenation fault (access violation) when iterating over DOMNodeList
+Bug #69846 Segmentation fault (access violation) when iterating over DOMNodeList
 --EXTENSIONS--
 dom
 --FILE--
diff --git a/ext/dom/tests/bug79968.phpt b/ext/dom/tests/bug79968.phpt
index 5ce1bcb7c6e9b..97759dbfb179a 100644
--- a/ext/dom/tests/bug79968.phpt
+++ b/ext/dom/tests/bug79968.phpt
@@ -1,5 +1,5 @@
 --TEST--
-dom: Bug #79968 - Crash when calling before without valid hierachy
+dom: Bug #79968 - Crash when calling before without valid hierarchy
 --EXTENSIONS--
 dom
 --FILE--
diff --git a/ext/dom/tests/gh15192.phpt b/ext/dom/tests/gh15192.phpt
index 5ab5d858ecebf..c7bf0a543bb93 100644
--- a/ext/dom/tests/gh15192.phpt
+++ b/ext/dom/tests/gh15192.phpt
@@ -10,8 +10,8 @@ $element = $dom2->firstChild;
 $dom = new DomDocument();
 var_dump($element);
 ?>
---EXPECTF--
-object(Dom\HTMLElement)#3 (29) {
+--EXPECT--
+object(Dom\HTMLElement)#3 (30) {
   ["namespaceURI"]=>
   string(28) "http://www.w3.org/1999/xhtml"
   ["prefix"]=>
@@ -40,6 +40,8 @@ object(Dom\HTMLElement)#3 (29) {
   NULL
   ["innerHTML"]=>
   string(36) "foo
"
+  ["outerHTML"]=>
+  string(49) "foo
"
   ["substitutedNodeValue"]=>
   string(3) "foo"
   ["nodeType"]=>
diff --git a/ext/dom/tests/gh15910.phpt b/ext/dom/tests/gh15910.phpt
new file mode 100644
index 0000000000000..c9b14a0b86637
--- /dev/null
+++ b/ext/dom/tests/gh15910.phpt
@@ -0,0 +1,18 @@
+--TEST--
+GH-15910 (Assertion failure in ext/dom/element.c)
+--EXTENSIONS--
+dom
+--CREDITS--
+YuanchengJiang
+--FILE--
+appendChild($doc->createElement('container'));
+try {
+    $doc->documentElement->setAttributeNodeNS($doc);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECT--
+DOMElement::setAttributeNodeNS(): Argument #1 ($attr) must be of type DOMAttr, DOMDocument given
diff --git a/ext/dom/tests/gh16039.phpt b/ext/dom/tests/gh16039.phpt
new file mode 100644
index 0000000000000..48a862eda7b20
--- /dev/null
+++ b/ext/dom/tests/gh16039.phpt
@@ -0,0 +1,31 @@
+--TEST--
+GH-16039 (Segmentation fault (access null pointer) in ext/dom/parentnode/tree.c)
+--EXTENSIONS--
+dom
+--FILE--
+appendChild($dom->createElement('root'));
+try {
+    $element->prepend('x', new DOMEntity);
+} catch (DOMException $e) {
+    echo $e->getMessage(), "\n";
+}
+echo $dom->saveXML();
+$dom->strictErrorChecking = false; // Should not have influence
+try {
+    $element->prepend('x', new DOMEntity);
+} catch (DOMException $e) {
+    echo $e->getMessage(), "\n";
+}
+echo $dom->saveXML();
+
+?>
+--EXPECT--
+Invalid State Error
+
+W 
diff --git a/ext/dom/tests/gh16152.phpt b/ext/dom/tests/gh16152.phpt
new file mode 100644
index 0000000000000..604980b855e2f
--- /dev/null
+++ b/ext/dom/tests/gh16152.phpt
@@ -0,0 +1,27 @@
+--TEST--
+GH-16152 (Memory leak in DOMProcessingInstruction/DOMDocument)
+--EXTENSIONS--
+dom
+--FILE--
+append($instr);
+    $frag->append($frag2);
+    $doc->{$fname}($frag);
+    echo $doc->saveXML();
+}
+
+test('insertBefore');
+test('appendChild');
+
+?>
+--EXPECT--
+
+
+
+
diff --git a/ext/dom/tests/gh16190.phpt b/ext/dom/tests/gh16190.phpt
new file mode 100644
index 0000000000000..d3d83b5eb49d7
--- /dev/null
+++ b/ext/dom/tests/gh16190.phpt
@@ -0,0 +1,18 @@
+--TEST--
+GH-16190 (Using reflection to call Dom\Node::__construct causes assertion failure)
+--EXTENSIONS--
+dom
+--FILE--
+invoke($doc);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Cannot directly construct Dom\XMLDocument, use document methods instead
diff --git a/ext/dom/tests/gh16316.phpt b/ext/dom/tests/gh16316.phpt
new file mode 100644
index 0000000000000..43368746bc462
--- /dev/null
+++ b/ext/dom/tests/gh16316.phpt
@@ -0,0 +1,32 @@
+--TEST--
+GH-16316 (DOMXPath breaks when not initialized properly)
+--EXTENSIONS--
+dom
+--FILE--
+getMessage(), "\n";
+}
+
+try {
+    var_dump($demo->document);
+} catch (DOMException $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+object(Demo)#1 (1) {
+  ["registerNodeNamespaces"]=>
+  bool(true)
+}
+Invalid State Error
+Invalid State Error
diff --git a/ext/dom/tests/gh16336_1.phpt b/ext/dom/tests/gh16336_1.phpt
new file mode 100644
index 0000000000000..3488a7f1ee9db
--- /dev/null
+++ b/ext/dom/tests/gh16336_1.phpt
@@ -0,0 +1,19 @@
+--TEST--
+GH-16336 (Attribute intern document mismanagement)
+--EXTENSIONS--
+dom
+--FILE--
+appendChild($elem);
+$elem->setAttributeNode($attr);
+echo $attr->firstChild->textContent;
+
+?>
+--EXPECT--
+j
diff --git a/ext/dom/tests/gh16336_2.phpt b/ext/dom/tests/gh16336_2.phpt
new file mode 100644
index 0000000000000..0a4801f6087f0
--- /dev/null
+++ b/ext/dom/tests/gh16336_2.phpt
@@ -0,0 +1,19 @@
+--TEST--
+GH-16336 (Attribute intern document mismanagement)
+--EXTENSIONS--
+dom
+--FILE--
+setAttributeNode($attr);
+$doc->appendChild($elem);
+echo $attr->firstChild->textContent;
+
+?>
+--EXPECT--
+j
diff --git a/ext/dom/tests/gh16338.phpt b/ext/dom/tests/gh16338.phpt
new file mode 100644
index 0000000000000..7346f62107ee1
--- /dev/null
+++ b/ext/dom/tests/gh16338.phpt
@@ -0,0 +1,27 @@
+--TEST--
+GH-16338 (Null-dereference in ext/dom/node.c)
+--EXTENSIONS--
+dom
+--CREDITS--
+chibinz
+--FILE--
+prepend($com);
+$com->before("Z");
+$com->before($com2);
+$com2->after($elem);
+$doc->insertBefore($elem2);
+$elem->insertBefore($ref);
+
+echo $doc->saveXML();
+?>
+--EXPECT--
+
+Zo&G;  
diff --git a/ext/dom/tests/gh16356.phpt b/ext/dom/tests/gh16356.phpt
new file mode 100644
index 0000000000000..ad09c2681806e
--- /dev/null
+++ b/ext/dom/tests/gh16356.phpt
@@ -0,0 +1,139 @@
+--TEST--
+GH-16356 (Segmentation fault with $outerHTML and next node)
+--EXTENSIONS--
+dom
+--FILE--
+append($dom->createElement("container"));
+$e1 = $dom->documentElement->appendChild($dom->createElementNS("urn:example1", "example:foo"));
+$e2 = $dom->documentElement->appendChild($dom->createElementNS("urn:example2", "example:foo"));
+var_dump($e1, $e2);
+
+?>
+--EXPECT--
+object(Dom\Element)#3 (30) {
+  ["namespaceURI"]=>
+  string(12) "urn:example1"
+  ["prefix"]=>
+  string(7) "example"
+  ["localName"]=>
+  string(3) "foo"
+  ["tagName"]=>
+  string(11) "example:foo"
+  ["id"]=>
+  string(0) ""
+  ["className"]=>
+  string(0) ""
+  ["classList"]=>
+  string(22) "(object value omitted)"
+  ["attributes"]=>
+  string(22) "(object value omitted)"
+  ["firstElementChild"]=>
+  NULL
+  ["lastElementChild"]=>
+  NULL
+  ["childElementCount"]=>
+  int(0)
+  ["previousElementSibling"]=>
+  NULL
+  ["nextElementSibling"]=>
+  string(22) "(object value omitted)"
+  ["innerHTML"]=>
+  string(0) ""
+  ["outerHTML"]=>
+  string(27) "                                                                                                                                                                                                                        
', LIBXML_NOERROR);
+$p = $dom->body->firstChild;
+$p->outerHTML = '
 '; // intentionally unclosed
+echo $dom->saveXML(), "\n";
+echo $dom->saveHtml(), "\n";
+$div = $dom->body->firstChild;
+$div->outerHTML = "invalid\xffutf-8𐍈𐍈𐍈";
+echo $dom->saveXML(), "\n";
+echo $dom->saveHtml(), "\n";
+
+$dom->body->outerHTML = 'foo
 
+
 
+
+invalid�utf-8𐍈𐍈𐍈 
+invalid�utf-8𐍈𐍈𐍈 
+NULL
+
+foo
foo
foo
';
+var_dump($template->outerHTML);
+
+?>
+--EXPECT--
+string(10) "foo
"
+string(49) "foo
"
+string(25) "foo
Link
', LIBXML_NOERROR);
+$p = $dom->body->querySelector('p');
+$p->outerHTML = 'Another Link ';
+echo $dom->saveHTML();
+
+?>
+--EXPECT--
+Another Link 
diff --git a/ext/dom/tests/modern/spec/gh11404_1.phpt b/ext/dom/tests/modern/spec/gh11404_1.phpt
index ec9c0a30f7568..ff8123ca78d72 100644
--- a/ext/dom/tests/modern/spec/gh11404_1.phpt
+++ b/ext/dom/tests/modern/spec/gh11404_1.phpt
@@ -1,5 +1,5 @@
 --TEST--
-GH-11404 (DOMDocument::savexml and friends ommit xmlns="" declaration for null namespace, creating incorrect xml representation of the DOM)
+GH-11404 (DOMDocument::savexml and friends omit xmlns="" declaration for null namespace, creating incorrect xml representation of the DOM)
 --EXTENSIONS--
 dom
 --FILE--
diff --git a/ext/dom/tests/modern/spec/gh11404_2.phpt b/ext/dom/tests/modern/spec/gh11404_2.phpt
index 946a3a0140a6e..a3ba22ea5b523 100644
--- a/ext/dom/tests/modern/spec/gh11404_2.phpt
+++ b/ext/dom/tests/modern/spec/gh11404_2.phpt
@@ -1,5 +1,5 @@
 --TEST--
-GH-11404 (DOMDocument::savexml and friends ommit xmlns="" declaration for null namespace, creating incorrect xml representation of the DOM)
+GH-11404 (DOMDocument::savexml and friends omit xmlns="" declaration for null namespace, creating incorrect xml representation of the DOM)
 --EXTENSIONS--
 dom
 --FILE--
diff --git a/ext/dom/tests/modern/xml/Element_innerHTML_reading.phpt b/ext/dom/tests/modern/xml/Element_innerOuterHTML_reading.phpt
similarity index 67%
rename from ext/dom/tests/modern/xml/Element_innerHTML_reading.phpt
rename to ext/dom/tests/modern/xml/Element_innerOuterHTML_reading.phpt
index b096fc2c6cc80..76f2d6fecd209 100644
--- a/ext/dom/tests/modern/xml/Element_innerHTML_reading.phpt
+++ b/ext/dom/tests/modern/xml/Element_innerOuterHTML_reading.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Test reading Element::$innerHTML on XML documents
+Test reading Element::${inner,outer}HTML on XML documents
 --EXTENSIONS--
 dom
 --FILE--
@@ -16,43 +16,56 @@ function createContainer() {
 $container = createContainer();
 $container->append("Hello, world!");
 var_dump($container->innerHTML);
+var_dump($container->outerHTML);
 
 $container = createContainer();
 $container->append($dom->createComment("This is -a- comment"));
 var_dump($container->innerHTML);
+var_dump($container->outerHTML);
 
 $container = createContainer();
 // Note: intentionally typo'd to check whether the string matching against "xml" happens correctly
 //       i.e. no bugs with prefix-matching only.
 $container->append($dom->createProcessingInstruction("xmll", ""));
 var_dump($container->innerHTML);
+var_dump($container->outerHTML);
 
 $container = createContainer();
 $container->append($dom->createProcessingInstruction("almostmalformed", ">?"));
 var_dump($container->innerHTML);
+var_dump($container->outerHTML);
 
 $container = createContainer();
 $element = $container->appendChild(createContainer());
 $element->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns', 'http://example.com/');
 var_dump($container->innerHTML);
+var_dump($container->outerHTML);
 
 $container = createContainer();
 $element = $container->appendChild(createContainer());
 $element->setAttributeNS('urn:a', 'name', '');
 $element->setAttributeNS('urn:b', 'name', '');
 var_dump($container->innerHTML);
+var_dump($container->outerHTML);
 
 $dom = DOM\XMLDocument::createFromFile(__DIR__ . '/../../book.xml');
 var_dump($dom->documentElement->innerHTML);
+var_dump($dom->documentElement->outerHTML);
 
 ?>
 --EXPECT--
 string(13) "Hello, world!"
+string(36) "Hello, world! "
 string(26) ""
+string(49) "??> "
 string(12) "
   The Grapes of Wrath 
@@ -63,3 +76,13 @@ string(167) "
   John Steinbeck 
   
 "
+string(182) "
+ 
+  The Grapes of Wrath 
+  John Steinbeck 
+  
+ 
+  The Pearl 
+  John Steinbeck 
+  
+ "
diff --git a/ext/dom/tests/modern/xml/Element_innerHTML_reading_errors.phpt b/ext/dom/tests/modern/xml/Element_innerOuterHTML_reading_errors.phpt
similarity index 77%
rename from ext/dom/tests/modern/xml/Element_innerHTML_reading_errors.phpt
rename to ext/dom/tests/modern/xml/Element_innerOuterHTML_reading_errors.phpt
index 04b9971186c4f..585c9c5fd875b 100644
--- a/ext/dom/tests/modern/xml/Element_innerHTML_reading_errors.phpt
+++ b/ext/dom/tests/modern/xml/Element_innerOuterHTML_reading_errors.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Test reading Element::$innerHTML on XML documents - error cases
+Test reading Element::${inner,outer}HTML on XML documents - error cases
 --EXTENSIONS--
 dom
 --FILE--
@@ -19,6 +19,11 @@ function test($container) {
     } catch (DOMException $e) {
         echo $e->getMessage(), "\n";
     }
+    try {
+        var_dump($container->outerHTML);
+    } catch (DOMException $e) {
+        echo $e->getMessage(), "\n";
+    }
 }
 
 $container = createContainer();
@@ -106,3 +111,18 @@ The resulting XML serialization is not well-formed
 The resulting XML serialization is not well-formed
 The resulting XML serialization is not well-formed
 The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
+The resulting XML serialization is not well-formed
diff --git a/ext/dom/tests/modern/xml/Element_outerHTML_writing.phpt b/ext/dom/tests/modern/xml/Element_outerHTML_writing.phpt
new file mode 100644
index 0000000000000..f4bb3c8c4fce4
--- /dev/null
+++ b/ext/dom/tests/modern/xml/Element_outerHTML_writing.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Test writing Element::$outerHTML on XML documents
+--EXTENSIONS--
+dom
+--FILE--
+foo
bar
bar ';
+echo $dom->saveXML($fragment), "\n";
+
+?>
+--EXPECT--
+
+foo
bar
foo
bar
tést 
+string(1) "p"
+bar 
diff --git a/ext/dom/tests/modern/xml/Element_outerHTML_writing_errors.phpt b/ext/dom/tests/modern/xml/Element_outerHTML_writing_errors.phpt
new file mode 100644
index 0000000000000..f7602539acacc
--- /dev/null
+++ b/ext/dom/tests/modern/xml/Element_outerHTML_writing_errors.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Test writing Element::$outerHTML on XML documents - error cases
+--EXTENSIONS--
+dom
+--FILE--
+');
+try {
+    $dom->documentElement->outerHTML = 'foo ');
+$root = $dom->documentElement;
+
+unset($root->myProp);
+try {
+    $root->myProp;
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+try {
+    unset($root->textContent);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+Typed property MyElement::$myProp must not be accessed before initialization
+Cannot unset MyElement::$textContent
diff --git a/ext/dom/xml_common.h b/ext/dom/xml_common.h
index 8e5734d5a914e..a63e43e92a77b 100644
--- a/ext/dom/xml_common.h
+++ b/ext/dom/xml_common.h
@@ -60,7 +60,7 @@ PHP_DOM_EXPORT xmlNodePtr dom_object_get_node(dom_object *obj);
 	__intern = Z_LIBXML_NODE_P(__id); \
 	if (UNEXPECTED(__intern->node == NULL)) { \
 		php_error_docref(NULL, E_WARNING, "Couldn't fetch %s", \
-			ZSTR_VAL(__intern->std.ce->name));\
+			ZSTR_VAL(Z_OBJCE_P(__zv)->name));\
 		RETURN_NULL();\
 	} \
 	__ptr = (__prtype)__intern->node->node; \
diff --git a/ext/dom/xml_serializer.c b/ext/dom/xml_serializer.c
index 080f7ed30aa64..debbb41fdadeb 100644
--- a/ext/dom/xml_serializer.c
+++ b/ext/dom/xml_serializer.c
@@ -600,7 +600,7 @@ static int dom_xml_serialize_attribute_node_value(xmlOutputBufferPtr out, xmlAtt
 /* These steps are from the attribute serialization algorithm's well-formed checks.
  * Note that this does not return a boolean but an int to be compatible with the TRY/TRY_CLEANUP interface
  * that we do for compatibility with libxml's interfaces. */
-static zend_always_inline int dom_xml_check_xmlns_attribute_requirements(const xmlAttr *attr)
+static zend_always_inline int dom_xml_check_xmlns_attribute_requirements(const xmlAttr *attr, const xmlChar *candidate_prefix)
 {
 	const xmlChar *attr_value = dom_get_attribute_value(attr);
 
@@ -609,8 +609,9 @@ static zend_always_inline int dom_xml_check_xmlns_attribute_requirements(const x
 		return -1;
 	}
 
-	/* 3.5.2.3. If the require well-formed flag is set and the value of attr's value attribute is the empty string */
-	if (*attr_value == '\0') {
+	/* 3.5.2.3. If the require well-formed flag is set and the value of attr's value attribute is the empty string.
+	 * Errata: an "xmlns" attribute is allowed but not one with a prefix, so the idea in the spec is right but the description isn't. */
+	if (*attr_value == '\0' && candidate_prefix != NULL) {
 		return -1;
 	}
 
@@ -790,15 +791,16 @@ static int dom_xml_serialize_attributes(
 					}
 				}
 
-				if (require_well_formed) {
-					/* 3.5.2.2 and 3.5.2.3 are done by this call. */
-					TRY_OR_CLEANUP(dom_xml_check_xmlns_attribute_requirements(attr));
-				}
-
 				/* 3.5.2.4. the attr's prefix matches the string "xmlns", then let candidate prefix be the string "xmlns". */
 				if (attr->ns->prefix != NULL && strcmp((const char *) attr->ns->prefix, "xmlns") == 0) {
 					candidate_prefix = BAD_CAST "xmlns";
 				}
+
+				/* Errata: step 3.5.2.3 can only really be checked if we already know the candidate prefix. */
+				if (require_well_formed) {
+					/* 3.5.2.2 and 3.5.2.3 are done by this call. */
+					TRY_OR_CLEANUP(dom_xml_check_xmlns_attribute_requirements(attr, candidate_prefix));
+				}
 			}
 			/* 3.5.3. Otherwise, the attribute namespace in not the XMLNS namespace. Run these steps: */
 			else if (candidate_prefix == NULL) { /* https://github.com/w3c/DOM-Parsing/issues/29 */
diff --git a/ext/dom/xpath.c b/ext/dom/xpath.c
index 33df515376d74..dc599f7c55afd 100644
--- a/ext/dom/xpath.c
+++ b/ext/dom/xpath.c
@@ -178,6 +178,11 @@ zend_result dom_xpath_document_read(dom_object *obj, zval *retval)
 		docp = (xmlDocPtr) ctx->doc;
 	}
 
+	if (UNEXPECTED(!docp)) {
+		php_dom_throw_error(INVALID_STATE_ERR, /* strict */ true);
+		return FAILURE;
+	}
+
 	php_dom_create_object((xmlNodePtr) docp, retval, obj);
 	return SUCCESS;
 }
@@ -353,7 +358,7 @@ static void php_xpath_eval(INTERNAL_FUNCTION_PARAMETERS, int type, bool modern)
 						xmlNsPtr original = (xmlNsPtr) node;
 
 						/* Make sure parent dom object exists, so we can take an extra reference. */
-						zval parent_zval; /* don't destroy me, my lifetime is transfered to the fake namespace decl */
+						zval parent_zval; /* don't destroy me, my lifetime is transferred to the fake namespace decl */
 						php_dom_create_object(nsparent, &parent_zval, &intern->dom);
 						dom_object *parent_intern = Z_DOMOBJ_P(&parent_zval);
 
diff --git a/ext/dom/xpath_callbacks.c b/ext/dom/xpath_callbacks.c
index cd2ecf4335df7..036326695276b 100644
--- a/ext/dom/xpath_callbacks.c
+++ b/ext/dom/xpath_callbacks.c
@@ -350,7 +350,7 @@ static zval *php_dom_xpath_callback_fetch_args(xmlXPathParserContextPtr ctxt, ui
 								xmlNsPtr original = (xmlNsPtr) node;
 
 								/* Make sure parent dom object exists, so we can take an extra reference. */
-								zval parent_zval; /* don't destroy me, my lifetime is transfered to the fake namespace decl */
+								zval parent_zval; /* don't destroy me, my lifetime is transferred to the fake namespace decl */
 								php_dom_create_object(nsparent, &parent_zval, intern);
 								dom_object *parent_intern = Z_DOMOBJ_P(&parent_zval);
 
diff --git a/ext/enchant/enchant_arginfo.h b/ext/enchant/enchant_arginfo.h
index 70ba78cde86a2..32f18a290c263 100644
--- a/ext/enchant/enchant_arginfo.h
+++ b/ext/enchant/enchant_arginfo.h
@@ -155,7 +155,7 @@ static void register_enchant_symbols(int module_number)
 #endif
 
 
-	zend_attribute *attribute_Deprecated_func_enchant_broker_free_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_broker_free", sizeof("enchant_broker_free") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_enchant_broker_free_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_broker_free", sizeof("enchant_broker_free") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_enchant_broker_free_0_arg0;
 	zend_string *attribute_Deprecated_func_enchant_broker_free_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_enchant_broker_free_0_arg0, attribute_Deprecated_func_enchant_broker_free_0_arg0_str);
@@ -167,21 +167,21 @@ static void register_enchant_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_enchant_broker_free_0->args[1].value, &attribute_Deprecated_func_enchant_broker_free_0_arg1);
 	attribute_Deprecated_func_enchant_broker_free_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_enchant_broker_set_dict_path_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_broker_set_dict_path", sizeof("enchant_broker_set_dict_path") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_enchant_broker_set_dict_path_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_broker_set_dict_path", sizeof("enchant_broker_set_dict_path") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_enchant_broker_set_dict_path_0_arg0;
 	zend_string *attribute_Deprecated_func_enchant_broker_set_dict_path_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_enchant_broker_set_dict_path_0_arg0, attribute_Deprecated_func_enchant_broker_set_dict_path_0_arg0_str);
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_enchant_broker_set_dict_path_0->args[0].value, &attribute_Deprecated_func_enchant_broker_set_dict_path_0_arg0);
 	attribute_Deprecated_func_enchant_broker_set_dict_path_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
 
-	zend_attribute *attribute_Deprecated_func_enchant_broker_get_dict_path_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_broker_get_dict_path", sizeof("enchant_broker_get_dict_path") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_enchant_broker_get_dict_path_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_broker_get_dict_path", sizeof("enchant_broker_get_dict_path") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_enchant_broker_get_dict_path_0_arg0;
 	zend_string *attribute_Deprecated_func_enchant_broker_get_dict_path_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_enchant_broker_get_dict_path_0_arg0, attribute_Deprecated_func_enchant_broker_get_dict_path_0_arg0_str);
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_enchant_broker_get_dict_path_0->args[0].value, &attribute_Deprecated_func_enchant_broker_get_dict_path_0_arg0);
 	attribute_Deprecated_func_enchant_broker_get_dict_path_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
 
-	zend_attribute *attribute_Deprecated_func_enchant_broker_free_dict_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_broker_free_dict", sizeof("enchant_broker_free_dict") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_enchant_broker_free_dict_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_broker_free_dict", sizeof("enchant_broker_free_dict") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_enchant_broker_free_dict_0_arg0;
 	zend_string *attribute_Deprecated_func_enchant_broker_free_dict_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_enchant_broker_free_dict_0_arg0, attribute_Deprecated_func_enchant_broker_free_dict_0_arg0_str);
@@ -193,7 +193,7 @@ static void register_enchant_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_enchant_broker_free_dict_0->args[1].value, &attribute_Deprecated_func_enchant_broker_free_dict_0_arg1);
 	attribute_Deprecated_func_enchant_broker_free_dict_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_enchant_dict_add_to_personal_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_dict_add_to_personal", sizeof("enchant_dict_add_to_personal") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_enchant_dict_add_to_personal_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_dict_add_to_personal", sizeof("enchant_dict_add_to_personal") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_enchant_dict_add_to_personal_0_arg0;
 	zend_string *attribute_Deprecated_func_enchant_dict_add_to_personal_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_enchant_dict_add_to_personal_0_arg0, attribute_Deprecated_func_enchant_dict_add_to_personal_0_arg0_str);
@@ -205,7 +205,7 @@ static void register_enchant_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_enchant_dict_add_to_personal_0->args[1].value, &attribute_Deprecated_func_enchant_dict_add_to_personal_0_arg1);
 	attribute_Deprecated_func_enchant_dict_add_to_personal_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_enchant_dict_is_in_session_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_dict_is_in_session", sizeof("enchant_dict_is_in_session") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_enchant_dict_is_in_session_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "enchant_dict_is_in_session", sizeof("enchant_dict_is_in_session") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_enchant_dict_is_in_session_0_arg0;
 	zend_string *attribute_Deprecated_func_enchant_dict_is_in_session_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_enchant_dict_is_in_session_0_arg0, attribute_Deprecated_func_enchant_dict_is_in_session_0_arg0_str);
diff --git a/ext/exif/config.m4 b/ext/exif/config.m4
index 5d096cb4c16b7..6824ba2c3453a 100644
--- a/ext/exif/config.m4
+++ b/ext/exif/config.m4
@@ -10,4 +10,5 @@ if test "$PHP_EXIF" != "no"; then
     [exif.c],
     [$ext_shared],,
     [-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1])
+  PHP_ADD_EXTENSION_DEP(exif, mbstring, true)
 fi
diff --git a/ext/exif/config.w32 b/ext/exif/config.w32
index 52adaef5b12f7..81b9dd818f426 100644
--- a/ext/exif/config.w32
+++ b/ext/exif/config.w32
@@ -2,12 +2,8 @@
 
 ARG_ENABLE('exif', 'Exchangeable image information (EXIF) Support', 'no');
 
-if(PHP_EXIF != 'no')
-{
-	if(ADD_EXTENSION_DEP('exif', 'mbstring'))
-	{
-		AC_DEFINE('HAVE_EXIF', 1, "Define to 1 if the PHP extension 'exif' is available.");
-
-		EXTENSION('exif', 'exif.c', null, '/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
-	}
+if(PHP_EXIF != 'no') {
+	AC_DEFINE('HAVE_EXIF', 1, "Define to 1 if the PHP extension 'exif' is available.");
+	EXTENSION('exif', 'exif.c', null, '/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1');
+	ADD_EXTENSION_DEP('exif', 'mbstring', true);
 }
diff --git a/ext/exif/exif.c b/ext/exif/exif.c
index 518c31526532d..c0bf6f7891599 100644
--- a/ext/exif/exif.c
+++ b/ext/exif/exif.c
@@ -4395,7 +4395,7 @@ static bool exif_read_from_impl(image_info_type *ImageInfo, php_stream *stream,
 	ImageInfo->FileName			= NULL;
 
 	if (php_stream_is(ImageInfo->infile, PHP_STREAM_IS_STDIO)) {
-		if (VCWD_STAT(stream->orig_path, &st) >= 0) {
+		if (stream->orig_path && VCWD_STAT(stream->orig_path, &st) >= 0) {
 			zend_string *base;
 			if ((st.st_mode & S_IFMT) != S_IFREG) {
 				exif_error_docref(NULL EXIFERR_CC, ImageInfo, E_WARNING, "Not a file");
@@ -4699,7 +4699,6 @@ PHP_FUNCTION(exif_read_data)
 PHP_FUNCTION(exif_thumbnail)
 {
 	bool ret;
-	int arg_c = ZEND_NUM_ARGS();
 	image_info_type ImageInfo;
 	zval *stream;
 	zval *z_width = NULL, *z_height = NULL, *z_imagetype = NULL;
@@ -4731,7 +4730,7 @@ PHP_FUNCTION(exif_thumbnail)
 			RETURN_THROWS();
 		}
 
-		if (CHECK_NULL_PATH(Z_STRVAL_P(stream), Z_STRLEN_P(stream))) {
+		if (zend_str_has_nul_byte(Z_STR_P(stream))) {
 			zend_argument_value_error(1, "must not contain any null bytes");
 			RETURN_THROWS();
 		}
@@ -4756,17 +4755,19 @@ PHP_FUNCTION(exif_thumbnail)
 	exif_error_docref(NULL EXIFERR_CC, &ImageInfo, E_NOTICE, "Returning thumbnail(%d)", ImageInfo.Thumbnail.size);
 #endif
 
-	ZVAL_STRINGL(return_value, ImageInfo.Thumbnail.data, ImageInfo.Thumbnail.size);
-	if (arg_c >= 3) {
-		if (!ImageInfo.Thumbnail.width || !ImageInfo.Thumbnail.height) {
-			if (!exif_scan_thumbnail(&ImageInfo)) {
-				ImageInfo.Thumbnail.width = ImageInfo.Thumbnail.height = 0;
-			}
+	RETVAL_STRINGL(ImageInfo.Thumbnail.data, ImageInfo.Thumbnail.size);
+	if ((z_width || z_height) && (!ImageInfo.Thumbnail.width || !ImageInfo.Thumbnail.height)) {
+		if (!exif_scan_thumbnail(&ImageInfo)) {
+			ImageInfo.Thumbnail.width = ImageInfo.Thumbnail.height = 0;
 		}
+	}
+	if (z_width) {
 		ZEND_TRY_ASSIGN_REF_LONG(z_width,  ImageInfo.Thumbnail.width);
+	}
+	if (z_height) {
 		ZEND_TRY_ASSIGN_REF_LONG(z_height, ImageInfo.Thumbnail.height);
 	}
-	if (arg_c >= 4)	{
+	if (z_imagetype) {
 		ZEND_TRY_ASSIGN_REF_LONG(z_imagetype, ImageInfo.Thumbnail.filetype);
 	}
 
diff --git a/ext/exif/tests/exif_thumbnail_streams.phpt b/ext/exif/tests/exif_thumbnail_streams.phpt
index 3838ceb23bd7f..420478c2f43fe 100644
--- a/ext/exif/tests/exif_thumbnail_streams.phpt
+++ b/ext/exif/tests/exif_thumbnail_streams.phpt
@@ -11,7 +11,19 @@ $fp = fopen(__DIR__ . '/sony.jpg', 'rb');
 
 var_dump(strlen(exif_thumbnail($fp)));
 
+exif_thumbnail($fp, width: $width);
+var_dump($width);
+
+exif_thumbnail($fp, height: $height);
+var_dump($height);
+
+exif_thumbnail($fp, image_type: $image_type);
+var_dump($image_type == IMAGETYPE_JPEG);
+
 fclose($fp);
 ?>
 --EXPECT--
 int(4150)
+int(160)
+int(90)
+bool(true)
diff --git a/ext/exif/tests/gh16409.phpt b/ext/exif/tests/gh16409.phpt
new file mode 100644
index 0000000000000..c2c54d839e011
--- /dev/null
+++ b/ext/exif/tests/gh16409.phpt
@@ -0,0 +1,12 @@
+--TEST--
+GH-16409 (Segfault in exif_thumbnail when not dealing with a real file)
+--EXTENSIONS--
+exif
+--FILE--
+
+--EXPECTF--
+Warning: exif_thumbnail(): File too small (0) in %s on line %d
+bool(false)%A
diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c
index 4e5dfc632c9ba..2648162ae9c0b 100644
--- a/ext/ffi/ffi.c
+++ b/ext/ffi/ffi.c
@@ -2938,6 +2938,12 @@ static zend_function *zend_ffi_get_func(zend_object **obj, zend_string *name, co
 }
 /* }}} */
 
+static int zend_fake_compare_objects(zval *o1, zval *o2)
+{
+	zend_throw_error(zend_ffi_exception_ce, "Cannot compare FFI objects");
+	return ZEND_UNCOMPARABLE;
+}
+
 static zend_never_inline int zend_ffi_disabled(void) /* {{{ */
 {
 	zend_throw_error(zend_ffi_exception_ce, "FFI API is restricted by \"ffi.enable\" configuration directive");
@@ -5393,7 +5399,7 @@ static zend_result ffi_fixup_temporaries(void) {
 		++zend_ffi_cast_fn.T;
 		++zend_ffi_type_fn.T;
 	}
-#if !ZTS
+#ifndef ZTS
 	ZEND_MAP_PTR(zend_ffi_new_fn.run_time_cache) = ZEND_MAP_PTR(((zend_internal_function *)zend_hash_str_find_ptr(&zend_ffi_ce->function_table, "new", sizeof("new")-1))->run_time_cache);
 	ZEND_MAP_PTR(zend_ffi_cast_fn.run_time_cache) = ZEND_MAP_PTR(((zend_internal_function *)zend_hash_str_find_ptr(&zend_ffi_ce->function_table, "cast", sizeof("cast")-1))->run_time_cache);
 	ZEND_MAP_PTR(zend_ffi_type_fn.run_time_cache) = ZEND_MAP_PTR(((zend_internal_function *)zend_hash_str_find_ptr(&zend_ffi_ce->function_table, "type", sizeof("type")-1))->run_time_cache);
@@ -5443,7 +5449,7 @@ ZEND_MINIT_FUNCTION(ffi)
 	zend_ffi_handlers.has_dimension        = zend_fake_has_dimension;
 	zend_ffi_handlers.unset_dimension      = zend_fake_unset_dimension;
 	zend_ffi_handlers.get_method           = zend_ffi_get_func;
-	zend_ffi_handlers.compare              = NULL;
+	zend_ffi_handlers.compare              = zend_fake_compare_objects;
 	zend_ffi_handlers.cast_object          = zend_fake_cast_object;
 	zend_ffi_handlers.get_debug_info       = NULL;
 	zend_ffi_handlers.get_closure          = NULL;
diff --git a/ext/ffi/ffi.stub.php b/ext/ffi/ffi.stub.php
index 0ed3cb32ac6ed..3fb9ceee3dfa5 100644
--- a/ext/ffi/ffi.stub.php
+++ b/ext/ffi/ffi.stub.php
@@ -15,7 +15,7 @@ public static function load(string $filename): ?FFI {}
 
         public static function scope(string $name): FFI {}
 
-        public static function new(FFI\CType|string $type, bool $owned = true, bool $persistent = false): ?FFI\CData {}
+        public static function new(FFI\CType|string $type, bool $owned = true, bool $persistent = false): FFI\CData {}
 
         /** @prefer-ref $ptr */
         public static function free(FFI\CData $ptr): void {}
@@ -24,9 +24,9 @@ public static function free(FFI\CData $ptr): void {}
          * @param FFI\CData|int|float|bool|null $ptr
          * @prefer-ref $ptr
          */
-        public static function cast(FFI\CType|string $type, $ptr): ?FFI\CData {}
+        public static function cast(FFI\CType|string $type, $ptr): FFI\CData {}
 
-        public static function type(string $type): ?FFI\CType {}
+        public static function type(string $type): FFI\CType {}
 
         /** @prefer-ref $ptr */
         public static function typeof(FFI\CData $ptr): FFI\CType {}
diff --git a/ext/ffi/ffi_arginfo.h b/ext/ffi/ffi_arginfo.h
index 968a0979fb543..563c9f8b8e8b1 100644
--- a/ext/ffi/ffi_arginfo.h
+++ b/ext/ffi/ffi_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 1255ed4477be5b4361622aab54ebe37f42b1dada */
+ * Stub hash: d3626f5d39317876fc7d4f240b0758f17f3472c8 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_FFI_cdef, 0, 0, FFI, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, code, IS_STRING, 0, "\"\"")
@@ -14,7 +14,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_FFI_scope, 0, 1, FFI, 0)
 	ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_FFI_new, 0, 1, FFI\\CData, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_FFI_new, 0, 1, FFI\\CData, 0)
 	ZEND_ARG_OBJ_TYPE_MASK(0, type, FFI\\CType, MAY_BE_STRING, NULL)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, owned, _IS_BOOL, 0, "true")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, persistent, _IS_BOOL, 0, "false")
@@ -24,12 +24,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_FFI_free, 0, 1, IS_VOID, 0
 	ZEND_ARG_OBJ_INFO(ZEND_SEND_PREFER_REF, ptr, FFI\\CData, 0)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_FFI_cast, 0, 2, FFI\\CData, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_FFI_cast, 0, 2, FFI\\CData, 0)
 	ZEND_ARG_OBJ_TYPE_MASK(0, type, FFI\\CType, MAY_BE_STRING, NULL)
 	ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_FFI_type, 0, 1, FFI\\CType, 1)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_FFI_type, 0, 1, FFI\\CType, 0)
 	ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0)
 ZEND_END_ARG_INFO()
 
diff --git a/ext/ffi/tests/bug78270_2.phpt b/ext/ffi/tests/bug78270_2.phpt
index c17b143cf7d0b..a4a8c756a069b 100644
--- a/ext/ffi/tests/bug78270_2.phpt
+++ b/ext/ffi/tests/bug78270_2.phpt
@@ -6,6 +6,7 @@ zend_test
 --SKIPIF--
 
 --FILE--
 getMessage(), "\n";
+}
+?>
+--EXPECT--
+Cannot compare FFI objects
diff --git a/ext/gd/config.w32 b/ext/gd/config.w32
index 82db473513781..939755bf539d1 100644
--- a/ext/gd/config.w32
+++ b/ext/gd/config.w32
@@ -17,11 +17,15 @@ if (PHP_GD != "no") {
 		(CHECK_LIB("libiconv_a.lib;libiconv.lib", "gd", PHP_GD) || CHECK_LIB("iconv_a.lib;iconv.lib", "gd", PHP_GD)) &&
 		 CHECK_HEADER_ADD_INCLUDE("iconv.h", "CFLAGS_GD", PHP_GD) &&
 		(((PHP_ZLIB=="no") && (CHECK_LIB("zlib_a.lib;zlib.lib", "gd", PHP_GD) )) ||
-			(PHP_ZLIB_SHARED && CHECK_LIB("zlib.lib", "gd", PHP_GD)) || (PHP_ZLIB == "yes" && (!PHP_ZLIB_SHARED))) &&
-		CHECK_LIB("libXpm_a.lib", "gd", PHP_GD) &&
-		CHECK_HEADER_ADD_INCLUDE("xpm.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\X11")
+			(PHP_ZLIB_SHARED && CHECK_LIB("zlib.lib", "gd", PHP_GD)) || (PHP_ZLIB == "yes" && (!PHP_ZLIB_SHARED)))
 		) {
 
+		if (CHECK_LIB("libXpm_a.lib", "gd", PHP_GD) &&
+			CHECK_HEADER_ADD_INCLUDE("xpm.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\X11")
+		) {
+			AC_DEFINE('HAVE_XPM', 1, "Define to 1 if you have the xpm library.");
+			AC_DEFINE('HAVE_GD_XPM', 1, "Define to 1 if gd extension has XPM support.");
+		}
 		if (PHP_LIBWEBP != "no") {
 			if ((CHECK_LIB("libwebp_a.lib", "gd", PHP_GD) || CHECK_LIB("libwebp.lib", "gd", PHP_GD)) &&
 				CHECK_HEADER_ADD_INCLUDE("decode.h", "CFLAGS_GD", PHP_GD + ";" + PHP_PHP_BUILD + "\\include\\webp") &&
@@ -62,8 +66,6 @@ if (PHP_GD != "no") {
 		AC_DEFINE('HAVE_LIBPNG', 1, "Define to 1 if you have the libpng library.");
 		AC_DEFINE('HAVE_LIBJPEG', 1, "Define to 1 if you have the libjpeg library.");
 		AC_DEFINE('HAVE_GD_JPG', 1, "Define to 1 if gd extension has JPEG support.");
-		AC_DEFINE('HAVE_XPM', 1, "Define to 1 if you have the xpm library.");
-		AC_DEFINE('HAVE_GD_XPM', 1, "Define to 1 if gd extension has XPM support.");
 		AC_DEFINE('HAVE_LIBFREETYPE', 1, "Define to 1 if you have the FreeType library.");
 		AC_DEFINE('HAVE_GD_FREETYPE', 1, "Define to 1 if gd extension has FreeType support.");
 		ADD_FLAG("CFLAGS_GD", " \
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 899dc05b3e829..a2c3e7d0de61e 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -1237,6 +1237,11 @@ PHP_FUNCTION(imagerotate)
 		Z_PARAM_LONG(color)
 	ZEND_PARSE_PARAMETERS_END();
 
+	if (degrees < (double)(INT_MIN / 100) || degrees > (double)(INT_MAX / 100)) {
+		zend_argument_value_error(2, "must be between %d and %d", (INT_MIN / 100), (INT_MAX / 100));
+		RETURN_THROWS();
+	}
+
 	im_src = php_gd_libgdimageptr_from_zval_p(SIM);
 	im_dst = gdImageRotateInterpolated(im_src, (const float)degrees, color);
 
@@ -4037,13 +4042,25 @@ PHP_FUNCTION(imageaffine)
 		if ((zval_affine_elem = zend_hash_index_find(Z_ARRVAL_P(z_affine), i)) != NULL) {
 			switch (Z_TYPE_P(zval_affine_elem)) {
 				case IS_LONG:
-					affine[i]  = Z_LVAL_P(zval_affine_elem);
+					affine[i] = Z_LVAL_P(zval_affine_elem);
+					if (affine[i] < INT_MIN || affine[i] > INT_MAX) {
+						zend_argument_value_error(2, "element %i must be between %d and %d", i, INT_MIN, INT_MAX);
+						RETURN_THROWS();
+					}
 					break;
 				case IS_DOUBLE:
 					affine[i] = Z_DVAL_P(zval_affine_elem);
+					if (affine[i] < INT_MIN || affine[i] > INT_MAX) {
+						zend_argument_value_error(2, "element %i must be between %d and %d", i, INT_MIN, INT_MAX);
+						RETURN_THROWS();
+					}
 					break;
 				case IS_STRING:
 					affine[i] = zval_get_double(zval_affine_elem);
+					if (affine[i] < INT_MIN || affine[i] > INT_MAX) {
+						zend_argument_value_error(2, "element %i must be between %d and %d", i, INT_MIN, INT_MAX);
+						RETURN_THROWS();
+					}
 					break;
 				default:
 					zend_argument_type_error(3, "contains invalid type for element %i", i);
diff --git a/ext/gd/libgd/gd_avif.c b/ext/gd/libgd/gd_avif.c
index 30075d2a899c8..9c1ffdc34bc68 100644
--- a/ext/gd/libgd/gd_avif.c
+++ b/ext/gd/libgd/gd_avif.c
@@ -393,7 +393,13 @@ gdImagePtr gdImageCreateFromAvifCtx (gdIOCtx *ctx)
 	// (While AVIF image pixel depth can be 8, 10, or 12 bits, GD truecolor images are 8-bit.)
 	avifRGBImageSetDefaults(&rgb, decoder->image);
 	rgb.depth = 8;
+#if AVIF_VERSION >= 1000000
+	result = avifRGBImageAllocatePixels(&rgb);
+	if (isAvifError(result, "Allocating RGB pixels failed"))
+		goto cleanup;
+#else
 	avifRGBImageAllocatePixels(&rgb);
+#endif
 
 	result = avifImageYUVToRGB(decoder->image, &rgb);
 	if (isAvifError(result, "Conversion from YUV to RGB failed"))
@@ -522,14 +528,25 @@ void gdImageAvifCtx(gdImagePtr im, gdIOCtx *outfile, int quality, int speed)
 	// Note that MATRIX_COEFFICIENTS_IDENTITY enables lossless conversion from RGB to YUV.
 
 	avifImage *avifIm = avifImageCreate(gdImageSX(im), gdImageSY(im), 8, subsampling);
-
+#if AVIF_VERSION >= 1000000
+	if (avifIm == NULL) {
+		gd_error("avif error - Creating image failed\n");
+		goto cleanup;
+	}
+#endif
 	avifIm->colorPrimaries = AVIF_COLOR_PRIMARIES_BT709;
 	avifIm->transferCharacteristics = AVIF_TRANSFER_CHARACTERISTICS_SRGB;
 	avifIm->matrixCoefficients = lossless ? AVIF_MATRIX_COEFFICIENTS_IDENTITY : AVIF_MATRIX_COEFFICIENTS_BT709;
 
 	avifRGBImageSetDefaults(&rgb, avifIm);
 	// this allocates memory, and sets rgb.rowBytes and rgb.pixels.
+#if AVIF_VERSION >= 1000000
+	result = avifRGBImageAllocatePixels(&rgb);
+	if (isAvifError(result, "Allocating RGB pixels failed"))
+		goto cleanup;
+#else
 	avifRGBImageAllocatePixels(&rgb);
+#endif
 
 	// Parse RGB data from the GD image, and copy it into the AVIF RGB image.
 	// Convert 7-bit GD alpha channel values to 8-bit AVIF values.
@@ -555,6 +572,12 @@ void gdImageAvifCtx(gdImagePtr im, gdIOCtx *outfile, int quality, int speed)
 	// Encode the image in AVIF format.
 
 	encoder = avifEncoderCreate();
+#if AVIF_VERSION >= 1000000
+	if (encoder == NULL) {
+		gd_error("avif error - Creating encoder failed\n");
+		goto cleanup;
+	}
+#endif
 	int quantizerQuality = quality == QUALITY_DEFAULT ?
 		QUANTIZER_DEFAULT : quality2Quantizer(quality);
 
diff --git a/ext/gd/libgd/gd_interpolation.c b/ext/gd/libgd/gd_interpolation.c
index b5f40b4da2c47..8a0b4fb137b82 100644
--- a/ext/gd/libgd/gd_interpolation.c
+++ b/ext/gd/libgd/gd_interpolation.c
@@ -919,6 +919,24 @@ static inline LineContribType *_gdContributionsCalc(unsigned int line_size, unsi
 	return res;
 }
 
+static inline unsigned char
+uchar_clamp(double clr) {
+	unsigned short result;
+	assert(fabs(clr) <= SHRT_MAX);
+	/* Casting a negative float to an unsigned short is undefined.
+	 * However, casting a float to a signed truncates toward zero and
+	 * casting a negative signed value to an unsigned of the same size
+	 * results in a bit-identical value (assuming twos-complement
+	 * arithmetic).	 This is what we want: all legal negative values
+	 * for clr will be greater than 255. */
+	/* Convert and clamp. */
+	result = (unsigned short)(short)(clr + 0.5);
+	if (result > 255) {
+		result = (clr < 0) ? 0 : 255;
+	}/* if */
+	return result;
+}/* uchar_clamp*/
+
 static inline void _gdScaleRow(gdImagePtr pSrc,  unsigned int src_width, gdImagePtr dst, unsigned int dst_width, unsigned int row, LineContribType *contrib)
 {
     int *p_src_row = pSrc->tpixels[row];
@@ -926,20 +944,20 @@ static inline void _gdScaleRow(gdImagePtr pSrc,  unsigned int src_width, gdImage
 	unsigned int x;
 
     for (x = 0; x < dst_width; x++) {
-		register unsigned char r = 0, g = 0, b = 0, a = 0;
+	    double r = 0, g = 0, b = 0, a = 0;
         const int left = contrib->ContribRow[x].Left;
         const int right = contrib->ContribRow[x].Right;
-		int i;
+	int i;
 
-		/* Accumulate each channel */
-        for (i = left; i <= right; i++) {
-			const int left_channel = i - left;
-            r += (unsigned char)(contrib->ContribRow[x].Weights[left_channel] * (double)(gdTrueColorGetRed(p_src_row[i])));
-            g += (unsigned char)(contrib->ContribRow[x].Weights[left_channel] * (double)(gdTrueColorGetGreen(p_src_row[i])));
-            b += (unsigned char)(contrib->ContribRow[x].Weights[left_channel] * (double)(gdTrueColorGetBlue(p_src_row[i])));
-			a += (unsigned char)(contrib->ContribRow[x].Weights[left_channel] * (double)(gdTrueColorGetAlpha(p_src_row[i])));
-        }
-        p_dst_row[x] = gdTrueColorAlpha(r, g, b, a);
+	/* Accumulate each channel */
+	for (i = left; i <= right; i++) {
+		const int left_channel = i - left;
+		r += contrib->ContribRow[x].Weights[left_channel] * (double)(gdTrueColorGetRed(p_src_row[i]));
+		g += contrib->ContribRow[x].Weights[left_channel] * (double)(gdTrueColorGetGreen(p_src_row[i]));
+		b += contrib->ContribRow[x].Weights[left_channel] * (double)(gdTrueColorGetBlue(p_src_row[i]));
+		a += contrib->ContribRow[x].Weights[left_channel] * (double)(gdTrueColorGetAlpha(p_src_row[i]));
+	}
+	p_dst_row[x] = gdTrueColorAlpha(uchar_clamp(r), uchar_clamp(g), uchar_clamp(b), uchar_clamp(a));
     }
 }
 
@@ -972,7 +990,7 @@ static inline void _gdScaleCol (gdImagePtr pSrc,  unsigned int src_width, gdImag
 {
 	unsigned int y;
 	for (y = 0; y < dst_height; y++) {
-		register unsigned char r = 0, g = 0, b = 0, a = 0;
+		double r = 0, g = 0, b = 0, a = 0;
 		const int iLeft = contrib->ContribRow[y].Left;
 		const int iRight = contrib->ContribRow[y].Right;
 		int i;
@@ -981,12 +999,12 @@ static inline void _gdScaleCol (gdImagePtr pSrc,  unsigned int src_width, gdImag
 		for (i = iLeft; i <= iRight; i++) {
 			const int pCurSrc = pSrc->tpixels[i][uCol];
 			const int i_iLeft = i - iLeft;
-			r += (unsigned char)(contrib->ContribRow[y].Weights[i_iLeft] * (double)(gdTrueColorGetRed(pCurSrc)));
-			g += (unsigned char)(contrib->ContribRow[y].Weights[i_iLeft] * (double)(gdTrueColorGetGreen(pCurSrc)));
-			b += (unsigned char)(contrib->ContribRow[y].Weights[i_iLeft] * (double)(gdTrueColorGetBlue(pCurSrc)));
-			a += (unsigned char)(contrib->ContribRow[y].Weights[i_iLeft] * (double)(gdTrueColorGetAlpha(pCurSrc)));
+			r += contrib->ContribRow[y].Weights[i_iLeft] * (double)(gdTrueColorGetRed(pCurSrc));
+			g += contrib->ContribRow[y].Weights[i_iLeft] * (double)(gdTrueColorGetGreen(pCurSrc));
+			b += contrib->ContribRow[y].Weights[i_iLeft] * (double)(gdTrueColorGetBlue(pCurSrc));
+			a += contrib->ContribRow[y].Weights[i_iLeft] * (double)(gdTrueColorGetAlpha(pCurSrc));
 		}
-		pRes->tpixels[y][uCol] = gdTrueColorAlpha(r, g, b, a);
+		pRes->tpixels[y][uCol] = gdTrueColorAlpha(uchar_clamp(r), uchar_clamp(g), uchar_clamp(b), uchar_clamp(a));
 	}
 }
 
diff --git a/ext/gd/libgd/gd_tga.c b/ext/gd/libgd/gd_tga.c
index 3f9922189aada..f888f9ea6fbe9 100644
--- a/ext/gd/libgd/gd_tga.c
+++ b/ext/gd/libgd/gd_tga.c
@@ -191,7 +191,10 @@ int read_header_tga(gdIOCtx *ctx, oTga *tga)
 			return -1;
 		}
 
-		gdGetBuf(tga->ident, tga->identsize, ctx);
+		if (gdGetBuf(tga->ident, tga->identsize, ctx) != tga->identsize) {
+			gd_error("fail to read header ident");
+			return -1;
+		}
 	}
 
 	return 1;
diff --git a/ext/gd/libgd/wbmp.c b/ext/gd/libgd/wbmp.c
index 4c3eeee7df8cb..dbca0f0178c68 100644
--- a/ext/gd/libgd/wbmp.c
+++ b/ext/gd/libgd/wbmp.c
@@ -37,7 +37,8 @@
 int
 getmbi (int (*getin) (void *in), void *in)
 {
-  int i, mbi = 0;
+  unsigned int mbi = 0;
+  int i;
 
   do
     {
diff --git a/ext/gd/tests/gh16232.phpt b/ext/gd/tests/gh16232.phpt
new file mode 100644
index 0000000000000..7f839d737bb5b
--- /dev/null
+++ b/ext/gd/tests/gh16232.phpt
@@ -0,0 +1,27 @@
+--TEST--
+GH-16232 (Overflow on reading wbmp content)
+--EXTENSIONS--
+gd
+--FILE--
+
+--EXPECT--
+DONE
diff --git a/ext/gd/tests/gh16260.phpt b/ext/gd/tests/gh16260.phpt
new file mode 100644
index 0000000000000..563fc8d162786
--- /dev/null
+++ b/ext/gd/tests/gh16260.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GH-16260 (Overflow/underflow on imagerotate degrees argument)
+--EXTENSIONS--
+gd
+--FILE--
+getMessage() . PHP_EOL;
+}
+
+try {
+	imagerotate($im, PHP_INT_MAX, 0);
+} catch (\ValueError $e) {
+	echo $e->getMessage();
+}
+--EXPECTF--
+imagerotate(): Argument #2 ($angle) must be between %s and %s
+imagerotate(): Argument #2 ($angle) must be between %s and %s
diff --git a/ext/gd/tests/gh16322.phpt b/ext/gd/tests/gh16322.phpt
new file mode 100644
index 0000000000000..1edc27285d2db
--- /dev/null
+++ b/ext/gd/tests/gh16322.phpt
@@ -0,0 +1,27 @@
+--TEST--
+GH-16322 (imageaffine overflow/underflow on affine matrix)
+--EXTENSIONS--
+gd
+--INI--
+memory_limit=-1
+--FILE--
+getMessage() . PHP_EOL;
+}
+$matrix[0] = 1;
+$matrix[3] = -INF;
+try {
+	imageaffine($src, $matrix);
+} catch (\ValueError $e) {
+	echo $e->getMessage();
+}
+?>
+--EXPECTF--
+imageaffine(): Argument #2 ($affine) element 0 must be between %s and %d
+imageaffine(): Argument #2 ($affine) element 3 must be between %s and %d
diff --git a/ext/gmp/gmp.c b/ext/gmp/gmp.c
index 752d18ec56433..f3cb4a6ce101f 100644
--- a/ext/gmp/gmp.c
+++ b/ext/gmp/gmp.c
@@ -415,14 +415,13 @@ static zend_result gmp_do_operation_ex(uint8_t opcode, zval *result, zval *op1,
 static zend_result gmp_do_operation(uint8_t opcode, zval *result, zval *op1, zval *op2) /* {{{ */
 {
 	zval op1_copy;
-	int retval;
 
 	if (result == op1) {
 		ZVAL_COPY_VALUE(&op1_copy, op1);
 		op1 = &op1_copy;
 	}
 
-	retval = gmp_do_operation_ex(opcode, result, op1, op2);
+	zend_result retval = gmp_do_operation_ex(opcode, result, op1, op2);
 
 	if (retval == SUCCESS && op1 == &op1_copy) {
 		zval_ptr_dtor(op1);
@@ -1013,8 +1012,14 @@ ZEND_FUNCTION(gmp_export)
 	if (mpz_sgn(gmpnumber) == 0) {
 		RETVAL_EMPTY_STRING();
 	} else {
-		size_t bits_per_word = size * 8;
-		size_t count = (mpz_sizeinbase(gmpnumber, 2) + bits_per_word - 1) / bits_per_word;
+		ZEND_ASSERT(size > 0);
+		size_t size_in_base_2 = mpz_sizeinbase(gmpnumber, 2);
+		if (size > ZEND_LONG_MAX / 4 || size_in_base_2 > SIZE_MAX - (size_t) size * 8 + 1) {
+			zend_argument_value_error(2, "is too large for argument #1 ($num)");
+			RETURN_THROWS();
+		}
+		size_t bits_per_word = (size_t) size * 8;
+		size_t count = (size_in_base_2 + bits_per_word - 1) / bits_per_word;
 
 		zend_string *out_string = zend_string_safe_alloc(count, size, 0, 0);
 		mpz_export(ZSTR_VAL(out_string), NULL, order, size, endian, 0, gmpnumber);
@@ -1289,12 +1294,37 @@ ZEND_FUNCTION(gmp_pow)
 
 	if (Z_TYPE_P(base_arg) == IS_LONG && Z_LVAL_P(base_arg) >= 0) {
 		INIT_GMP_RETVAL(gmpnum_result);
-		mpz_ui_pow_ui(gmpnum_result, Z_LVAL_P(base_arg), exp);
+		if (exp >= INT_MAX) {
+			mpz_t base_num, exp_num, mod;
+			mpz_init(base_num);
+			mpz_init(exp_num);
+			mpz_init(mod);
+			mpz_set_si(base_num, Z_LVAL_P(base_arg));
+			mpz_set_si(exp_num, exp);
+			mpz_set_ui(mod, UINT_MAX);
+			mpz_powm(gmpnum_result, base_num, exp_num, mod);
+			mpz_clear(mod);
+			mpz_clear(exp_num);
+			mpz_clear(base_num);
+		} else {
+			mpz_ui_pow_ui(gmpnum_result, Z_LVAL_P(base_arg), exp);
+		}
 	} else {
 		mpz_ptr gmpnum_base;
 		FETCH_GMP_ZVAL(gmpnum_base, base_arg, temp_base, 1);
 		INIT_GMP_RETVAL(gmpnum_result);
-		mpz_pow_ui(gmpnum_result, gmpnum_base, exp);
+		if (exp >= INT_MAX) {
+			mpz_t exp_num, mod;
+			mpz_init(exp_num);
+			mpz_init(mod);
+			mpz_set_si(exp_num, exp);
+			mpz_set_ui(mod, UINT_MAX);
+			mpz_powm(gmpnum_result, gmpnum_base, exp_num, mod);
+			mpz_clear(mod);
+			mpz_clear(exp_num);
+		} else {
+			mpz_pow_ui(gmpnum_result, gmpnum_base, exp);
+		}
 		FREE_GMP_TEMP(temp_base);
 	}
 }
diff --git a/ext/gmp/tests/gh16411.phpt b/ext/gmp/tests/gh16411.phpt
new file mode 100644
index 0000000000000..798943002cfce
--- /dev/null
+++ b/ext/gmp/tests/gh16411.phpt
@@ -0,0 +1,11 @@
+--TEST--
+GH-16411 (gmp_export() can cause overflow)
+--EXTENSIONS--
+gmp
+--FILE--
+
+--EXPECTF--
+Fatal error: Uncaught ValueError: gmp_export(): Argument #2 ($word_size) is too large for argument #1 ($num) in %s:%d
+%A
diff --git a/ext/gmp/tests/gmp_pow_fpe.phpt b/ext/gmp/tests/gmp_pow_fpe.phpt
new file mode 100644
index 0000000000000..d564853799c8d
--- /dev/null
+++ b/ext/gmp/tests/gmp_pow_fpe.phpt
@@ -0,0 +1,20 @@
+--TEST--
+gmp_pow() floating point exception
+--EXTENSIONS--
+gmp
+--FILE--
+
+--EXPECTF--
+object(GMP)#2 (1) {
+  ["num"]=>
+  string(%d) "%s"
+}
+object(GMP)#2 (1) {
+  ["num"]=>
+  string(%d) "%s"
+}
diff --git a/ext/hash/hash_arginfo.h b/ext/hash/hash_arginfo.h
index 27d4f64694d86..24a17fd9750b4 100644
--- a/ext/hash/hash_arginfo.h
+++ b/ext/hash/hash_arginfo.h
@@ -208,35 +208,35 @@ static void register_hash_symbols(int module_number)
 	zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "hash_hkdf", sizeof("hash_hkdf") - 1), 1, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
 #if defined(PHP_MHASH_BC)
 
-	zend_attribute *attribute_Deprecated_func_mhash_get_block_size_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash_get_block_size", sizeof("mhash_get_block_size") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_mhash_get_block_size_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash_get_block_size", sizeof("mhash_get_block_size") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_mhash_get_block_size_0_arg0;
 	zend_string *attribute_Deprecated_func_mhash_get_block_size_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_mhash_get_block_size_0_arg0, attribute_Deprecated_func_mhash_get_block_size_0_arg0_str);
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_mhash_get_block_size_0->args[0].value, &attribute_Deprecated_func_mhash_get_block_size_0_arg0);
 	attribute_Deprecated_func_mhash_get_block_size_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
 
-	zend_attribute *attribute_Deprecated_func_mhash_get_hash_name_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash_get_hash_name", sizeof("mhash_get_hash_name") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_mhash_get_hash_name_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash_get_hash_name", sizeof("mhash_get_hash_name") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_mhash_get_hash_name_0_arg0;
 	zend_string *attribute_Deprecated_func_mhash_get_hash_name_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_mhash_get_hash_name_0_arg0, attribute_Deprecated_func_mhash_get_hash_name_0_arg0_str);
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_mhash_get_hash_name_0->args[0].value, &attribute_Deprecated_func_mhash_get_hash_name_0_arg0);
 	attribute_Deprecated_func_mhash_get_hash_name_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
 
-	zend_attribute *attribute_Deprecated_func_mhash_keygen_s2k_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash_keygen_s2k", sizeof("mhash_keygen_s2k") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_mhash_keygen_s2k_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash_keygen_s2k", sizeof("mhash_keygen_s2k") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_mhash_keygen_s2k_0_arg0;
 	zend_string *attribute_Deprecated_func_mhash_keygen_s2k_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_mhash_keygen_s2k_0_arg0, attribute_Deprecated_func_mhash_keygen_s2k_0_arg0_str);
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_mhash_keygen_s2k_0->args[0].value, &attribute_Deprecated_func_mhash_keygen_s2k_0_arg0);
 	attribute_Deprecated_func_mhash_keygen_s2k_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
 
-	zend_attribute *attribute_Deprecated_func_mhash_count_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash_count", sizeof("mhash_count") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_mhash_count_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash_count", sizeof("mhash_count") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_mhash_count_0_arg0;
 	zend_string *attribute_Deprecated_func_mhash_count_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_mhash_count_0_arg0, attribute_Deprecated_func_mhash_count_0_arg0_str);
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_mhash_count_0->args[0].value, &attribute_Deprecated_func_mhash_count_0_arg0);
 	attribute_Deprecated_func_mhash_count_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
 
-	zend_attribute *attribute_Deprecated_func_mhash_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash", sizeof("mhash") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_mhash_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mhash", sizeof("mhash") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_mhash_0_arg0;
 	zend_string *attribute_Deprecated_func_mhash_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_mhash_0_arg0, attribute_Deprecated_func_mhash_0_arg0_str);
diff --git a/ext/intl/formatter/formatter_arginfo.h b/ext/intl/formatter/formatter_arginfo.h
index 9b2874da05ac6..ac7fed58ec908 100644
--- a/ext/intl/formatter/formatter_arginfo.h
+++ b/ext/intl/formatter/formatter_arginfo.h
@@ -592,7 +592,7 @@ static zend_class_entry *register_class_NumberFormatter(void)
 	zend_string_release(const_TYPE_CURRENCY_name);
 
 
-	zend_attribute *attribute_Deprecated_const_TYPE_CURRENCY_0 = zend_add_class_constant_attribute(class_entry, const_TYPE_CURRENCY, ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_const_TYPE_CURRENCY_0 = zend_add_class_constant_attribute(class_entry, const_TYPE_CURRENCY, ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_const_TYPE_CURRENCY_0_arg0;
 	zend_string *attribute_Deprecated_const_TYPE_CURRENCY_0_arg0_str = zend_string_init("8.3", strlen("8.3"), 1);
 	ZVAL_STR(&attribute_Deprecated_const_TYPE_CURRENCY_0_arg0, attribute_Deprecated_const_TYPE_CURRENCY_0_arg0_str);
diff --git a/ext/intl/php_intl_arginfo.h b/ext/intl/php_intl_arginfo.h
index 5e7c65c77ff6d..e094df17b9373 100644
--- a/ext/intl/php_intl_arginfo.h
+++ b/ext/intl/php_intl_arginfo.h
@@ -1210,7 +1210,7 @@ static void register_php_intl_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("IDNA_ERROR_CONTEXTJ", UIDNA_ERROR_CONTEXTJ, CONST_PERSISTENT);
 
 
-	zend_attribute *attribute_Deprecated_func_intlcal_set_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "intlcal_set", sizeof("intlcal_set") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_intlcal_set_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "intlcal_set", sizeof("intlcal_set") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_intlcal_set_0_arg0;
 	zend_string *attribute_Deprecated_func_intlcal_set_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_intlcal_set_0_arg0, attribute_Deprecated_func_intlcal_set_0_arg0_str);
@@ -1222,7 +1222,7 @@ static void register_php_intl_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_intlcal_set_0->args[1].value, &attribute_Deprecated_func_intlcal_set_0_arg1);
 	attribute_Deprecated_func_intlcal_set_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_intlgregcal_create_instance_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "intlgregcal_create_instance", sizeof("intlgregcal_create_instance") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_intlgregcal_create_instance_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "intlgregcal_create_instance", sizeof("intlgregcal_create_instance") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_intlgregcal_create_instance_0_arg0;
 	zend_string *attribute_Deprecated_func_intlgregcal_create_instance_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_intlgregcal_create_instance_0_arg0, attribute_Deprecated_func_intlgregcal_create_instance_0_arg0_str);
diff --git a/ext/json/json_encoder.c b/ext/json/json_encoder.c
index de3106601b9c5..7c44a7f5c7a71 100644
--- a/ext/json/json_encoder.c
+++ b/ext/json/json_encoder.c
@@ -32,6 +32,15 @@
 
 static const char digits[] = "0123456789abcdef";
 
+static zend_always_inline bool php_json_check_stack_limit(void)
+{
+#ifdef ZEND_CHECK_STACK_LIMIT
+	return zend_call_stack_overflowed(EG(stack_limit));
+#else
+	return false;
+#endif
+}
+
 static int php_json_determine_array_type(zval *val) /* {{{ */
 {
 	zend_array *myht = Z_ARRVAL_P(val);
@@ -117,6 +126,14 @@ static zend_result php_json_encode_array(smart_str *buf, zval *val, int options,
 	HashTable *myht, *prop_ht;
 	zend_refcounted *recursion_rc;
 
+	if (php_json_check_stack_limit()) {
+		encoder->error_code = PHP_JSON_ERROR_DEPTH;
+		if (options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR) {
+			smart_str_appendl(buf, "null", 4);
+		}
+		return FAILURE;
+	}
+
 	if (Z_TYPE_P(val) == IS_ARRAY) {
 		myht = Z_ARRVAL_P(val);
 		recursion_rc = (zend_refcounted *)myht;
diff --git a/ext/json/tests/gh15168.phpt b/ext/json/tests/gh15168.phpt
new file mode 100644
index 0000000000000..9b674d6b4ac07
--- /dev/null
+++ b/ext/json/tests/gh15168.phpt
@@ -0,0 +1,38 @@
+--TEST--
+GH-15168 (stack overflow in json_encode())
+--SKIPIF--
+
+--INI--
+zend.max_allowed_stack_size=512K
+--FILE--
+next = $newNode;
+    $node = $newNode;
+}
+
+var_dump(json_encode($firstNode, depth: 500000));
+var_dump(json_last_error());
+var_dump(json_last_error_msg());
+
+?>
+--EXPECT--
+bool(false)
+int(1)
+string(28) "Maximum stack depth exceeded"
diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c
index b7db6bbbcf3f0..c15a3e728096c 100644
--- a/ext/ldap/ldap.c
+++ b/ext/ldap/ldap.c
@@ -234,6 +234,31 @@ static void ldap_result_entry_free_obj(zend_object *obj)
 	} \
 }
 
+/* An LDAP value must be a string, however it defines a format for integer and
+ * booleans, thus we parse zvals to the corresponding string if possible
+ * See RFC 4517: https://datatracker.ietf.org/doc/html/rfc4517 */
+static zend_string* php_ldap_try_get_ldap_value_from_zval(zval *zv) {
+	switch (Z_TYPE_P(zv)) {
+		case IS_STRING:
+		case IS_LONG:
+		/* Object might be stringable */
+		case IS_OBJECT:
+			return zval_try_get_string(zv);
+		case IS_TRUE:
+			return ZSTR_INIT_LITERAL("TRUE", false);
+		case IS_FALSE:
+			return ZSTR_INIT_LITERAL("FALSE", false);
+		default:
+			zend_type_error("LDAP value must be of type string|int|bool, %s given", zend_zval_value_name(zv));
+			return NULL;
+	}
+}
+
+/* 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)));
+}
+
 /* {{{ Parse controls from and to arrays */
 static void _php_ldap_control_to_array(LDAP *ld, LDAPControl* ctrl, zval* array, int request)
 {
@@ -381,17 +406,16 @@ static void _php_ldap_control_to_array(LDAP *ld, LDAPControl* ctrl, zval* array,
 	}
 }
 
-static int _php_ldap_control_from_array(LDAP *ld, LDAPControl** ctrl, zval* array)
+static int php_ldap_control_from_array(LDAP *ld, LDAPControl** ctrl, const HashTable *control_ht)
 {
 	zval* val;
 	zend_string *control_oid;
-	int control_iscritical = 0, rc = LDAP_SUCCESS;
 	char** ldap_attrs = NULL;
 	LDAPSortKey** sort_keys = NULL;
 	zend_string *tmpstring = NULL, **tmpstrings1 = NULL, **tmpstrings2 = NULL;
 	size_t num_tmpstrings1 = 0, num_tmpstrings2 = 0;
 
-	if ((val = zend_hash_str_find(Z_ARRVAL_P(array), "oid", sizeof("oid") - 1)) == NULL) {
+	if ((val = zend_hash_str_find(control_ht, "oid", sizeof("oid") - 1)) == NULL) {
 		zend_value_error("%s(): Control must have an \"oid\" key", get_active_function_name());
 		return -1;
 	}
@@ -401,17 +425,17 @@ static int _php_ldap_control_from_array(LDAP *ld, LDAPControl** ctrl, zval* arra
 		return -1;
 	}
 
-	if ((val = zend_hash_str_find(Z_ARRVAL_P(array), "iscritical", sizeof("iscritical") - 1)) != NULL) {
+	bool control_iscritical = false;
+	if ((val = zend_hash_str_find(control_ht, "iscritical", sizeof("iscritical") - 1)) != NULL) {
 		control_iscritical = zend_is_true(val);
-	} else {
-		control_iscritical = 0;
 	}
 
 	BerElement *ber = NULL;
 	struct berval control_value = { 0L, NULL };
-	int control_value_alloc = 0;
+	bool control_value_alloc = false;
+	int rc = LDAP_SUCCESS;
 
-	if ((val = zend_hash_find(Z_ARRVAL_P(array), ZSTR_KNOWN(ZEND_STR_VALUE))) != NULL) {
+	if ((val = zend_hash_find(control_ht, ZSTR_KNOWN(ZEND_STR_VALUE))) != NULL) {
 		if (Z_TYPE_P(val) != IS_ARRAY) {
 			tmpstring = zval_get_string(val);
 			if (EG(exception)) {
@@ -420,7 +444,7 @@ static int _php_ldap_control_from_array(LDAP *ld, LDAPControl** ctrl, zval* arra
 			}
 			control_value.bv_val = ZSTR_VAL(tmpstring);
 			control_value.bv_len = ZSTR_LEN(tmpstring);
-		} else if (strcmp(ZSTR_VAL(control_oid), LDAP_CONTROL_PAGEDRESULTS) == 0) {
+		} else if (zend_string_equals_literal(control_oid, LDAP_CONTROL_PAGEDRESULTS)) {
 			zval* tmp;
 			int pagesize = 1;
 			struct berval cookie = { 0L, NULL };
@@ -442,7 +466,7 @@ static int _php_ldap_control_from_array(LDAP *ld, LDAPControl** ctrl, zval* arra
 			if (rc != LDAP_SUCCESS) {
 				php_error_docref(NULL, E_WARNING, "Failed to create paged result control value: %s (%d)", ldap_err2string(rc), rc);
 			}
-		} else if (strcmp(ZSTR_VAL(control_oid), LDAP_CONTROL_ASSERT) == 0) {
+		} else if (zend_string_equals_literal(control_oid, LDAP_CONTROL_ASSERT)) {
 			zval* tmp;
 			zend_string* assert;
 			if ((tmp = zend_hash_str_find(Z_ARRVAL_P(val), "filter", sizeof("filter") - 1)) == NULL) {
@@ -466,7 +490,7 @@ static int _php_ldap_control_from_array(LDAP *ld, LDAPControl** ctrl, zval* arra
 				}
 				zend_string_release(assert);
 			}
-		} else if (strcmp(ZSTR_VAL(control_oid), LDAP_CONTROL_VALUESRETURNFILTER) == 0) {
+		} else if (zend_string_equals_literal(control_oid, LDAP_CONTROL_VALUESRETURNFILTER)) {
 			zval* tmp;
 			if ((tmp = zend_hash_str_find(Z_ARRVAL_P(val), "filter", sizeof("filter") - 1)) == NULL) {
 				rc = -1;
@@ -490,7 +514,7 @@ static int _php_ldap_control_from_array(LDAP *ld, LDAPControl** ctrl, zval* arra
 					}
 				}
 			}
-		} else if ((strcmp(ZSTR_VAL(control_oid), LDAP_CONTROL_PRE_READ) == 0) || (strcmp(ZSTR_VAL(control_oid), LDAP_CONTROL_POST_READ) == 0)) {
+		} else if (zend_string_equals_literal(control_oid, LDAP_CONTROL_PRE_READ) || zend_string_equals_literal(control_oid, LDAP_CONTROL_POST_READ)) {
 			zval* tmp;
 			if ((tmp = zend_hash_str_find(Z_ARRVAL_P(val), "attrs", sizeof("attrs") - 1)) == NULL) {
 				rc = -1;
@@ -542,7 +566,7 @@ static int _php_ldap_control_from_array(LDAP *ld, LDAPControl** ctrl, zval* arra
 					}
 				}
 			}
-		} else if (strcmp(ZSTR_VAL(control_oid), LDAP_CONTROL_SORTREQUEST) == 0) {
+		} else if (zend_string_equals_literal(control_oid, LDAP_CONTROL_SORTREQUEST)) {
 			int num_keys, i;
 			zval *sortkey, *tmp;
 
@@ -599,7 +623,7 @@ static int _php_ldap_control_from_array(LDAP *ld, LDAPControl** ctrl, zval* arra
 			if (rc != LDAP_SUCCESS) {
 				php_error_docref(NULL, E_WARNING, "Failed to create sort control value: %s (%d)", ldap_err2string(rc), rc);
 			}
-		} else if (strcmp(ZSTR_VAL(control_oid), LDAP_CONTROL_VLVREQUEST) == 0) {
+		} else if (zend_string_equals_literal(control_oid, LDAP_CONTROL_VLVREQUEST)) {
 			zval* tmp;
 			LDAPVLVInfo vlvInfo;
 			struct berval attrValue;
@@ -745,25 +769,24 @@ static void _php_ldap_controls_to_array(LDAP *ld, LDAPControl** ctrls, zval* arr
 	ldap_controls_free(ctrls);
 }
 
-static LDAPControl** _php_ldap_controls_from_array(LDAP *ld, zval* array, uint32_t arg_num)
+static LDAPControl** php_ldap_controls_from_array(LDAP *ld, const HashTable *controls, uint32_t arg_num)
 {
-	int ncontrols;
 	LDAPControl** ctrlp, **ctrls = NULL;
 	zval* ctrlarray;
 	int error = 0;
 
-	ncontrols = zend_hash_num_elements(Z_ARRVAL_P(array));
-	ctrls = safe_emalloc((1 + ncontrols), sizeof(*ctrls), 0);
+	uint32_t num_controls = zend_hash_num_elements(controls);
+	ctrls = safe_emalloc((1 + num_controls), sizeof(*ctrls), 0);
 	*ctrls = NULL;
 	ctrlp = ctrls;
-	ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(array), ctrlarray) {
+	ZEND_HASH_FOREACH_VAL(controls, ctrlarray) {
 		if (Z_TYPE_P(ctrlarray) != IS_ARRAY) {
 			zend_argument_type_error(arg_num, "must contain only arrays, where each array is a control");
 			error = 1;
 			break;
 		}
 
-		if (_php_ldap_control_from_array(ld, ctrlp, ctrlarray) == LDAP_SUCCESS) {
+		if (php_ldap_control_from_array(ld, ctrlp, Z_ARRVAL_P(ctrlarray)) == LDAP_SUCCESS) {
 			++ctrlp;
 		} else {
 			error = 1;
@@ -1102,18 +1125,6 @@ static int _get_lderrno(LDAP *ldap)
 }
 /* }}} */
 
-/* {{{ _set_lderrno */
-static void _set_lderrno(LDAP *ldap, int lderr)
-{
-#if LDAP_API_VERSION > 2000 || defined(HAVE_ORALDAP)
-	/* New versions of OpenLDAP do it this way */
-	ldap_set_option(ldap, LDAP_OPT_ERROR_NUMBER, &lderr);
-#else
-	ldap->ld_errno = lderr;
-#endif
-}
-/* }}} */
-
 /* {{{ Bind to LDAP directory */
 PHP_FUNCTION(ldap_bind)
 {
@@ -1123,25 +1134,13 @@ PHP_FUNCTION(ldap_bind)
 	ldap_linkdata *ld;
 	int rc;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|s!s!", &link, ldap_link_ce, &ldap_bind_dn, &ldap_bind_dnlen, &ldap_bind_pw, &ldap_bind_pwlen) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|p!p!", &link, ldap_link_ce, &ldap_bind_dn, &ldap_bind_dnlen, &ldap_bind_pw, &ldap_bind_pwlen) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
 	ld = Z_LDAP_LINK_P(link);
 	VERIFY_LDAP_LINK_CONNECTED(ld);
 
-	if (ldap_bind_dn != NULL && memchr(ldap_bind_dn, '\0', ldap_bind_dnlen) != NULL) {
-		_set_lderrno(ld->link, LDAP_INVALID_CREDENTIALS);
-		zend_argument_type_error(2, "must not contain null bytes");
-		RETURN_THROWS();
-	}
-
-	if (ldap_bind_pw != NULL && memchr(ldap_bind_pw, '\0', ldap_bind_pwlen) != NULL) {
-		_set_lderrno(ld->link, LDAP_INVALID_CREDENTIALS);
-		zend_argument_type_error(3, "must not contain null bytes");
-		RETURN_THROWS();
-	}
-
 	{
 #ifdef LDAP_API_FEATURE_X_OPENLDAP
 		/* ldap_simple_bind_s() is deprecated, use ldap_sasl_bind_s() instead.
@@ -1169,37 +1168,25 @@ PHP_FUNCTION(ldap_bind)
 /* {{{ Bind to LDAP directory */
 PHP_FUNCTION(ldap_bind_ext)
 {
-	zval *serverctrls = NULL;
 	zval *link;
 	char *ldap_bind_dn = NULL, *ldap_bind_pw = NULL;
 	size_t ldap_bind_dnlen, ldap_bind_pwlen;
+	HashTable *server_controls_ht = NULL;
 	ldap_linkdata *ld;
 	LDAPControl **lserverctrls = NULL;
 	ldap_resultdata *result;
 	LDAPMessage *ldap_res;
 	int rc;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|s!s!a!", &link, ldap_link_ce, &ldap_bind_dn, &ldap_bind_dnlen, &ldap_bind_pw, &ldap_bind_pwlen, &serverctrls) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|p!p!h!", &link, ldap_link_ce, &ldap_bind_dn, &ldap_bind_dnlen, &ldap_bind_pw, &ldap_bind_pwlen, &server_controls_ht) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
 	ld = Z_LDAP_LINK_P(link);
 	VERIFY_LDAP_LINK_CONNECTED(ld);
 
-	if (ldap_bind_dn != NULL && memchr(ldap_bind_dn, '\0', ldap_bind_dnlen) != NULL) {
-		_set_lderrno(ld->link, LDAP_INVALID_CREDENTIALS);
-		zend_argument_type_error(2, "must not contain null bytes");
-		RETURN_THROWS();
-	}
-
-	if (ldap_bind_pw != NULL && memchr(ldap_bind_pw, '\0', ldap_bind_pwlen) != NULL) {
-		_set_lderrno(ld->link, LDAP_INVALID_CREDENTIALS);
-		zend_argument_type_error(3, "must not contain null bytes");
-		RETURN_THROWS();
-	}
-
-	if (serverctrls) {
-		lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 4);
+	if (server_controls_ht) {
+		lserverctrls = php_ldap_controls_from_array(ld->link, server_controls_ht, 4);
 		if (lserverctrls == NULL) {
 			RETVAL_FALSE;
 			goto cleanup;
@@ -1342,7 +1329,18 @@ PHP_FUNCTION(ldap_sasl_bind)
 	size_t rc, dn_len, passwd_len, mech_len, realm_len, authc_id_len, authz_id_len, props_len;
 	php_ldap_bictx *ctx;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|s!s!s!s!s!s!s!", &link, ldap_link_ce, &binddn, &dn_len, &passwd, &passwd_len, &sasl_mech, &mech_len, &sasl_realm, &realm_len, &sasl_authc_id, &authc_id_len, &sasl_authz_id, &authz_id_len, &props, &props_len) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|p!p!p!p!p!p!p!",
+		&link, ldap_link_ce,
+		&binddn, &dn_len,
+		&passwd, &passwd_len,
+		&sasl_mech, &mech_len,
+		&sasl_realm, &realm_len,
+		&sasl_authc_id,
+		&authc_id_len,
+		&sasl_authz_id,
+		&authz_id_len,
+		&props, &props_len
+	) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
@@ -1427,11 +1425,13 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in
 /* {{{ php_ldap_do_search */
 static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
 {
-	zval *link, *attrs = NULL, *attr, *serverctrls = NULL;
-	zend_string *base_dn_str, *filter_str;
-	HashTable *base_dn_ht, *filter_ht;
+	zval *link, *attrs = NULL;
+	HashTable *base_dn_ht = NULL;
+	zend_string *base_dn_str = NULL;
+	HashTable *filter_ht = NULL;
+	zend_string *filter_str = NULL;
 	zend_long attrsonly, sizelimit, timelimit, deref;
-	zend_string *ldap_filter = NULL, *ldap_base_dn = NULL;
+	HashTable *server_controls_ht = NULL;
 	char **ldap_attrs = NULL;
 	ldap_linkdata *ld = NULL;
 	ldap_resultdata *result;
@@ -1439,7 +1439,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
 	LDAPControl **lserverctrls = NULL;
 	int ldap_attrsonly = 0, ldap_sizelimit = -1, ldap_timelimit = -1, ldap_deref = -1;
 	int old_ldap_sizelimit = -1, old_ldap_timelimit = -1, old_ldap_deref = -1;
-	int num_attribs = 0, ret = 1, i, ldap_errno, argcount = ZEND_NUM_ARGS();
+	int ret = 1, ldap_errno, argcount = ZEND_NUM_ARGS();
 
 	ZEND_PARSE_PARAMETERS_START(3, 9)
 		Z_PARAM_ZVAL(link)
@@ -1451,7 +1451,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
 		Z_PARAM_LONG(sizelimit)
 		Z_PARAM_LONG(timelimit)
 		Z_PARAM_LONG(deref)
-		Z_PARAM_ARRAY_EX(serverctrls, 1, 1)
+		Z_PARAM_ARRAY_HT_EX(server_controls_ht, 1, 1)
 	ZEND_PARSE_PARAMETERS_END();
 
 	/* Reverse -> fall through */
@@ -1469,138 +1469,190 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
 		case 5:
 			ldap_attrsonly = attrsonly;
 			ZEND_FALLTHROUGH;
-		case 4:
-			num_attribs = zend_hash_num_elements(Z_ARRVAL_P(attrs));
-			ldap_attrs = safe_emalloc((num_attribs+1), sizeof(char *), 0);
+		default:
+			break;
+	}
 
-			for (i = 0; ilink) {
+			ldap_linkdata *current_ld = Z_LDAP_LINK_P(link_zv);
+			if (!current_ld->link) {
 				zend_throw_error(NULL, "LDAP connection has already been closed");
 				ret = 0;
 				goto cleanup_parallel;
 			}
 
-			if (nbases != 0) { /* base_dn an array? */
-				entry = zend_hash_get_current_data(base_dn_ht);
-				zend_hash_move_forward(base_dn_ht);
-				ldap_base_dn = zval_get_string(entry);
-				if (EG(exception)) {
+			if (num_base_dns != 0) { /* base_dn an array? */
+				zval *base_dn_zv = zend_hash_index_find(base_dn_ht, ldap_link_index);
+				ZEND_ASSERT(base_dn_zv);
+				ZVAL_DEREF(base_dn_zv);
+				if (Z_TYPE_P(base_dn_zv) != IS_STRING) {
+					zend_argument_type_error(2, "must be a list of strings, %s given", zend_zval_value_name(base_dn_zv));
+					ret = 0;
+					goto cleanup_parallel;
+				}
+				ldap_base_dn = Z_STR_P(base_dn_zv);
+				if (zend_str_has_nul_byte(ldap_base_dn)) {
+					zend_argument_value_error(2, "must not contain null bytes");
 					ret = 0;
 					goto cleanup_parallel;
 				}
 			}
-			if (nfilters != 0) { /* filter an array? */
-				entry = zend_hash_get_current_data(filter_ht);
-				zend_hash_move_forward(filter_ht);
-				ldap_filter = zval_get_string(entry);
-				if (EG(exception)) {
+			if (num_filters != 0) { /* filter an array? */
+				zval *filter_zv = zend_hash_index_find(filter_ht, ldap_link_index);
+				ZEND_ASSERT(filter_zv);
+				ZVAL_DEREF(filter_zv);
+				if (Z_TYPE_P(filter_zv) != IS_STRING) {
+					zend_argument_type_error(3, "must be a list of strings, %s given", zend_zval_value_name(filter_zv));
+					ret = 0;
+					goto cleanup_parallel;
+				}
+				ldap_filter = Z_STR_P(filter_zv);
+				if (zend_str_has_nul_byte(ldap_filter)) {
+					zend_argument_value_error(3, "must not contain null bytes");
 					ret = 0;
 					goto cleanup_parallel;
 				}
 			}
 
-			if (serverctrls) {
+			if (server_controls_ht) {
 				/* We have to parse controls again for each link as they use it */
 				_php_ldap_controls_free(&lserverctrls);
-				lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 9);
+				lserverctrls = php_ldap_controls_from_array(current_ld->link, server_controls_ht, 9);
 				if (lserverctrls == NULL) {
-					rcs[i] = -1;
+					rcs[ldap_link_index] = -1;
+					// TODO Throw an exception/cleanup?
 					continue;
 				}
 			}
 
-			php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref, &old_ldap_sizelimit, &old_ldap_timelimit, &old_ldap_deref);
+			php_set_opts(current_ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref, &old_ldap_sizelimit, &old_ldap_timelimit, &old_ldap_deref);
 
 			/* Run the actual search */
-			ldap_search_ext(ld->link, ZSTR_VAL(ldap_base_dn), scope, ZSTR_VAL(ldap_filter), ldap_attrs, ldap_attrsonly, lserverctrls, NULL, NULL, ldap_sizelimit, &rcs[i]);
-			lds[i] = ld;
-			zend_hash_move_forward(Z_ARRVAL_P(link));
-		}
+			ldap_search_ext(current_ld->link, ZSTR_VAL(ldap_base_dn), scope, ZSTR_VAL(ldap_filter), ldap_attrs, ldap_attrsonly, lserverctrls, NULL, NULL, ldap_sizelimit, &rcs[ldap_link_index]);
+			lds[ldap_link_index] = current_ld;
+
+			// TODO Reset the options of the link?
+		} ZEND_HASH_FOREACH_END();
 
 		array_init(return_value);
 
 		/* Collect results from the searches */
-		for (i=0; ilink, LDAP_RES_ANY, 1 /* LDAP_MSG_ALL */, NULL, &ldap_res);
 			}
 			if (rcs[i] != -1) {
+				zval object;
 				object_init_ex(&object, ldap_result_ce);
 				result = Z_LDAP_RESULT_P(&object);
 				result->result = ldap_res;
@@ -1622,21 +1674,19 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
 		}
 
 		if (!base_dn_str) {
-			zend_argument_type_error(2, "must be of type string when argument #1 ($ldap) is an LDAP instance");
+			zend_argument_type_error(2, "must be of type string when argument #1 ($ldap) is an LDAP\\Connection instance");
 			ret = 0;
 			goto cleanup;
 		}
-		ldap_base_dn = zend_string_copy(base_dn_str);
 
 		if (!filter_str) {
-			zend_argument_type_error(3, "must be of type string when argument #1 ($ldap) is an LDAP instance");
+			zend_argument_type_error(3, "must be of type string when argument #1 ($ldap) is an LDAP\\Connection instance");
 			ret = 0;
 			goto cleanup;
 		}
-		ldap_filter = zend_string_copy(filter_str);
 
-		if (serverctrls) {
-			lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 9);
+		if (server_controls_ht) {
+			lserverctrls = php_ldap_controls_from_array(ld->link, server_controls_ht, 9);
 			if (lserverctrls == NULL) {
 				ret = 0;
 				goto cleanup;
@@ -1646,7 +1696,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
 		php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref, &old_ldap_sizelimit, &old_ldap_timelimit, &old_ldap_deref);
 
 		/* Run the actual search */
-		ldap_errno = ldap_search_ext_s(ld->link, ZSTR_VAL(ldap_base_dn), scope, ZSTR_VAL(ldap_filter), ldap_attrs, ldap_attrsonly, lserverctrls, NULL, NULL, ldap_sizelimit, &ldap_res);
+		ldap_errno = ldap_search_ext_s(ld->link, ZSTR_VAL(base_dn_str), scope, ZSTR_VAL(filter_str), ldap_attrs, ldap_attrsonly, lserverctrls, NULL, NULL, ldap_sizelimit, &ldap_res);
 
 		if (ldap_errno != LDAP_SUCCESS
 			&& ldap_errno != LDAP_SIZELIMIT_EXCEEDED
@@ -1678,7 +1728,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
 			result->result = ldap_res;
 		}
 	} else {
-		zend_argument_type_error(1, "must be of type LDAP|array, %s given", zend_zval_value_name(link));
+		zend_argument_type_error(1, "must be of type LDAP\\Connection|array, %s given", zend_zval_value_name(link));
 	}
 
 cleanup:
@@ -1686,12 +1736,6 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
 		/* Restoring previous options */
 		php_set_opts(ld->link, old_ldap_sizelimit, old_ldap_timelimit, old_ldap_deref, &ldap_sizelimit, &ldap_timelimit, &ldap_deref);
 	}
-	if (ldap_filter) {
-		zend_string_release(ldap_filter);
-	}
-	if (ldap_base_dn) {
-		zend_string_release(ldap_base_dn);
-	}
 	if (ldap_attrs != NULL) {
 		efree(ldap_attrs);
 	}
@@ -2059,7 +2103,7 @@ PHP_FUNCTION(ldap_get_values_len)
 	int i, num_values;
 	size_t attr_len;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOs", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce, &attr, &attr_len) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOp", &link, ldap_link_ce, &result_entry, ldap_result_entry_ce, &attr, &attr_len) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
@@ -2122,10 +2166,9 @@ PHP_FUNCTION(ldap_explode_dn)
 {
 	zend_long with_attrib;
 	char *dn, **ldap_value;
-	int i, count;
 	size_t dn_len;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "sl", &dn, &dn_len, &with_attrib) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "pl", &dn, &dn_len, &with_attrib) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
@@ -2134,16 +2177,12 @@ PHP_FUNCTION(ldap_explode_dn)
 		RETURN_FALSE;
 	}
 
-	i=0;
-	while (ldap_value[i] != NULL) i++;
-	count = i;
-
 	array_init(return_value);
-
-	add_assoc_long(return_value, "count", count);
-	for (i = 0; imod_op = oper | LDAP_MOD_BVALUES;
-		ldap_mods[i]->mod_type = NULL;
-
-		if (zend_hash_get_current_key(Z_ARRVAL_P(entry), &attribute, &index) == HASH_KEY_IS_STRING) {
-			ldap_mods[i]->mod_type = estrndup(ZSTR_VAL(attribute), ZSTR_LEN(attribute));
-		} else {
-			php_error_docref(NULL, E_WARNING, "Unknown attribute in the data");
-			/* Free allocated memory */
-			while (i >= 0) {
-				if (ldap_mods[i]->mod_type) {
-					efree(ldap_mods[i]->mod_type);
-				}
-				efree(ldap_mods[i]);
-				i--;
-			}
-			efree(num_berval);
-			efree(ldap_mods);
-			RETURN_FALSE;
+	zend_string *attribute = NULL;
+	zval *attribute_values = NULL;
+	unsigned int attribute_index = 0;
+	ZEND_HASH_FOREACH_STR_KEY_VAL(attributes_ht, attribute, attribute_values) {
+		if (attribute == NULL) {
+			zend_argument_value_error(3, "must be an associative array of attribute => values");
+			RETVAL_FALSE;
+			goto cleanup;
 		}
-
-		value = zend_hash_get_current_data(Z_ARRVAL_P(entry));
-
-		ZVAL_DEREF(value);
-		if (Z_TYPE_P(value) != IS_ARRAY) {
-			num_values = 1;
-		} else {
-			SEPARATE_ARRAY(value);
-			num_values = zend_hash_num_elements(Z_ARRVAL_P(value));
+		if (ZSTR_LEN(attribute) == 0) {
+			zend_argument_value_error(3, "key must not be empty");
+			RETVAL_FALSE;
+			goto cleanup;
+		}
+		if (zend_str_has_nul_byte(attribute)) {
+			zend_argument_value_error(3, "key must not contain any null bytes");
+			RETVAL_FALSE;
+			goto cleanup;
 		}
 
-		num_berval[i] = num_values;
-		ldap_mods[i]->mod_bvalues = safe_emalloc((num_values + 1), sizeof(struct berval *), 0);
-
-/* allow for arrays with one element, no allowance for arrays with none but probably not required, gerrit thomson. */
-		if ((num_values == 1) && (Z_TYPE_P(value) != IS_ARRAY)) {
-			convert_to_string(value);
-			if (EG(exception)) {
+		ldap_mods[attribute_index] = emalloc(sizeof(LDAPMod));
+		ldap_mods[attribute_index]->mod_op = oper | LDAP_MOD_BVALUES;
+		/* No need to duplicate the string as it is not consumed and the zend_string will not be released */
+		ldap_mods[attribute_index]->mod_type = ZSTR_VAL(attribute);
+		ldap_mods[attribute_index]->mod_bvalues = NULL;
+
+		ZVAL_DEREF(attribute_values);
+		/* If the attribute takes a single value it can be passed directly instead of as a list with one element */
+		/* allow for arrays with one element, no allowance for arrays with none but probably not required, gerrit thomson. */
+		if (Z_TYPE_P(attribute_values) != IS_ARRAY) {
+			zend_string *value = php_ldap_try_get_ldap_value_from_zval(attribute_values);
+			if (UNEXPECTED(value == NULL)) {
 				RETVAL_FALSE;
 				goto cleanup;
 			}
-			ldap_mods[i]->mod_bvalues[0] = (struct berval *) emalloc (sizeof(struct berval));
-			ldap_mods[i]->mod_bvalues[0]->bv_val = Z_STRVAL_P(value);
-			ldap_mods[i]->mod_bvalues[0]->bv_len = Z_STRLEN_P(value);
+			ldap_mods[attribute_index]->mod_bvalues = safe_emalloc(2, sizeof(struct berval *), 0);
+			ldap_mods[attribute_index]->mod_bvalues[0] = (struct berval *) emalloc (sizeof(struct berval));
+			/* The string will be free by php_ldap_zend_string_release_from_char_pointer() during cleanup */
+			ldap_mods[attribute_index]->mod_bvalues[0]->bv_val = ZSTR_VAL(value);
+			ldap_mods[attribute_index]->mod_bvalues[0]->bv_len = ZSTR_LEN(value);
+			ldap_mods[attribute_index]->mod_bvalues[1] = NULL;
 		} else {
-			for (j = 0; j < num_values; j++) {
-				if ((ivalue = zend_hash_index_find(Z_ARRVAL_P(value), j)) == NULL) {
-					zend_argument_value_error(3, "must contain arrays with consecutive integer indices starting from 0");
-					num_berval[i] = j;
-					num_attribs = i + 1;
-					RETVAL_FALSE;
-					goto cleanup;
-				}
-				convert_to_string(ivalue);
-				if (EG(exception)) {
+			SEPARATE_ARRAY(attribute_values);
+			uint32_t num_values = zend_hash_num_elements(Z_ARRVAL_P(attribute_values));
+			if (num_values == 0) {
+				zend_argument_value_error(3, "list of attribute values must not be empty");
+				RETVAL_FALSE;
+				goto cleanup;
+			}
+			if (!zend_array_is_list(Z_ARRVAL_P(attribute_values))) {
+				zend_argument_value_error(3, "must be a list of attribute values");
+				RETVAL_FALSE;
+				goto cleanup;
+			}
+
+			ldap_mods[attribute_index]->mod_bvalues = safe_emalloc((num_values + 1), sizeof(struct berval *), 0);
+			/* Zero out the list */
+			memset(ldap_mods[attribute_index]->mod_bvalues, 0, sizeof(struct berval *) * (num_values+1));
+
+			zend_ulong attribute_value_index = 0;
+			zval *attribute_value = NULL;
+			ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(attribute_values), attribute_value_index, attribute_value) {
+				zend_string *value = php_ldap_try_get_ldap_value_from_zval(attribute_value);
+				if (UNEXPECTED(value == NULL)) {
 					RETVAL_FALSE;
 					goto cleanup;
 				}
-				ldap_mods[i]->mod_bvalues[j] = (struct berval *) emalloc (sizeof(struct berval));
-				ldap_mods[i]->mod_bvalues[j]->bv_val = Z_STRVAL_P(ivalue);
-				ldap_mods[i]->mod_bvalues[j]->bv_len = Z_STRLEN_P(ivalue);
-			}
+				ldap_mods[attribute_index]->mod_bvalues[attribute_value_index] = (struct berval *) emalloc (sizeof(struct berval));
+				/* The string will be free by php_ldap_zend_string_release_from_char_pointer() during cleanup */
+				ldap_mods[attribute_index]->mod_bvalues[attribute_value_index]->bv_val = ZSTR_VAL(value);
+				ldap_mods[attribute_index]->mod_bvalues[attribute_value_index]->bv_len = ZSTR_LEN(value);
+			} ZEND_HASH_FOREACH_END();
+			ldap_mods[attribute_index]->mod_bvalues[num_values] = NULL;
 		}
-		ldap_mods[i]->mod_bvalues[num_values] = NULL;
-		zend_hash_move_forward(Z_ARRVAL_P(entry));
-	}
+
+		attribute_index++;
+	} ZEND_HASH_FOREACH_END();
 	ldap_mods[num_attribs] = NULL;
 
-	if (serverctrls) {
-		lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 4);
+	if (server_controls_ht) {
+		lserverctrls = php_ldap_controls_from_array(ld->link, server_controls_ht, 4);
 		if (lserverctrls == NULL) {
 			RETVAL_FALSE;
 			goto cleanup;
 		}
 	}
 
-/* check flag to see if do_mod was called to perform full add , gerrit thomson */
+	/* check flag to see if do_mod was called to perform full add , gerrit thomson */
+	int ldap_status_code = LDAP_SUCCESS;
+	int msgid;
 	if (is_full_add == 1) {
 		if (ext) {
-			i = ldap_add_ext(ld->link, dn, ldap_mods, lserverctrls, NULL, &msgid);
+			ldap_status_code = ldap_add_ext(ld->link, dn, ldap_mods, lserverctrls, NULL, &msgid);
 		} else {
-			i = ldap_add_ext_s(ld->link, dn, ldap_mods, lserverctrls, NULL);
+			ldap_status_code = ldap_add_ext_s(ld->link, dn, ldap_mods, lserverctrls, NULL);
 		}
-		if (i != LDAP_SUCCESS) {
-			php_error_docref(NULL, E_WARNING, "Add: %s", ldap_err2string(i));
+		if (ldap_status_code != LDAP_SUCCESS) {
+			php_error_docref(NULL, E_WARNING, "Add: %s", ldap_err2string(ldap_status_code));
 			RETVAL_FALSE;
 		} else if (ext) {
-			i = ldap_result(ld->link, msgid, 1 /* LDAP_MSG_ALL */, NULL, &ldap_res);
-			if (i == -1) {
+			ldap_status_code = ldap_result(ld->link, msgid, 1 /* LDAP_MSG_ALL */, NULL, &ldap_res);
+			if (ldap_status_code == -1) {
 				php_error_docref(NULL, E_WARNING, "Add operation failed");
 				RETVAL_FALSE;
 				goto cleanup;
@@ -2314,16 +2367,16 @@ static void php_ldap_do_modify(INTERNAL_FUNCTION_PARAMETERS, int oper, int ext)
 		} else RETVAL_TRUE;
 	} else {
 		if (ext) {
-			i = ldap_modify_ext(ld->link, dn, ldap_mods, lserverctrls, NULL, &msgid);
+			ldap_status_code = ldap_modify_ext(ld->link, dn, ldap_mods, lserverctrls, NULL, &msgid);
 		} else {
-			i = ldap_modify_ext_s(ld->link, dn, ldap_mods, lserverctrls, NULL);
+			ldap_status_code = ldap_modify_ext_s(ld->link, dn, ldap_mods, lserverctrls, NULL);
 		}
-		if (i != LDAP_SUCCESS) {
-			php_error_docref(NULL, E_WARNING, "Modify: %s", ldap_err2string(i));
+		if (ldap_status_code != LDAP_SUCCESS) {
+			php_error_docref(NULL, E_WARNING, "Modify: %s", ldap_err2string(ldap_status_code));
 			RETVAL_FALSE;
 		} else if (ext) {
-			i = ldap_result(ld->link, msgid, 1 /* LDAP_MSG_ALL */, NULL, &ldap_res);
-			if (i == -1) {
+			ldap_status_code = ldap_result(ld->link, msgid, 1 /* LDAP_MSG_ALL */, NULL, &ldap_res);
+			if (ldap_status_code == -1) {
 				php_error_docref(NULL, E_WARNING, "Modify operation failed");
 				RETVAL_FALSE;
 				goto cleanup;
@@ -2337,15 +2390,18 @@ static void php_ldap_do_modify(INTERNAL_FUNCTION_PARAMETERS, int oper, int ext)
 	}
 
 cleanup:
-	for (i = 0; i < num_attribs; i++) {
-		efree(ldap_mods[i]->mod_type);
-		for (j = 0; j < num_berval[i]; j++) {
-			efree(ldap_mods[i]->mod_bvalues[j]);
+	for (LDAPMod **ptr = ldap_mods; *ptr != NULL; ptr++) {
+		LDAPMod *mod = *ptr;
+		if (mod->mod_bvalues != NULL) {
+			for (struct berval **bval_ptr = mod->mod_bvalues; *bval_ptr != NULL; bval_ptr++) {
+				struct berval *bval = *bval_ptr;
+				php_ldap_zend_string_release_from_char_pointer(bval->bv_val);
+				efree(bval);
+			}
+			efree(mod->mod_bvalues);
 		}
-		efree(ldap_mods[i]->mod_bvalues);
-		efree(ldap_mods[i]);
+		efree(mod);
 	}
-	efree(num_berval);
 	efree(ldap_mods);
 
 	if (lserverctrls) {
@@ -2418,8 +2474,8 @@ PHP_FUNCTION(ldap_mod_del_ext)
 /* {{{ php_ldap_do_delete */
 static void php_ldap_do_delete(INTERNAL_FUNCTION_PARAMETERS, int ext)
 {
-	zval *serverctrls = NULL;
 	zval *link;
+	HashTable *server_controls_ht = NULL;
 	ldap_linkdata *ld;
 	LDAPControl **lserverctrls = NULL;
 	ldap_resultdata *result;
@@ -2428,15 +2484,15 @@ static void php_ldap_do_delete(INTERNAL_FUNCTION_PARAMETERS, int ext)
 	int rc, msgid;
 	size_t dn_len;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|a!", &link, ldap_link_ce, &dn, &dn_len, &serverctrls) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "Op|h!", &link, ldap_link_ce, &dn, &dn_len, &server_controls_ht) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
 	ld = Z_LDAP_LINK_P(link);
 	VERIFY_LDAP_LINK_CONNECTED(ld);
 
-	if (serverctrls) {
-		lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 3);
+	if (server_controls_ht) {
+		lserverctrls = php_ldap_controls_from_array(ld->link, server_controls_ht, 3);
 		if (lserverctrls == NULL) {
 			RETVAL_FALSE;
 			goto cleanup;
@@ -2491,337 +2547,255 @@ PHP_FUNCTION(ldap_delete_ext)
 }
 /* }}} */
 
-/* {{{ _ldap_str_equal_to_const */
-static size_t _ldap_str_equal_to_const(const char *str, size_t str_len, const char *cstr)
-{
-	size_t i;
-
-	if (strlen(cstr) != str_len)
-		return 0;
-
-	for (i = 0; i < str_len; ++i) {
-		if (str[i] != cstr[i]) {
-			return 0;
-		}
-	}
-
-	return 1;
-}
-/* }}} */
-
-/* {{{ _ldap_strlen_max */
-static size_t _ldap_strlen_max(const char *str, size_t max_len)
-{
-	size_t i;
-
-	for (i = 0; i < max_len; ++i) {
-		if (str[i] == '\0') {
-			return i;
-		}
-	}
-
-	return max_len;
-}
-/* }}} */
-
-/* {{{ _ldap_hash_fetch */
-static void _ldap_hash_fetch(zval *hashTbl, const char *key, zval **out)
-{
-	*out = zend_hash_str_find(Z_ARRVAL_P(hashTbl), key, strlen(key));
-}
-/* }}} */
-
 /* {{{ Perform multiple modifications as part of one operation */
 PHP_FUNCTION(ldap_modify_batch)
 {
-	zval *serverctrls = NULL;
-	ldap_linkdata *ld;
-	zval *link, *mods, *mod, *modinfo;
-	zend_string *modval;
-	zval *attrib, *modtype, *vals;
-	zval *fetched;
+	zval *link;
 	char *dn;
 	size_t dn_len;
-	int i, j, k;
-	int num_mods, num_modprops, num_modvals;
-	LDAPMod **ldap_mods;
+	HashTable *modifications;
+	HashTable *server_controls_ht = NULL;
 	LDAPControl **lserverctrls = NULL;
-	uint32_t oper;
 
 	/*
-	$mods = array(
-		array(
+	$mods = [
+		[
 			"attrib" => "unicodePwd",
 			"modtype" => LDAP_MODIFY_BATCH_REMOVE,
-			"values" => array($oldpw)
-		),
-		array(
+			"values" => [$old_pwd]
+		],
+		[
 			"attrib" => "unicodePwd",
 			"modtype" => LDAP_MODIFY_BATCH_ADD,
-			"values" => array($newpw)
-		),
-		array(
+			"values" => [$new_pwd]
+		],
+		[
 			"attrib" => "userPrincipalName",
 			"modtype" => LDAP_MODIFY_BATCH_REPLACE,
-			"values" => array("janitor@corp.contoso.com")
-		),
-		array(
+			"values" => ["janitor@corp.contoso.com"]
+		],
+		[
 			"attrib" => "userCert",
 			"modtype" => LDAP_MODIFY_BATCH_REMOVE_ALL
-		)
-	);
+		],
+	];
 	*/
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osa/|a!", &link, ldap_link_ce, &dn, &dn_len, &mods, &serverctrls) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oph/|h!", &link, ldap_link_ce, &dn, &dn_len, &modifications, &server_controls_ht) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
-	ld = Z_LDAP_LINK_P(link);
+	ldap_linkdata *ld = Z_LDAP_LINK_P(link);
 	VERIFY_LDAP_LINK_CONNECTED(ld);
 
 	/* perform validation */
-	{
-		zend_string *modkey;
-		zend_long modtype;
+	/* make sure the top level is a normal array */
+	if (zend_hash_num_elements(modifications) == 0) {
+		zend_argument_must_not_be_empty_error(3);
+		RETURN_THROWS();
+	}
+	if (!zend_array_is_list(modifications)) {
+		zend_argument_value_error(3, "must be a list");
+		RETURN_THROWS();
+	}
 
-		/* to store the wrongly-typed keys */
-		zend_ulong tmpUlong;
+	zval *modification_zv = NULL;
+	ZEND_HASH_FOREACH_VAL(modifications, modification_zv) {
+		ZVAL_DEREF(modification_zv);
+		if (Z_TYPE_P(modification_zv) != IS_ARRAY) {
+			zend_argument_type_error(3, "must only contain arrays");
+			RETURN_THROWS();
+		}
 
-		/* make sure the DN contains no NUL bytes */
-		if (_ldap_strlen_max(dn, dn_len) != dn_len) {
-			zend_argument_type_error(2, "must not contain null bytes");
+		SEPARATE_ARRAY(modification_zv);
+		const HashTable *modification = Z_ARRVAL_P(modification_zv);
+		uint32_t modification_size = zend_hash_num_elements(modification);
+
+		if (modification_size != 2 && modification_size != 3) {
+			zend_argument_value_error(3, "a modification entry must only contain the keys "
+				"\"" LDAP_MODIFY_BATCH_ATTRIB "\", \"" LDAP_MODIFY_BATCH_MODTYPE "\", and \"" LDAP_MODIFY_BATCH_VALUES "\"");
 			RETURN_THROWS();
 		}
 
-		/* make sure the top level is a normal array */
-		zend_hash_internal_pointer_reset(Z_ARRVAL_P(mods));
-		if (zend_hash_get_current_key_type(Z_ARRVAL_P(mods)) != HASH_KEY_IS_LONG) {
-			zend_argument_type_error(3, "must be integer-indexed");
+		const zval *attrib = zend_hash_str_find(modification, LDAP_MODIFY_BATCH_ATTRIB, strlen(LDAP_MODIFY_BATCH_ATTRIB));
+		if (UNEXPECTED(attrib == NULL)) {
+			zend_argument_value_error(3, "a modification entry must contain the \"" LDAP_MODIFY_BATCH_ATTRIB "\" option");
 			RETURN_THROWS();
 		}
 
-		num_mods = zend_hash_num_elements(Z_ARRVAL_P(mods));
+		ZVAL_DEREF(attrib);
+		if (UNEXPECTED(Z_TYPE_P(attrib) != IS_STRING)) {
+			zend_argument_type_error(3, "the value for option \"" LDAP_MODIFY_BATCH_ATTRIB "\" must be of type string, %s given", zend_zval_value_name(attrib));
+			RETURN_THROWS();
+		}
+		if (zend_str_has_nul_byte(Z_STR_P(attrib))) {
+			zend_argument_value_error(3, "the value for option \"" LDAP_MODIFY_BATCH_ATTRIB "\" must not contain null bytes");
+			RETURN_THROWS();
+		}
 
-		for (i = 0; i < num_mods; i++) {
-			/* is the numbering consecutive? */
-			if ((fetched = zend_hash_index_find(Z_ARRVAL_P(mods), i)) == NULL) {
-				zend_argument_value_error(3, "must have consecutive integer indices starting from 0");
-				RETURN_THROWS();
-			}
-			mod = fetched;
+		const zval *modtype_zv = zend_hash_str_find(modification, LDAP_MODIFY_BATCH_MODTYPE, strlen(LDAP_MODIFY_BATCH_MODTYPE));
+		if (UNEXPECTED(modtype_zv == NULL)) {
+			zend_argument_value_error(3, "a modification entry must contain the \"" LDAP_MODIFY_BATCH_MODTYPE "\" option");
+			RETURN_THROWS();
+		}
+
+		ZVAL_DEREF(modtype_zv);
+		if (UNEXPECTED(Z_TYPE_P(modtype_zv) != IS_LONG)) {
+			zend_argument_type_error(3, "the value for option \"" LDAP_MODIFY_BATCH_MODTYPE "\" must be of type int, %s given", zend_zval_value_name(attrib));
+			RETURN_THROWS();
+		}
+		zend_long modtype = Z_LVAL_P(modtype_zv);
+		if (
+			modtype != LDAP_MODIFY_BATCH_ADD &&
+			modtype != LDAP_MODIFY_BATCH_REMOVE &&
+			modtype != LDAP_MODIFY_BATCH_REPLACE &&
+			modtype != LDAP_MODIFY_BATCH_REMOVE_ALL
+		) {
+			zend_argument_value_error(3, "the value for option \"" LDAP_MODIFY_BATCH_MODTYPE "\" must be"
+				" LDAP_MODIFY_BATCH_ADD, LDAP_MODIFY_BATCH_REMOVE, LDAP_MODIFY_BATCH_REPLACE,"
+				" or LDAP_MODIFY_BATCH_REMOVE_ALL");
+			RETURN_THROWS();
+		}
+		/* We assume that the modification array is well-formed and only ever contains an extra "values" key */
+		if (modtype == LDAP_MODIFY_BATCH_REMOVE_ALL && modification_size == 3) {
+			zend_argument_value_error(3, "a modification entry must not contain the "
+				"\"" LDAP_MODIFY_BATCH_VALUES "\" option when option \"" LDAP_MODIFY_BATCH_MODTYPE "\" "
+				"is LDAP_MODIFY_BATCH_REMOVE_ALL");
+			RETURN_THROWS();
+		}
 
-			/* is it an array? */
-			if (Z_TYPE_P(mod) != IS_ARRAY) {
-				zend_argument_value_error(3, "must only contain arrays");
+		zval *modification_values_zv = zend_hash_str_find(modification, LDAP_MODIFY_BATCH_VALUES, strlen(LDAP_MODIFY_BATCH_VALUES));
+		if (modification_values_zv == NULL) {
+			if (modtype != LDAP_MODIFY_BATCH_REMOVE_ALL) {
+				zend_argument_value_error(3, "a modification entry must contain the "
+					"\"" LDAP_MODIFY_BATCH_VALUES "\" option when the \"" LDAP_MODIFY_BATCH_MODTYPE "\" option "
+					"is not LDAP_MODIFY_BATCH_REMOVE_ALL");
 				RETURN_THROWS();
 			}
+			continue;
+		}
 
-			SEPARATE_ARRAY(mod);
-			/* for the modification hashtable... */
-			zend_hash_internal_pointer_reset(Z_ARRVAL_P(mod));
-			num_modprops = zend_hash_num_elements(Z_ARRVAL_P(mod));
-
-			for (j = 0; j < num_modprops; j++) {
-				/* are the keys strings? */
-				if (zend_hash_get_current_key(Z_ARRVAL_P(mod), &modkey, &tmpUlong) != HASH_KEY_IS_STRING) {
-					zend_argument_type_error(3, "must only contain string-indexed arrays");
-					RETURN_THROWS();
-				}
-
-				/* is this a valid entry? */
-				if (
-					!_ldap_str_equal_to_const(ZSTR_VAL(modkey), ZSTR_LEN(modkey), LDAP_MODIFY_BATCH_ATTRIB) &&
-					!_ldap_str_equal_to_const(ZSTR_VAL(modkey), ZSTR_LEN(modkey), LDAP_MODIFY_BATCH_MODTYPE) &&
-					!_ldap_str_equal_to_const(ZSTR_VAL(modkey), ZSTR_LEN(modkey), LDAP_MODIFY_BATCH_VALUES)
-				) {
-					zend_argument_value_error(3, "must contain arrays only containing the \"" LDAP_MODIFY_BATCH_ATTRIB "\", \"" LDAP_MODIFY_BATCH_MODTYPE "\" and \"" LDAP_MODIFY_BATCH_VALUES "\" keys");
-					RETURN_THROWS();
-				}
-
-				fetched = zend_hash_get_current_data(Z_ARRVAL_P(mod));
-				modinfo = fetched;
-
-				/* does the value type match the key? */
-				if (_ldap_str_equal_to_const(ZSTR_VAL(modkey), ZSTR_LEN(modkey), LDAP_MODIFY_BATCH_ATTRIB)) {
-					if (Z_TYPE_P(modinfo) != IS_STRING) {
-						zend_type_error("%s(): Option \"" LDAP_MODIFY_BATCH_ATTRIB "\" must be of type string, %s given", get_active_function_name(), zend_zval_value_name(modinfo));
-						RETURN_THROWS();
-					}
-
-					if (Z_STRLEN_P(modinfo) != _ldap_strlen_max(Z_STRVAL_P(modinfo), Z_STRLEN_P(modinfo))) {
-						zend_type_error("%s(): Option \"" LDAP_MODIFY_BATCH_ATTRIB "\" cannot contain null-bytes", get_active_function_name());
-						RETURN_THROWS();
-					}
-				}
-				else if (_ldap_str_equal_to_const(ZSTR_VAL(modkey), ZSTR_LEN(modkey), LDAP_MODIFY_BATCH_MODTYPE)) {
-					if (Z_TYPE_P(modinfo) != IS_LONG) {
-						zend_type_error("%s(): Option \"" LDAP_MODIFY_BATCH_MODTYPE "\" must be of type int, %s given", get_active_function_name(), zend_zval_value_name(modinfo));
-						RETURN_THROWS();
-					}
-
-					/* is the value in range? */
-					modtype = Z_LVAL_P(modinfo);
-					if (
-						modtype != LDAP_MODIFY_BATCH_ADD &&
-						modtype != LDAP_MODIFY_BATCH_REMOVE &&
-						modtype != LDAP_MODIFY_BATCH_REPLACE &&
-						modtype != LDAP_MODIFY_BATCH_REMOVE_ALL
-					) {
-						zend_value_error("%s(): Option \"" LDAP_MODIFY_BATCH_MODTYPE "\" must be one of the LDAP_MODIFY_BATCH_* constants", get_active_function_name());
-						RETURN_THROWS();
-					}
-
-					/* if it's REMOVE_ALL, there must not be a values array; otherwise, there must */
-					if (modtype == LDAP_MODIFY_BATCH_REMOVE_ALL) {
-						if (zend_hash_str_exists(Z_ARRVAL_P(mod), LDAP_MODIFY_BATCH_VALUES, strlen(LDAP_MODIFY_BATCH_VALUES))) {
-							zend_value_error("%s(): If option \"" LDAP_MODIFY_BATCH_MODTYPE "\" is LDAP_MODIFY_BATCH_REMOVE_ALL, option \"" LDAP_MODIFY_BATCH_VALUES "\" cannot be provided", get_active_function_name());
-							RETURN_THROWS();
-						}
-					}
-					else {
-						if (!zend_hash_str_exists(Z_ARRVAL_P(mod), LDAP_MODIFY_BATCH_VALUES, strlen(LDAP_MODIFY_BATCH_VALUES))) {
-							zend_value_error("%s(): If option \"" LDAP_MODIFY_BATCH_MODTYPE "\" is not LDAP_MODIFY_BATCH_REMOVE_ALL, option \"" LDAP_MODIFY_BATCH_VALUES "\" must be provided", get_active_function_name());
-							RETURN_THROWS();
-						}
-					}
-				}
-				else if (_ldap_str_equal_to_const(ZSTR_VAL(modkey), ZSTR_LEN(modkey), LDAP_MODIFY_BATCH_VALUES)) {
-					if (Z_TYPE_P(modinfo) != IS_ARRAY) {
-						zend_type_error("%s(): Option \"" LDAP_MODIFY_BATCH_VALUES "\" must be of type array, %s given", get_active_function_name(), zend_zval_value_name(modinfo));
-						RETURN_THROWS();
-					}
-
-					SEPARATE_ARRAY(modinfo);
-					/* is the array not empty? */
-					zend_hash_internal_pointer_reset(Z_ARRVAL_P(modinfo));
-					num_modvals = zend_hash_num_elements(Z_ARRVAL_P(modinfo));
-					if (num_modvals == 0) {
-						zend_value_error("%s(): Option \"" LDAP_MODIFY_BATCH_VALUES "\" must not be empty", get_active_function_name());
-						RETURN_THROWS();
-					}
-
-					/* are its keys integers? */
-					if (zend_hash_get_current_key_type(Z_ARRVAL_P(modinfo)) != HASH_KEY_IS_LONG) {
-						zend_value_error("%s(): Option \"" LDAP_MODIFY_BATCH_VALUES "\" must be integer-indexed", get_active_function_name());
-						RETURN_THROWS();
-					}
+		ZVAL_DEREF(modification_values_zv);
+		if (Z_TYPE_P(modification_values_zv) != IS_ARRAY) {
+			zend_argument_type_error(3, "the value for option \"" LDAP_MODIFY_BATCH_VALUES "\" must be of type array, %s given", zend_zval_value_name(attrib));
+			RETURN_THROWS();
+		}
 
-					/* are the keys consecutive? */
-					for (k = 0; k < num_modvals; k++) {
-						if ((fetched = zend_hash_index_find(Z_ARRVAL_P(modinfo), k)) == NULL) {
-							zend_value_error("%s(): Option \"" LDAP_MODIFY_BATCH_VALUES "\" must have consecutive integer indices starting from 0", get_active_function_name());
-							RETURN_THROWS();
-						}
-					}
-				}
+		SEPARATE_ARRAY(modification_values_zv);
+		const HashTable *modification_values = Z_ARRVAL_P(modification_values_zv);
+		/* is the array not empty? */
+		uint32_t num_modvals = zend_hash_num_elements(modification_values);
+		if (num_modvals == 0) {
+			zend_argument_value_error(3, "the value for option \"" LDAP_MODIFY_BATCH_VALUES "\" must not be empty");
+			RETURN_THROWS();
+		}
+		if (!zend_array_is_list(modification_values)) {
+			zend_argument_value_error(3, "the value for option \"" LDAP_MODIFY_BATCH_VALUES "\" must be a list");
+			RETURN_THROWS();
+		}
+	} ZEND_HASH_FOREACH_END();
+	/* validation of modifications array was successful */
 
-				zend_hash_move_forward(Z_ARRVAL_P(mod));
-			}
+	/* Check that the LDAP server controls array is valid */
+	if (server_controls_ht) {
+		lserverctrls = php_ldap_controls_from_array(ld->link, server_controls_ht, 4);
+		if (lserverctrls == NULL) {
+			_php_ldap_controls_free(&lserverctrls);
+			RETURN_FALSE;
 		}
 	}
-	/* validation was successful */
 
 	/* allocate array of modifications */
-	ldap_mods = safe_emalloc((num_mods+1), sizeof(LDAPMod *), 0);
+	uint32_t num_mods = zend_hash_num_elements(modifications);
+	LDAPMod **ldap_mods = safe_emalloc((num_mods+1), sizeof(LDAPMod *), 0);
 
 	/* for each modification */
-	for (i = 0; i < num_mods; i++) {
-		/* allocate the modification struct */
-		ldap_mods[i] = safe_emalloc(1, sizeof(LDAPMod), 0);
-
-		/* fetch the relevant data */
-		fetched = zend_hash_index_find(Z_ARRVAL_P(mods), i);
-		mod = fetched;
+	zend_ulong modification_index = 0;
+	ZEND_HASH_FOREACH_NUM_KEY_VAL(modifications, modification_index, modification_zv) {
+		ldap_mods[modification_index] = safe_emalloc(1, sizeof(LDAPMod), 0);
 
-		_ldap_hash_fetch(mod, LDAP_MODIFY_BATCH_ATTRIB, &attrib);
-		_ldap_hash_fetch(mod, LDAP_MODIFY_BATCH_MODTYPE, &modtype);
-		_ldap_hash_fetch(mod, LDAP_MODIFY_BATCH_VALUES, &vals);
+		zval *attrib_zv = zend_hash_str_find_deref(Z_ARRVAL_P(modification_zv), LDAP_MODIFY_BATCH_ATTRIB, strlen(LDAP_MODIFY_BATCH_ATTRIB));
+		ZEND_ASSERT(Z_TYPE_P(attrib_zv) == IS_STRING);
+		zval *modtype_zv = zend_hash_str_find_deref(Z_ARRVAL_P(modification_zv), LDAP_MODIFY_BATCH_MODTYPE, strlen(LDAP_MODIFY_BATCH_MODTYPE));
+		ZEND_ASSERT(Z_TYPE_P(modtype_zv) == IS_LONG);
+		zval *modification_values = zend_hash_str_find_deref(Z_ARRVAL_P(modification_zv), LDAP_MODIFY_BATCH_VALUES, strlen(LDAP_MODIFY_BATCH_VALUES));
+		ZEND_ASSERT(modification_values == NULL || Z_TYPE_P(modification_values) == IS_ARRAY);
 
 		/* map the modification type */
-		switch (Z_LVAL_P(modtype)) {
+		int ldap_operation;
+		switch (Z_LVAL_P(modtype_zv)) {
 			case LDAP_MODIFY_BATCH_ADD:
-				oper = LDAP_MOD_ADD;
+				ldap_operation = LDAP_MOD_ADD;
 				break;
 			case LDAP_MODIFY_BATCH_REMOVE:
 			case LDAP_MODIFY_BATCH_REMOVE_ALL:
-				oper = LDAP_MOD_DELETE;
+				ldap_operation = LDAP_MOD_DELETE;
 				break;
 			case LDAP_MODIFY_BATCH_REPLACE:
-				oper = LDAP_MOD_REPLACE;
+				ldap_operation = LDAP_MOD_REPLACE;
 				break;
-			default:
-				zend_throw_error(NULL, "Unknown and uncaught modification type.");
-				RETVAL_FALSE;
-				efree(ldap_mods[i]);
-				num_mods = i;
-				goto cleanup;
+			EMPTY_SWITCH_DEFAULT_CASE();
 		}
 
 		/* fill in the basic info */
-		ldap_mods[i]->mod_op = oper | LDAP_MOD_BVALUES;
-		ldap_mods[i]->mod_type = estrndup(Z_STRVAL_P(attrib), Z_STRLEN_P(attrib));
+		ldap_mods[modification_index]->mod_op = ldap_operation | LDAP_MOD_BVALUES;
+		ldap_mods[modification_index]->mod_type = estrndup(Z_STRVAL_P(attrib_zv), Z_STRLEN_P(attrib_zv));
 
-		if (Z_LVAL_P(modtype) == LDAP_MODIFY_BATCH_REMOVE_ALL) {
+		if (Z_LVAL_P(modtype_zv) == LDAP_MODIFY_BATCH_REMOVE_ALL) {
 			/* no values */
-			ldap_mods[i]->mod_bvalues = NULL;
-		}
-		else {
+			ldap_mods[modification_index]->mod_bvalues = NULL;
+		} else {
 			/* allocate space for the values as part of this modification */
-			num_modvals = zend_hash_num_elements(Z_ARRVAL_P(vals));
-			ldap_mods[i]->mod_bvalues = safe_emalloc((num_modvals+1), sizeof(struct berval *), 0);
+			uint32_t num_modification_values = zend_hash_num_elements(Z_ARRVAL_P(modification_values));
+			ldap_mods[modification_index]->mod_bvalues = safe_emalloc((num_modification_values+1), sizeof(struct berval *), 0);
 
 			/* for each value */
-			for (j = 0; j < num_modvals; j++) {
-				/* fetch it */
-				fetched = zend_hash_index_find(Z_ARRVAL_P(vals), j);
-				modval = zval_get_string(fetched);
+			zend_ulong value_index = 0;
+			zval *modification_value_zv = NULL;
+			ZEND_HASH_FOREACH_NUM_KEY_VAL(Z_ARRVAL_P(modification_values), value_index, modification_value_zv) {
+				zend_string *modval = zval_get_string(modification_value_zv);
 				if (EG(exception)) {
 					RETVAL_FALSE;
-					ldap_mods[i]->mod_bvalues[j] = NULL;
-					num_mods = i + 1;
+					ldap_mods[modification_index]->mod_bvalues[value_index] = NULL;
+					num_mods = modification_index + 1;
 					goto cleanup;
 				}
 
 				/* allocate the data struct */
-				ldap_mods[i]->mod_bvalues[j] = safe_emalloc(1, sizeof(struct berval), 0);
+				ldap_mods[modification_index]->mod_bvalues[value_index] = safe_emalloc(1, sizeof(struct berval), 0);
 
 				/* fill it */
-				ldap_mods[i]->mod_bvalues[j]->bv_len = ZSTR_LEN(modval);
-				ldap_mods[i]->mod_bvalues[j]->bv_val = estrndup(ZSTR_VAL(modval), ZSTR_LEN(modval));
+				ldap_mods[modification_index]->mod_bvalues[value_index]->bv_len = ZSTR_LEN(modval);
+				ldap_mods[modification_index]->mod_bvalues[value_index]->bv_val = estrndup(ZSTR_VAL(modval), ZSTR_LEN(modval));
 				zend_string_release(modval);
-			}
+			} ZEND_HASH_FOREACH_END();
 
 			/* NULL-terminate values */
-			ldap_mods[i]->mod_bvalues[num_modvals] = NULL;
+			ldap_mods[modification_index]->mod_bvalues[num_modification_values] = NULL;
 		}
-	}
+	} ZEND_HASH_FOREACH_END();
 
 	/* NULL-terminate modifications */
 	ldap_mods[num_mods] = NULL;
 
-	if (serverctrls) {
-		lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 4);
-		if (lserverctrls == NULL) {
-			RETVAL_FALSE;
-			goto cleanup;
-		}
-	}
-
 	/* perform (finally) */
-	if ((i = ldap_modify_ext_s(ld->link, dn, ldap_mods, lserverctrls, NULL)) != LDAP_SUCCESS) {
-		php_error_docref(NULL, E_WARNING, "Batch Modify: %s", ldap_err2string(i));
+	int ldap_status = ldap_modify_ext_s(ld->link, dn, ldap_mods, lserverctrls, NULL);
+	if (ldap_status != LDAP_SUCCESS) {
+		php_error_docref(NULL, E_WARNING, "Batch Modify: %s", ldap_err2string(ldap_status));
 		RETVAL_FALSE;
-	} else RETVAL_TRUE;
+	} else {
+		RETVAL_TRUE;
+	}
 
 	/* clean up */
 	cleanup: {
-		for (i = 0; i < num_mods; i++) {
+		for (uint32_t i = 0; i < num_mods; i++) {
 			/* attribute */
 			efree(ldap_mods[i]->mod_type);
 
 			if (ldap_mods[i]->mod_bvalues != NULL) {
 				/* each BER value */
-				for (j = 0; ldap_mods[i]->mod_bvalues[j] != NULL; j++) {
+				for (int j = 0; ldap_mods[i]->mod_bvalues[j] != NULL; j++) {
 					/* free the data bytes */
 					efree(ldap_mods[i]->mod_bvalues[j]->bv_val);
 
@@ -2900,33 +2874,36 @@ PHP_FUNCTION(ldap_error)
 /* {{{ Determine if an entry has a specific value for one of its attributes */
 PHP_FUNCTION(ldap_compare)
 {
-	zval *serverctrls = NULL;
 	zval *link;
-	char *dn, *attr, *value;
-	size_t dn_len, attr_len, value_len;
+	char *dn, *attr;
+	size_t dn_len, attr_len;
+	HashTable *server_controls_ht = NULL;
 	ldap_linkdata *ld;
 	LDAPControl **lserverctrls = NULL;
 	int ldap_errno;
 	struct berval lvalue;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osss|a!", &link, ldap_link_ce, &dn, &dn_len, &attr, &attr_len, &value, &value_len, &serverctrls) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opps|h!",
+		&link, ldap_link_ce,
+		&dn, &dn_len,
+		&attr, &attr_len,
+		&lvalue.bv_val, &lvalue.bv_len,
+		&server_controls_ht
+	) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
 	ld = Z_LDAP_LINK_P(link);
 	VERIFY_LDAP_LINK_CONNECTED(ld);
 
-	if (serverctrls) {
-		lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 5);
+	if (server_controls_ht) {
+		lserverctrls = php_ldap_controls_from_array(ld->link, server_controls_ht, 5);
 		if (lserverctrls == NULL) {
 			RETVAL_FALSE;
 			goto cleanup;
 		}
 	}
 
-	lvalue.bv_val = value;
-	lvalue.bv_len = value_len;
-
 	ldap_errno = ldap_compare_ext_s(ld->link, dn, attr, &lvalue, lserverctrls, NULL);
 
 	switch (ldap_errno) {
@@ -3116,7 +3093,8 @@ PHP_FUNCTION(ldap_get_option)
 	case LDAP_OPT_API_FEATURE_INFO:
 */
 	default:
-		RETURN_FALSE;
+		zend_argument_value_error(2, "must be a valid LDAP option");
+		RETURN_THROWS();
 	}
 	RETURN_TRUE;
 }
@@ -3170,14 +3148,18 @@ PHP_FUNCTION(ldap_set_option)
 	case LDAP_OPT_X_KEEPALIVE_INTERVAL:
 #endif
 		{
-			int val;
+			bool failed = false;
+			zend_long lval = zval_try_get_long(newval, &failed);
+			if (failed) {
+				zend_argument_type_error(3, "must be of type int for the given option, %s given", zend_zval_value_name(newval));
+				RETURN_THROWS();
+			}
 
-			convert_to_long(newval);
-			if (ZEND_LONG_EXCEEDS_INT(Z_LVAL_P(newval))) {
+			if (ZEND_LONG_EXCEEDS_INT(lval)) {
 				zend_argument_value_error(3, "is too large");
 				RETURN_THROWS();
 			}
-			val = (int)Z_LVAL_P(newval);
+			int val = (int)lval;
 			if (ldap_set_option(ldap, option, &val)) {
 				RETURN_FALSE;
 			}
@@ -3186,9 +3168,13 @@ PHP_FUNCTION(ldap_set_option)
 	case LDAP_OPT_NETWORK_TIMEOUT:
 		{
 			struct timeval timeout;
-
-			convert_to_long(newval);
-			timeout.tv_sec = Z_LVAL_P(newval);
+			bool failed = false;
+			zend_long lval = zval_try_get_long(newval, &failed);
+			if (failed) {
+				zend_argument_type_error(3, "must be of type int for the LDAP_OPT_NETWORK_TIMEOUT option, %s given", zend_zval_value_name(newval));
+				RETURN_THROWS();
+			}
+			timeout.tv_sec = lval;
 			timeout.tv_usec = 0;
 			if (ldap_set_option(ldap, LDAP_OPT_NETWORK_TIMEOUT, (void *) &timeout)) {
 				RETURN_FALSE;
@@ -3198,9 +3184,13 @@ PHP_FUNCTION(ldap_set_option)
 	case LDAP_X_OPT_CONNECT_TIMEOUT:
 		{
 			int timeout;
-
-			convert_to_long(newval);
-			timeout = 1000 * Z_LVAL_P(newval); /* Convert to milliseconds */
+			bool failed = false;
+			zend_long lval = zval_try_get_long(newval, &failed);
+			if (failed) {
+				zend_argument_type_error(3, "must be of type int for the LDAP_X_OPT_CONNECT_TIMEOUT option, %s given", zend_zval_value_name(newval));
+				RETURN_THROWS();
+			}
+			timeout = 1000 * lval; /* Convert to milliseconds */
 			if (ldap_set_option(ldap, LDAP_X_OPT_CONNECT_TIMEOUT, &timeout)) {
 				RETURN_FALSE;
 			}
@@ -3211,8 +3201,13 @@ PHP_FUNCTION(ldap_set_option)
 		{
 			struct timeval timeout;
 
-			convert_to_long(newval);
-			timeout.tv_sec = Z_LVAL_P(newval);
+			bool failed = false;
+			zend_long lval = zval_try_get_long(newval, &failed);
+			if (failed) {
+				zend_argument_type_error(3, "must be of type int for the LDAP_OPT_TIMEOUT option, %s given", zend_zval_value_name(newval));
+				RETURN_THROWS();
+			}
+			timeout.tv_sec = lval;
 			timeout.tv_usec = 0;
 			if (ldap_set_option(ldap, LDAP_OPT_TIMEOUT, (void *) &timeout)) {
 				RETURN_FALSE;
@@ -3248,9 +3243,8 @@ PHP_FUNCTION(ldap_set_option)
 	case LDAP_OPT_MATCHED_DN:
 #endif
 		{
-			zend_string *val;
-			val = zval_get_string(newval);
-			if (EG(exception)) {
+			zend_string *val = zval_try_get_string(newval);
+			if (val == NULL) {
 				RETURN_THROWS();
 			}
 			if (ldap_set_option(ldap, option, ZSTR_VAL(val))) {
@@ -3268,8 +3262,7 @@ PHP_FUNCTION(ldap_set_option)
 	case LDAP_OPT_X_SASL_NOCANON:
 #endif
 		{
-			void *val;
-			val = zend_is_true(newval) ? LDAP_OPT_ON : LDAP_OPT_OFF;
+			void *val = zend_is_true(newval) ? LDAP_OPT_ON : LDAP_OPT_OFF;
 			if (ldap_set_option(ldap, option, val)) {
 				RETURN_FALSE;
 			}
@@ -3286,7 +3279,7 @@ PHP_FUNCTION(ldap_set_option)
 				RETURN_THROWS();
 			}
 
-			ctrls = _php_ldap_controls_from_array(ldap, newval, 3);
+			ctrls = php_ldap_controls_from_array(ldap, Z_ARRVAL_P(newval), 3);
 
 			if (ctrls == NULL) {
 				RETURN_FALSE;
@@ -3299,7 +3292,8 @@ PHP_FUNCTION(ldap_set_option)
 			}
 		} break;
 	default:
-		RETURN_FALSE;
+		zend_argument_value_error(2, "must be a valid LDAP option");
+		RETURN_THROWS();
 	}
 	RETURN_TRUE;
 }
@@ -3309,15 +3303,15 @@ PHP_FUNCTION(ldap_set_option)
 /* {{{ Extract information from result */
 PHP_FUNCTION(ldap_parse_result)
 {
-	zval *link, *result, *errcode, *matcheddn, *errmsg, *referrals, *serverctrls;
+	zval *link, *result, *errcode, *matcheddn = NULL, *errmsg = NULL, *referrals = NULL, *serverctrls = NULL;
 	ldap_linkdata *ld;
 	ldap_resultdata *ldap_result;
 	LDAPControl **lserverctrls = NULL;
 	char **lreferrals, **refp;
 	char *lmatcheddn, *lerrmsg;
-	int rc, lerrcode, myargcount = ZEND_NUM_ARGS();
+	int rc, lerrcode;
 
-	if (zend_parse_parameters(myargcount, "OOz|zzzz", &link, ldap_link_ce, &result, ldap_result_ce, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "OOz|zzzz", &link, ldap_link_ce, &result, ldap_result_ce, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
@@ -3328,10 +3322,10 @@ PHP_FUNCTION(ldap_parse_result)
 	VERIFY_LDAP_RESULT_OPEN(ldap_result);
 
 	rc = ldap_parse_result(ld->link, ldap_result->result, &lerrcode,
-				myargcount > 3 ? &lmatcheddn : NULL,
-				myargcount > 4 ? &lerrmsg : NULL,
-				myargcount > 5 ? &lreferrals : NULL,
-				myargcount > 6 ? &lserverctrls : NULL,
+				matcheddn ? &lmatcheddn : NULL,
+				errmsg ? &lerrmsg : NULL,
+				referrals ? &lreferrals : NULL,
+				serverctrls ? &lserverctrls : NULL,
 				0);
 	if (rc != LDAP_SUCCESS) {
 		php_error_docref(NULL, E_WARNING, "Unable to parse result: %s", ldap_err2string(rc));
@@ -3340,41 +3334,40 @@ PHP_FUNCTION(ldap_parse_result)
 
 	ZEND_TRY_ASSIGN_REF_LONG(errcode, lerrcode);
 
-	/* Reverse -> fall through */
-	switch (myargcount) {
-		case 7:
-			_php_ldap_controls_to_array(ld->link, lserverctrls, serverctrls, 0);
-			ZEND_FALLTHROUGH;
-		case 6:
-			referrals = zend_try_array_init(referrals);
-			if (!referrals) {
-				RETURN_THROWS();
-			}
-			if (lreferrals != NULL) {
-				refp = lreferrals;
-				while (*refp) {
-					add_next_index_string(referrals, *refp);
-					refp++;
-				}
-				ldap_memvfree((void**)lreferrals);
-			}
-			ZEND_FALLTHROUGH;
-		case 5:
-			if (lerrmsg == NULL) {
-				ZEND_TRY_ASSIGN_REF_EMPTY_STRING(errmsg);
-			} else {
-				ZEND_TRY_ASSIGN_REF_STRING(errmsg, lerrmsg);
-				ldap_memfree(lerrmsg);
-			}
-			ZEND_FALLTHROUGH;
-		case 4:
-			if (lmatcheddn == NULL) {
-				ZEND_TRY_ASSIGN_REF_EMPTY_STRING(matcheddn);
-			} else {
-				ZEND_TRY_ASSIGN_REF_STRING(matcheddn, lmatcheddn);
-				ldap_memfree(lmatcheddn);
+	if (serverctrls) {
+		_php_ldap_controls_to_array(ld->link, lserverctrls, serverctrls, 0);
+	}
+	if (referrals) {
+		referrals = zend_try_array_init(referrals);
+		if (!referrals) {
+			RETURN_THROWS();
+		}
+		if (lreferrals != NULL) {
+			refp = lreferrals;
+			while (*refp) {
+				add_next_index_string(referrals, *refp);
+				refp++;
 			}
+			ldap_memvfree((void**)lreferrals);
+		}
+	}
+	if (errmsg) {
+		if (lerrmsg == NULL) {
+			ZEND_TRY_ASSIGN_REF_EMPTY_STRING(errmsg);
+		} else {
+			ZEND_TRY_ASSIGN_REF_STRING(errmsg, lerrmsg);
+			ldap_memfree(lerrmsg);
+		}
 	}
+	if (matcheddn) {
+		if (lmatcheddn == NULL) {
+			ZEND_TRY_ASSIGN_REF_EMPTY_STRING(matcheddn);
+		} else {
+			ZEND_TRY_ASSIGN_REF_STRING(matcheddn, lmatcheddn);
+			ldap_memfree(lmatcheddn);
+		}
+	}
+
 	RETURN_TRUE;
 }
 /* }}} */
@@ -3385,14 +3378,14 @@ PHP_FUNCTION(ldap_parse_result)
 /* {{{ Extract information from extended operation result */
 PHP_FUNCTION(ldap_parse_exop)
 {
-	zval *link, *result, *retdata, *retoid;
+	zval *link, *result, *retdata = NULL, *retoid = NULL;
 	ldap_linkdata *ld;
 	ldap_resultdata *ldap_result;
 	char *lretoid;
 	struct berval *lretdata;
-	int rc, myargcount = ZEND_NUM_ARGS();
+	int rc;
 
-	if (zend_parse_parameters(myargcount, "OO|zz", &link, ldap_link_ce, &result, ldap_result_ce, &retdata, &retoid) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "OO|zz", &link, ldap_link_ce, &result, ldap_result_ce, &retdata, &retoid) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
@@ -3403,34 +3396,34 @@ PHP_FUNCTION(ldap_parse_exop)
 	VERIFY_LDAP_RESULT_OPEN(ldap_result);
 
 	rc = ldap_parse_extended_result(ld->link, ldap_result->result,
-				myargcount > 3 ? &lretoid: NULL,
-				myargcount > 2 ? &lretdata: NULL,
+				retoid ? &lretoid: NULL,
+				retdata ? &lretdata: NULL,
 				0);
 	if (rc != LDAP_SUCCESS) {
 		php_error_docref(NULL, E_WARNING, "Unable to parse extended operation result: %s", ldap_err2string(rc));
 		RETURN_FALSE;
 	}
 
-	/* Reverse -> fall through */
-	switch (myargcount) {
-		case 4:
-			if (lretoid == NULL) {
-				ZEND_TRY_ASSIGN_REF_EMPTY_STRING(retoid);
-			} else {
-				ZEND_TRY_ASSIGN_REF_STRING(retoid, lretoid);
-				ldap_memfree(lretoid);
-			}
-			ZEND_FALLTHROUGH;
-		case 3:
-			/* use arg #3 as the data returned by the server */
-			if (lretdata == NULL) {
-				ZEND_TRY_ASSIGN_REF_EMPTY_STRING(retdata);
-			} else {
-				ZEND_TRY_ASSIGN_REF_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len);
-				ldap_memfree(lretdata->bv_val);
-				ldap_memfree(lretdata);
-			}
+	if (retoid) {
+		if (lretoid == NULL) {
+			ZEND_TRY_ASSIGN_REF_EMPTY_STRING(retoid);
+		} else {
+			ZEND_TRY_ASSIGN_REF_STRING(retoid, lretoid);
+			ldap_memfree(lretoid);
+		}
+	}
+
+	if (retdata) {
+		/* use arg #3 as the data returned by the server */
+		if (lretdata == NULL) {
+			ZEND_TRY_ASSIGN_REF_EMPTY_STRING(retdata);
+		} else {
+			ZEND_TRY_ASSIGN_REF_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len);
+			ldap_memfree(lretdata->bv_val);
+			ldap_memfree(lretdata);
+		}
 	}
+
 	RETURN_TRUE;
 }
 /* }}} */
@@ -3561,7 +3554,6 @@ PHP_FUNCTION(ldap_parse_reference)
 /* {{{ php_ldap_do_rename */
 static void php_ldap_do_rename(INTERNAL_FUNCTION_PARAMETERS, int ext)
 {
-	zval *serverctrls = NULL;
 	zval *link;
 	ldap_linkdata *ld;
 	LDAPControl **lserverctrls = NULL;
@@ -3571,8 +3563,9 @@ static void php_ldap_do_rename(INTERNAL_FUNCTION_PARAMETERS, int ext)
 	char *dn, *newrdn, *newparent;
 	size_t dn_len, newrdn_len, newparent_len;
 	bool deleteoldrdn;
+	HashTable *server_controls_ht = NULL;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osssb|a!", &link, ldap_link_ce, &dn, &dn_len, &newrdn, &newrdn_len, &newparent, &newparent_len, &deleteoldrdn, &serverctrls) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "Opppb|h!", &link, ldap_link_ce, &dn, &dn_len, &newrdn, &newrdn_len, &newparent, &newparent_len, &deleteoldrdn, &server_controls_ht) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
@@ -3584,8 +3577,8 @@ static void php_ldap_do_rename(INTERNAL_FUNCTION_PARAMETERS, int ext)
 	}
 
 #if (LDAP_API_VERSION > 2000) || defined(HAVE_ORALDAP)
-	if (serverctrls) {
-		lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 6);
+	if (server_controls_ht) {
+		lserverctrls = php_ldap_controls_from_array(ld->link, server_controls_ht, 6);
 		if (lserverctrls == NULL) {
 			RETVAL_FALSE;
 			goto cleanup;
@@ -3892,10 +3885,10 @@ PHP_FUNCTION(ldap_8859_to_t61)
 /* {{{ Extended operations, Pierangelo Masarati */
 #ifdef HAVE_LDAP_EXTENDED_OPERATION_S
 static void php_ldap_exop(INTERNAL_FUNCTION_PARAMETERS, bool force_sync) {
-	zval *serverctrls = NULL;
 	zval *link, *retdata = NULL, *retoid = NULL;
 	char *lretoid = NULL;
 	zend_string *reqoid, *reqdata = NULL;
+	HashTable *server_controls_ht = NULL;
 	struct berval lreqdata, *lretdata = NULL;
 	ldap_linkdata *ld;
 	ldap_resultdata *result;
@@ -3910,7 +3903,7 @@ static void php_ldap_exop(INTERNAL_FUNCTION_PARAMETERS, bool force_sync) {
 		}
 	}
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "OS|S!a!zz", &link, ldap_link_ce, &reqoid, &reqdata, &serverctrls, &retdata, &retoid) != SUCCESS) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "OP|S!h!zz", &link, ldap_link_ce, &reqoid, &reqdata, &server_controls_ht, &retdata, &retoid) != SUCCESS) {
 		RETURN_THROWS();
 	}
 
@@ -3924,8 +3917,8 @@ static void php_ldap_exop(INTERNAL_FUNCTION_PARAMETERS, bool force_sync) {
 		lreqdata.bv_len = 0;
 	}
 
-	if (serverctrls) {
-		lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 4);
+	if (server_controls_ht) {
+		lserverctrls = php_ldap_controls_from_array(ld->link, server_controls_ht, 4);
 		if (lserverctrls == NULL) {
 			RETVAL_FALSE;
 			goto cleanup;
@@ -4014,7 +4007,7 @@ PHP_FUNCTION(ldap_exop_sync)
 /* {{{ Passwd modify extended operation */
 PHP_FUNCTION(ldap_exop_passwd)
 {
-	zval *link, *serverctrls;
+	zval *link, *serverctrls = NULL;
 	struct berval luser = { 0L, NULL };
 	struct berval loldpw = { 0L, NULL };
 	struct berval lnewpw = { 0L, NULL };
@@ -4022,22 +4015,22 @@ PHP_FUNCTION(ldap_exop_passwd)
 	LDAPControl *ctrl, **lserverctrls = NULL, *requestctrls[2] = { NULL, NULL };
 	LDAPMessage* ldap_res = NULL;
 	ldap_linkdata *ld;
-	int rc, myargcount = ZEND_NUM_ARGS(), msgid, err;
+	int rc, msgid, err;
 	char* errmsg = NULL;
 
-	if (zend_parse_parameters(myargcount, "O|sssz/", &link, ldap_link_ce, &luser.bv_val, &luser.bv_len, &loldpw.bv_val, &loldpw.bv_len, &lnewpw.bv_val, &lnewpw.bv_len, &serverctrls) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O|sssz/", &link, ldap_link_ce, &luser.bv_val, &luser.bv_len, &loldpw.bv_val, &loldpw.bv_len, &lnewpw.bv_val, &lnewpw.bv_len, &serverctrls) == FAILURE) {
 		RETURN_THROWS();
 	}
 
 	ld = Z_LDAP_LINK_P(link);
 	VERIFY_LDAP_LINK_CONNECTED(ld);
 
-	switch (myargcount) {
-		case 5:
-			/* ldap_create_passwordpolicy_control() allocates ctrl */
-			if (ldap_create_passwordpolicy_control(ld->link, &ctrl) == LDAP_SUCCESS) {
-				requestctrls[0] = ctrl;
-			}
+	if (serverctrls) {
+		/* ldap_create_passwordpolicy_control() allocates ctrl */
+		if (ldap_create_passwordpolicy_control(ld->link, &ctrl) == LDAP_SUCCESS) {
+			requestctrls[0] = ctrl;
+		}
+		// TODO Should this warn?
 	}
 
 	/* asynchronous call to get result and controls */
@@ -4072,14 +4065,14 @@ PHP_FUNCTION(ldap_exop_passwd)
 		goto cleanup;
 	}
 
-	rc = ldap_parse_result(ld->link, ldap_res, &err, NULL, &errmsg, NULL, (myargcount > 4 ? &lserverctrls : NULL), 0);
+	rc = ldap_parse_result(ld->link, ldap_res, &err, NULL, &errmsg, NULL, (serverctrls ? &lserverctrls : NULL), 0);
 	if( rc != LDAP_SUCCESS ) {
 		php_error_docref(NULL, E_WARNING, "Passwd modify extended operation failed: %s (%d)", ldap_err2string(rc), rc);
 		RETVAL_FALSE;
 		goto cleanup;
 	}
 
-	if (myargcount > 4) {
+	if (serverctrls) {
 		_php_ldap_controls_to_array(ld->link, lserverctrls, serverctrls, 0);
 	}
 
diff --git a/ext/ldap/tests/gh16032-1.phpt b/ext/ldap/tests/gh16032-1.phpt
new file mode 100644
index 0000000000000..8e01561a3b1dc
--- /dev/null
+++ b/ext/ldap/tests/gh16032-1.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug GH-16032: Various NULL pointer dereferencements in ldap_modify_batch()
+--EXTENSIONS--
+ldap
+--FILE--
+ LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_missing_attrib_key));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must contain the "attrib" option
diff --git a/ext/ldap/tests/gh16032-2.phpt b/ext/ldap/tests/gh16032-2.phpt
new file mode 100644
index 0000000000000..d4b4cddb15a80
--- /dev/null
+++ b/ext/ldap/tests/gh16032-2.phpt
@@ -0,0 +1,26 @@
+--TEST--
+Bug GH-16032: Various NULL pointer dereferencements in ldap_modify_batch()
+--EXTENSIONS--
+ldap
+--FILE--
+ "attrib1",
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_missing_modtype_key));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must contain the "modtype" option
diff --git a/ext/ldap/tests/gh16101.phpt b/ext/ldap/tests/gh16101.phpt
new file mode 100644
index 0000000000000..1e9d57334378b
--- /dev/null
+++ b/ext/ldap/tests/gh16101.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Bug GH-16101: Segfault in ldap_list(), ldap_read(), and ldap_search() when LDAPs array is not a list
+--EXTENSIONS--
+ldap
+--FILE--
+ $ldap,
+    "world"  => $ldap,
+];
+try {
+    var_dump(ldap_list($ldaps_dict, $valid_dn, $valid_filter));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: ldap_list(): Argument #1 ($ldap) must be a list
diff --git a/ext/ldap/tests/gh16132-1.phpt b/ext/ldap/tests/gh16132-1.phpt
new file mode 100644
index 0000000000000..1979796446daa
--- /dev/null
+++ b/ext/ldap/tests/gh16132-1.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Bug GH-16132: Attempting to free pointer not allocated by ZMM
+--EXTENSIONS--
+ldap
+--FILE--
+ new stdClass(),
+    'attribute2' => [
+        'value1',
+        'value2',
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_value_not_string));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+Error: Object of class stdClass could not be converted to string
diff --git a/ext/ldap/tests/gh16132-2.phpt b/ext/ldap/tests/gh16132-2.phpt
new file mode 100644
index 0000000000000..eaf3bd67dfcb3
--- /dev/null
+++ b/ext/ldap/tests/gh16132-2.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Bug GH-16132: Attempting to free pointer not allocated by ZMM
+--EXTENSIONS--
+ldap
+--FILE--
+ 'value',
+    'attribute2' => [
+        'value1',
+        new stdClass(),
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_multi_value_not_list_of_strings2));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+Error: Object of class stdClass could not be converted to string
diff --git a/ext/ldap/tests/gh16136.phpt b/ext/ldap/tests/gh16136.phpt
new file mode 100644
index 0000000000000..9283402158c14
--- /dev/null
+++ b/ext/ldap/tests/gh16136.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Bug GH-16136: Memory leak in php_ldap_do_modify() when entry is not a proper dictionary
+--EXTENSIONS--
+ldap
+--FILE--
+ 'value',
+    'not_key_entry',
+    'attribute3' => [
+        'value1',
+        'value2',
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $not_dict_of_attributes));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: ldap_add(): Argument #3 ($entry) must be an associative array of attribute => values
diff --git a/ext/ldap/tests/gh16389.phpt b/ext/ldap/tests/gh16389.phpt
new file mode 100644
index 0000000000000..228dfd74c1469
--- /dev/null
+++ b/ext/ldap/tests/gh16389.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GH-16389 (Assertion failure in ext/ldap/ldap.c:2718)
+--EXTENSIONS--
+ldap
+--FILE--
+ &$attrib,
+        "modtype" => &$modtype,
+        "values"  => &$values,
+    ],
+];
+var_dump(ldap_modify_batch($ldap, "", $modification_attrib_reference_string));
+?>
+--EXPECTF--
+Warning: ldap_modify_batch(): Batch Modify: Can't contact LDAP server in %s on line %d
+bool(false)
diff --git a/ext/ldap/tests/ldap_add_error.phpt b/ext/ldap/tests/ldap_add_error.phpt
index d78276eca3e54..5ad0a7abc6e7a 100644
--- a/ext/ldap/tests/ldap_add_error.phpt
+++ b/ext/ldap/tests/ldap_add_error.phpt
@@ -13,73 +13,55 @@ require "connect.inc";
 
 $link = ldap_connect_and_bind($uri, $user, $passwd, $protocol_version);
 
-var_dump(ldap_add($link, "$base", array()));
-
 // Invalid DN
 var_dump(
-    ldap_add($link, "weirdAttribute=val", array(
-        "weirdAttribute"			=> "val",
-    )),
+    ldap_add(
+        $link,
+        "weirdAttribute=val",
+        ["weirdAttribute" => "val"],
+    ),
     ldap_error($link),
     ldap_errno($link)
 );
 
 // Duplicate entry
-for ($i = 0; $i < 2; $i++)
+for ($i = 0; $i < 2; $i++) {
     var_dump(
-    ldap_add($link, "dc=my-domain,$base", array(
-      "objectClass"	=> array(
-        "top",
-        "dcObject",
-        "organization"),
-      "dc"			=> "my-domain",
-      "o"				=> "my-domain",
-    ))
+        ldap_add(
+            $link,
+            "dc=my-domain,$base",
+            [
+                "objectClass" => [
+                    "top",
+                    "dcObject",
+                    "organization",
+                ],
+                "dc" => "my-domain",
+                "o"	 => "my-domain",
+            ],
+        )
     );
-var_dump(ldap_error($link), ldap_errno($link));
-
-// Wrong array indexes
-try {
-    ldap_add($link, "dc=my-domain2,dc=com", array(
-        "objectClass"	=> array(
-            0	=> "top",
-            2	=> "dcObject",
-            5	=> "organization"),
-        "dc"			=> "my-domain",
-        "o"				=> "my-domain",
-    ));
-    /* Is this correct behaviour to still have "Already exists" as error/errno?
-    ,
-    ldap_error($link),
-    ldap_errno($link)
-    */
-} catch (ValueError $exception) {
-    echo $exception->getMessage() . "\n";
 }
+var_dump(ldap_error($link), ldap_errno($link));
 
 // Invalid attribute
 var_dump(
-    ldap_add($link, "$base", array(
-        "objectClass"	=> array(
-            "top",
-            "dcObject",
-            "organization"),
-        "dc"			=> "my-domain",
-        "o"				=> "my-domain",
-        "weirdAttr"		=> "weirdVal",
-    )),
-    ldap_error($link),
-    ldap_errno($link)
-);
-
-var_dump(
-    ldap_add($link, "$base", array(array( "Oops"
-    )))
-    /* Is this correct behaviour to still have "Undefined attribute type" as error/errno?
-    ,
+    ldap_add(
+        $link,
+        "dc=my-domain,$base",
+        [
+            "objectClass" => [
+                "top",
+                "dcObject",
+                "organization",
+            ],
+            "dc" => "my-domain",
+            "o"	 => "my-domain",
+            "weirdAttr"	=> "weirdVal",
+        ],
+    ),
     ldap_error($link),
-    ldap_errno($link)
-    */
+    ldap_errno($link),
 );
 ?>
 --CLEAN--
@@ -91,9 +73,6 @@ $link = ldap_connect_and_bind($uri, $user, $passwd, $protocol_version);
 ldap_delete($link, "dc=my-domain,$base");
 ?>
 --EXPECTF--
-Warning: ldap_add(): Add: Protocol error in %s on line %d
-bool(false)
-
 Warning: ldap_add(): Add: Invalid DN syntax in %s on line %d
 bool(false)
 string(17) "Invalid DN syntax"
@@ -104,12 +83,8 @@ Warning: ldap_add(): Add: Already exists in %s on line %d
 bool(false)
 string(14) "Already exists"
 int(68)
-ldap_add(): Argument #3 ($entry) must contain arrays with consecutive integer indices starting from 0
 
 Warning: ldap_add(): Add: Undefined attribute type in %s on line %d
 bool(false)
 string(24) "Undefined attribute type"
 int(17)
-
-Warning: ldap_add(): Unknown attribute in the data in %s on line %d
-bool(false)
diff --git a/ext/ldap/tests/ldap_add_modify_delete_programming_errors.phpt b/ext/ldap/tests/ldap_add_modify_delete_programming_errors.phpt
new file mode 100644
index 0000000000000..14fa50312e7d1
--- /dev/null
+++ b/ext/ldap/tests/ldap_add_modify_delete_programming_errors.phpt
@@ -0,0 +1,143 @@
+--TEST--
+Programming errors (Value/Type errors) for ldap_add(_ext)(), ldap_mod_replace(_ext)(), ldap_mod_add(_ext)(), and ldap_mod_del(_ext)()
+--EXTENSIONS--
+ldap
+--FILE--
+ 'value',
+    'attribute2' => [
+        'value1',
+        'value2',
+    ],
+];
+
+$empty_dict = [];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $empty_dict));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$not_dict_of_attributes = [
+    'attribute1' => 'value',
+    'not_key_entry',
+    'attribute3' => [
+        'value1',
+        'value2',
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $not_dict_of_attributes));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$dict_key_with_empty_key = [
+    'attribute1' => 'value',
+    '' => [
+        'value1',
+        'value2',
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_with_empty_key));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$dict_key_with_nul_bytes = [
+    "attrib1\0with\0nul\0byte" => 'value',
+    "attrib2\0with\0nul\0byte" => [
+        'value1',
+        'value2',
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_with_nul_bytes));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$dict_key_value_not_string = [
+    'attribute1' => new stdClass(),
+    'attribute2' => [
+        'value1',
+        'value2',
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_value_not_string));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$dict_key_multi_value_empty_list = [
+    'attribute1' => 'value',
+    'attribute2' => [],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_multi_value_empty_list));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$dict_key_multi_value_not_list = [
+    'attribute1' => 'value',
+    'attribute2' => [
+        'value1',
+        'wat' => 'nosense',
+        'value2',
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_multi_value_not_list));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$dict_key_multi_value_not_list_of_strings = [
+    'attribute1' => 'value',
+    'attribute2' => [
+        'value1',
+        [],
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_multi_value_not_list_of_strings));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$dict_key_multi_value_not_list_of_strings2 = [
+    'attribute1' => 'value',
+    'attribute2' => [
+        'value1',
+        new stdClass(),
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_multi_value_not_list_of_strings2));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+/* We don't check that values have nul bytes as the length of the string is passed to LDAP */
+
+?>
+--EXPECT--
+ValueError: ldap_add(): Argument #3 ($entry) must not be empty
+ValueError: ldap_add(): Argument #3 ($entry) must be an associative array of attribute => values
+ValueError: ldap_add(): Argument #3 ($entry) key must not be empty
+ValueError: ldap_add(): Argument #3 ($entry) key must not contain any null bytes
+Error: Object of class stdClass could not be converted to string
+ValueError: ldap_add(): Argument #3 ($entry) list of attribute values must not be empty
+ValueError: ldap_add(): Argument #3 ($entry) must be a list of attribute values
+TypeError: LDAP value must be of type string|int|bool, array given
+Error: Object of class stdClass could not be converted to string
diff --git a/ext/ldap/tests/ldap_add_modify_delete_references_programming_errors.phpt b/ext/ldap/tests/ldap_add_modify_delete_references_programming_errors.phpt
new file mode 100644
index 0000000000000..4926dbb841d0c
--- /dev/null
+++ b/ext/ldap/tests/ldap_add_modify_delete_references_programming_errors.phpt
@@ -0,0 +1,81 @@
+--TEST--
+Programming errors (Value/Type errors) for ldap_add(_ext)(), ldap_mod_replace(_ext)(), ldap_mod_add(_ext)(), and ldap_mod_del(_ext)() with references
+--EXTENSIONS--
+ldap
+--FILE--
+ 'value',
+    'attribute2' => [
+        'value1',
+        'value2',
+    ],
+];
+
+$obj = new stdClass();
+$dict_key_value_not_string = [
+    'attribute1' => &$obj,
+    'attribute2' => [
+        'value1',
+        'value2',
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_value_not_string));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$empty_list = [];
+$dict_key_multi_value_empty_list = [
+    'attribute1' => 'value',
+    'attribute2' => &$empty_list,
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_multi_value_empty_list));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$empty_list = [];
+$dict_key_multi_value_not_list_of_strings = [
+    'attribute1' => 'value',
+    'attribute2' => [
+        'value1',
+        &$empty_list,
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_multi_value_not_list_of_strings));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$obj = new stdClass();
+$dict_key_multi_value_not_list_of_strings2 = [
+    'attribute1' => 'value',
+    'attribute2' => [
+        'value1',
+        &$obj,
+    ],
+];
+try {
+    var_dump(ldap_add($ldap, $valid_dn, $dict_key_multi_value_not_list_of_strings2));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+/* We don't check that values have nul bytes as the length of the string is passed to LDAP */
+
+?>
+--EXPECT--
+Error: Object of class stdClass could not be converted to string
+ValueError: ldap_add(): Argument #3 ($entry) list of attribute values must not be empty
+TypeError: LDAP value must be of type string|int|bool, array given
+TypeError: LDAP value must be of type string|int|bool, stdClass given
diff --git a/ext/ldap/tests/ldap_explode_dn.phpt b/ext/ldap/tests/ldap_explode_dn.phpt
index 2012506c3ef07..047078c7beb79 100644
--- a/ext/ldap/tests/ldap_explode_dn.phpt
+++ b/ext/ldap/tests/ldap_explode_dn.phpt
@@ -34,18 +34,16 @@ echo "Done\n";
 ?>
 --EXPECT--
 array(4) {
-  ["count"]=>
-  int(3)
   [0]=>
   string(6) "cn=bob"
   [1]=>
   string(10) "dc=example"
   [2]=>
   string(6) "dc=com"
+  ["count"]=>
+  int(3)
 }
 array(5) {
-  ["count"]=>
-  int(4)
   [0]=>
   string(6) "cn=bob"
   [1]=>
@@ -54,20 +52,20 @@ array(5) {
   string(10) "dc=example"
   [3]=>
   string(6) "dc=com"
+  ["count"]=>
+  int(4)
 }
 array(4) {
-  ["count"]=>
-  int(3)
   [0]=>
   string(3) "bob"
   [1]=>
   string(7) "example"
   [2]=>
   string(3) "com"
+  ["count"]=>
+  int(3)
 }
 array(5) {
-  ["count"]=>
-  int(4)
   [0]=>
   string(3) "bob"
   [1]=>
@@ -76,6 +74,8 @@ array(5) {
   string(7) "example"
   [3]=>
   string(3) "com"
+  ["count"]=>
+  int(4)
 }
 bool(false)
 bool(false)
diff --git a/ext/ldap/tests/ldap_get_option_package_basic.phpt b/ext/ldap/tests/ldap_get_option_package_basic.phpt
index 6424a1c5d104f..9135ea233701d 100644
--- a/ext/ldap/tests/ldap_get_option_package_basic.phpt
+++ b/ext/ldap/tests/ldap_get_option_package_basic.phpt
@@ -11,9 +11,7 @@ $link = ldap_connect($uri);
 
 $result = ldap_get_option($link, LDAP_OPT_X_TLS_PACKAGE, $optionval);
 var_dump(in_array($optionval, ['GnuTLS', 'OpenSSL', 'MozNSS']));
-// This is a read-only option.
-var_dump(ldap_set_option($link, LDAP_OPT_X_TLS_PACKAGE, 'foo'));
+
 ?>
 --EXPECT--
 bool(true)
-bool(false)
diff --git a/ext/ldap/tests/ldap_get_set_invalid_option_error.phpt b/ext/ldap/tests/ldap_get_set_invalid_option_error.phpt
new file mode 100644
index 0000000000000..2079353e48c97
--- /dev/null
+++ b/ext/ldap/tests/ldap_get_set_invalid_option_error.phpt
@@ -0,0 +1,22 @@
+--TEST--
+ldap_(g|s)et_option() with non existing option
+--EXTENSIONS--
+ldap
+--FILE--
+getMessage(), PHP_EOL;
+}
+try {
+    var_dump(ldap_get_option($ldap, 999999, $value));
+} catch (Throwable $e) {
+    echo $e::class, ": ", $e->getMessage(), PHP_EOL;
+}
+?>
+--EXPECT--
+ValueError: ldap_set_option(): Argument #2 ($option) must be a valid LDAP option
+ValueError: ldap_get_option(): Argument #2 ($option) must be a valid LDAP option
diff --git a/ext/ldap/tests/ldap_list_read_search_parallel_programming_errors.phpt b/ext/ldap/tests/ldap_list_read_search_parallel_programming_errors.phpt
new file mode 100644
index 0000000000000..4f3567d9e00b7
--- /dev/null
+++ b/ext/ldap/tests/ldap_list_read_search_parallel_programming_errors.phpt
@@ -0,0 +1,113 @@
+--TEST--
+Programming errors (Value/Type errors) for parallel usage of ldap_list(), ldap_read(), and ldap_search()
+--EXTENSIONS--
+ldap
+--FILE--
+getMessage(), PHP_EOL;
+}
+
+$dn = "dn_with\0nul_byte";
+try {
+    var_dump(ldap_list($ldaps, $dn, $valid_filter));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$filter = "filter_with\0nul_byte";
+try {
+    var_dump(ldap_list($ldaps, $valid_dn, $filter));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$not_list = [
+    "attrib1",
+    "wat" => "attrib2",
+];
+try {
+    var_dump(ldap_list($ldaps, $not_list, $valid_filter));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+try {
+    var_dump(ldap_list($ldaps, $valid_dn, $not_list));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$list_not_same_length = [
+    "string1",
+    "string2",
+    "string3",
+];
+try {
+    var_dump(ldap_list($ldaps, $list_not_same_length, $valid_filter));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+try {
+    var_dump(ldap_list($ldaps, $valid_dn, $list_not_same_length));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$list_not_all_strings = [
+    42,
+    "string2",
+];
+try {
+    var_dump(ldap_list($ldaps, $list_not_all_strings, $valid_filter));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+try {
+    var_dump(ldap_list($ldaps, $valid_dn, $list_not_all_strings));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$list_strings_with_nul_bytes = [
+    "string\0nul_byte",
+    "string2",
+];
+try {
+    var_dump(ldap_list($ldaps, $list_strings_with_nul_bytes, $valid_filter));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+try {
+    var_dump(ldap_list($ldaps, $valid_dn, $list_strings_with_nul_bytes));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: ldap_list(): Argument #1 ($ldap) must be a list of LDAP\Connection
+ValueError: ldap_list(): Argument #2 ($base) must not contain null bytes
+ValueError: ldap_list(): Argument #3 ($filter) must not contain null bytes
+ValueError: ldap_list(): Argument #2 ($base) must be a list
+ValueError: ldap_list(): Argument #3 ($filter) must be a list
+ValueError: ldap_list(): Argument #2 ($base) must be the same size as argument #1
+ValueError: ldap_list(): Argument #3 ($filter) must be the same size as argument #1
+TypeError: ldap_list(): Argument #2 ($base) must be a list of strings, int given
+TypeError: ldap_list(): Argument #3 ($filter) must be a list of strings, int given
+ValueError: ldap_list(): Argument #2 ($base) must not contain null bytes
+ValueError: ldap_list(): Argument #3 ($filter) must not contain null bytes
\ No newline at end of file
diff --git a/ext/ldap/tests/ldap_list_read_search_parallel_references.phpt b/ext/ldap/tests/ldap_list_read_search_parallel_references.phpt
new file mode 100644
index 0000000000000..321cb1cff6c1c
--- /dev/null
+++ b/ext/ldap/tests/ldap_list_read_search_parallel_references.phpt
@@ -0,0 +1,37 @@
+--TEST--
+Programming errors (Value/Type errors) for parallel usage of ldap_list(), ldap_read(), and ldap_search() with references
+--EXTENSIONS--
+ldap
+--FILE--
+getMessage(), PHP_EOL;
+}
+try {
+    var_dump(ldap_list($ldaps, $valid_dn, $list_with_ref_nul_byte));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: ldap_list(): Argument #2 ($base) must not contain null bytes
+ValueError: ldap_list(): Argument #3 ($filter) must not contain null bytes
diff --git a/ext/ldap/tests/ldap_list_read_search_programming_errors.phpt b/ext/ldap/tests/ldap_list_read_search_programming_errors.phpt
new file mode 100644
index 0000000000000..59e227d818ecf
--- /dev/null
+++ b/ext/ldap/tests/ldap_list_read_search_programming_errors.phpt
@@ -0,0 +1,86 @@
+--TEST--
+Programming errors (Value/Type errors) for ldap_list(), ldap_read(), and ldap_search()
+--EXTENSIONS--
+ldap
+--FILE--
+getMessage(), PHP_EOL;
+}
+
+try {
+    var_dump(ldap_list($ldap, [$valid_dn], $valid_filter));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+try {
+    var_dump(ldap_list($ldap, $valid_dn, [$valid_filter]));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$not_list = [
+    "attrib1",
+    "wat" => "attrib2",
+    "attrib3",
+];
+try {
+    var_dump(ldap_list($ldap, $valid_dn, $valid_filter, $not_list));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$not_list_of_strings = [
+    "attrib1",
+    42,
+    "attrib3",
+];
+try {
+    var_dump(ldap_list($ldap, $valid_dn, $valid_filter, $not_list_of_strings));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$list_of_strings_with_null_byte = [
+    "attrib1",
+    "attrib_with\0nul_byte",
+    "attrib3",
+];
+try {
+    var_dump(ldap_list($ldap, $valid_dn, $valid_filter, $list_of_strings_with_null_byte));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$str = "attrib_with\0nul_byte";
+
+$list_with_ref_nul_byte = [
+    "attrib1",
+    &$str,
+    "attrib3",
+];
+try {
+    var_dump(ldap_list($ldap, $valid_dn, $valid_filter, $list_with_ref_nul_byte));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+TypeError: ldap_list(): Argument #1 ($ldap) must be of type LDAP\Connection|array, int given
+TypeError: ldap_list(): Argument #2 ($base) must be of type string when argument #1 ($ldap) is an LDAP\Connection instance
+TypeError: ldap_list(): Argument #3 ($filter) must be of type string when argument #1 ($ldap) is an LDAP\Connection instance
+ValueError: ldap_list(): Argument #4 ($attributes) must be a list
+TypeError: ldap_list(): Argument #4 ($attributes) must be a list of strings, int given
+ValueError: ldap_list(): Argument #4 ($attributes) must not contain strings with any null bytes
+ValueError: ldap_list(): Argument #4 ($attributes) must not contain strings with any null bytes
diff --git a/ext/ldap/tests/ldap_mod_add_error.phpt b/ext/ldap/tests/ldap_mod_add_error.phpt
index 47aafb01612ad..40550acf388ad 100644
--- a/ext/ldap/tests/ldap_mod_add_error.phpt
+++ b/ext/ldap/tests/ldap_mod_add_error.phpt
@@ -14,19 +14,20 @@ require "connect.inc";
 $link = ldap_connect_and_bind($uri, $user, $passwd, $protocol_version);
 
 // DN not found
-var_dump(ldap_mod_add($link, "dc=my-domain,$base", array()));
+var_dump(ldap_mod_add($link, "dc=my-domain,$base", ["dc" => "my-domain"]));
 
 // Invalid DN
-var_dump(ldap_mod_add($link, "weirdAttribute=val", array()));
+var_dump(ldap_mod_add($link, "weirdAttribute=val", ["dc" => "my-domain"]));
 
-$entry = array(
-    "objectClass"	=> array(
+$entry = [
+    "objectClass" => [
         "top",
         "dcObject",
-        "organization"),
-    "dc"			=> "my-domain",
-    "o"				=> "my-domain",
-);
+        "organization",
+    ],
+    "dc" => "my-domain",
+    "o"	 => "my-domain",
+];
 
 ldap_add($link, "dc=my-domain,$base", $entry);
 
diff --git a/ext/ldap/tests/ldap_mod_del_error.phpt b/ext/ldap/tests/ldap_mod_del_error.phpt
index 2a6e81ba1492e..5c0650d9fe2e0 100644
--- a/ext/ldap/tests/ldap_mod_del_error.phpt
+++ b/ext/ldap/tests/ldap_mod_del_error.phpt
@@ -14,13 +14,11 @@ require "connect.inc";
 $link = ldap_connect_and_bind($uri, $user, $passwd, $protocol_version);
 
 // DN not found
-var_dump(ldap_mod_del($link, "dc=my-domain,$base", array()));
+var_dump(ldap_mod_del($link, "dc=my-domain,$base", ["dc" => "my-domain"]));
 
 // Invalid DN
-var_dump(ldap_mod_del($link, "weirdAttribute=val", array()));
+var_dump(ldap_mod_del($link, "weirdAttribute=val", ["dc" => "my-domain"]));
 
-// Invalid attributes
-var_dump(ldap_mod_del($link, "$base", array('dc')));
 ?>
 --CLEAN--
  "my-domain"]));
 
 // Invalid DN
-var_dump(ldap_mod_replace($link, "weirdAttribute=val", array()));
+var_dump(ldap_mod_replace($link, "weirdAttribute=val", ["dc" => "my-domain"]));
 
-// Invalid attributes
-var_dump(ldap_mod_replace($link, "$base", array('dc')));
 ?>
 --CLEAN--
 getMessage(), PHP_EOL;
+}
+
+$attrib = "attrib\0with\0nul\0byte";
+$modification_attrib_reference_string = [
+    [
+        "attrib"  => &$attrib,
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_attrib_reference_string));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modtype = -10;
+$modification_modtype_reference_int = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => &$modtype,
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_modtype_reference_int));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+
+$values = [];
+$modification_values_reference_array = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => &$values,
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_values_reference_array));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must only contain the keys "attrib", "modtype", and "values"
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "attrib" must not contain null bytes
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "modtype" must be LDAP_MODIFY_BATCH_ADD, LDAP_MODIFY_BATCH_REMOVE, LDAP_MODIFY_BATCH_REPLACE, or LDAP_MODIFY_BATCH_REMOVE_ALL
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "values" must not be empty
diff --git a/ext/ldap/tests/ldap_modify_batch_programming_error.phpt b/ext/ldap/tests/ldap_modify_batch_programming_error.phpt
new file mode 100644
index 0000000000000..e391a403101f5
--- /dev/null
+++ b/ext/ldap/tests/ldap_modify_batch_programming_error.phpt
@@ -0,0 +1,276 @@
+--TEST--
+ldap_modify_batch() - ValueErrors and TypeErrors
+--EXTENSIONS--
+ldap
+--FILE--
+getMessage(), PHP_EOL;
+}
+
+$empty_list = [];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $empty_list));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$not_list1 = [
+    'entry1' => [],
+    'entry2' => [],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $not_list1));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$not_list2 = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value1"],
+    ],
+    2 => [],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $not_list2));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+
+$not_list_of_arrays = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value1"],
+    ],
+    'not an array',
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $not_list_of_arrays));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modifications_not_all_dicts = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value1"],
+    ],
+    [
+        "attrib"  => "attrib2",
+        "modtype" => LDAP_MODIFY_BATCH_REMOVE_ALL,
+        4         => ["value2"],
+    ],
+    [
+        "attrib"  => "attrib3",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value3"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modifications_not_all_dicts));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_has_invalid_key = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value1"],
+        "random"  => "what",
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_has_invalid_key));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_attrib_not_string = [
+    [
+        "attrib"  => 25,
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_attrib_not_string));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_attrib_has_nul_byte = [
+    [
+        "attrib"  => "attrib\0with\0nul\0byte",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_attrib_has_nul_byte));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_modtype_not_int = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => new stdClass(),
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_modtype_not_int));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_modtype_invalid_value = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => 42,
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_modtype_invalid_value));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_modtype_remove_all_with_values_key = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_REMOVE_ALL,
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_modtype_remove_all_with_values_key));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_modtype_not_remove_all_without_values_key = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_modtype_not_remove_all_without_values_key));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_values_invalid_value = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => "value1",
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_values_invalid_value));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_values_empty_array = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => [],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_values_empty_array));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_values_not_list1 = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => $not_list1,
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_values_not_list1));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_values_not_list2 = [
+    [
+        "attrib"  => "attrib1",
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => $not_list2,
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_values_not_list2));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_missing_attrib_key = [
+    [
+        "modtype" => LDAP_MODIFY_BATCH_ADD,
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_missing_attrib_key));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+$modification_missing_modtype_key = [
+    [
+        "attrib"  => "attrib1",
+        "values"  => ["value1"],
+    ],
+];
+try {
+    var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_missing_modtype_key));
+} catch (Throwable $e) {
+    echo $e::class, ': ', $e->getMessage(), PHP_EOL;
+}
+
+?>
+--EXPECT--
+ValueError: ldap_modify_batch(): Argument #2 ($dn) must not contain any null bytes
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) must not be empty
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) must be a list
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) must be a list
+TypeError: ldap_modify_batch(): Argument #3 ($modifications_info) must only contain arrays
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must not contain the "values" option when option "modtype" is LDAP_MODIFY_BATCH_REMOVE_ALL
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must only contain the keys "attrib", "modtype", and "values"
+TypeError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "attrib" must be of type string, int given
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "attrib" must not contain null bytes
+TypeError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "modtype" must be of type int, string given
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "modtype" must be LDAP_MODIFY_BATCH_ADD, LDAP_MODIFY_BATCH_REMOVE, LDAP_MODIFY_BATCH_REPLACE, or LDAP_MODIFY_BATCH_REMOVE_ALL
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must not contain the "values" option when option "modtype" is LDAP_MODIFY_BATCH_REMOVE_ALL
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must contain the "values" option when the "modtype" option is not LDAP_MODIFY_BATCH_REMOVE_ALL
+TypeError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "values" must be of type array, string given
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "values" must not be empty
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "values" must be a list
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "values" must be a list
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must contain the "attrib" option
+ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must contain the "modtype" option
diff --git a/ext/ldap/tests/ldap_modify_error.phpt b/ext/ldap/tests/ldap_modify_error.phpt
index a4807dfd8acc0..f8ccf89ec7fa5 100644
--- a/ext/ldap/tests/ldap_modify_error.phpt
+++ b/ext/ldap/tests/ldap_modify_error.phpt
@@ -14,19 +14,20 @@ require "connect.inc";
 $link = ldap_connect_and_bind($uri, $user, $passwd, $protocol_version);
 
 // DN not found
-var_dump(ldap_modify($link, "cn=not-found,$base", array()));
+var_dump(ldap_modify($link, "cn=not-found,$base", ["dc" => "my-domain"]));
 
 // Invalid DN
-var_dump(ldap_modify($link, "weirdAttribute=val", array()));
+var_dump(ldap_modify($link, "weirdAttribute=val", ["dc" => "my-domain"]));
 
-$entry = array(
-    "objectClass"	=> array(
+$entry = [
+    "objectClass" => [
         "top",
         "dcObject",
-        "organization"),
-    "dc"			=> "my-domain",
-    "o"				=> "my-domain",
-);
+        "organization",
+    ],
+    "dc" => "my-domain",
+    "o"	 => "my-domain",
+];
 
 ldap_add($link, "dc=my-domain,$base", $entry);
 
diff --git a/ext/ldap/tests/ldap_search_error.phpt b/ext/ldap/tests/ldap_search_error.phpt
index 4e775ad13d66e..04d8af46f5982 100644
--- a/ext/ldap/tests/ldap_search_error.phpt
+++ b/ext/ldap/tests/ldap_search_error.phpt
@@ -19,8 +19,12 @@ $filter = "(dc=*)";
 $result = ldap_search($link, $dn, $filter);
 var_dump($result);
 
-$result = ldap_search($link, $dn, $filter, array(1 => 'top'));
-var_dump($result);
+try {
+    $result = ldap_search($link, $dn, $filter, array(1 => 'top'));
+    var_dump($result);
+} catch (ValueError $exception) {
+    echo $exception->getMessage() . "\n";
+}
 
 try {
     ldap_search(array(), $dn, $filter, array('top'));
@@ -56,11 +60,9 @@ try {
 --EXPECTF--
 Warning: ldap_search(): Search: No such object in %s on line %d
 bool(false)
-
-Warning: ldap_search(): Array initialization wrong in %s on line %d
-bool(false)
+ldap_search(): Argument #4 ($attributes) must be a list
 ldap_search(): Argument #1 ($ldap) must not be empty
-ldap_search(): Argument #2 ($base) must have the same number of elements as the links array
-ldap_search(): Argument #3 ($filter) must have the same number of elements as the links array
-ldap_search(): Argument #2 ($base) must be of type string when argument #1 ($ldap) is an LDAP instance
-ldap_search(): Argument #3 ($filter) must be of type string when argument #1 ($ldap) is an LDAP instance
+ldap_search(): Argument #2 ($base) must be the same size as argument #1
+ldap_search(): Argument #3 ($filter) must be the same size as argument #1
+ldap_search(): Argument #2 ($base) must be of type string when argument #1 ($ldap) is an LDAP\Connection instance
+ldap_search(): Argument #3 ($filter) must be of type string when argument #1 ($ldap) is an LDAP\Connection instance
diff --git a/ext/ldap/tests/ldap_set_option_error.phpt b/ext/ldap/tests/ldap_set_option_error.phpt
index fa66e348c46ba..eda3dc5121733 100644
--- a/ext/ldap/tests/ldap_set_option_error.phpt
+++ b/ext/ldap/tests/ldap_set_option_error.phpt
@@ -33,11 +33,9 @@ foreach ($controls as $control) {
     }
 }
 
-var_dump(ldap_set_option($link, 999999, 999999));
 ?>
 --EXPECT--
 bool(false)
 ValueError: ldap_set_option(): Control must have an "oid" key
 TypeError: ldap_set_option(): Argument #3 ($value) must contain only arrays, where each array is a control
 TypeError: ldap_set_option(): Argument #3 ($value) must be of type array for the LDAP_OPT_CLIENT_CONTROLS option, string given
-bool(false)
diff --git a/ext/libxml/libxml_arginfo.h b/ext/libxml/libxml_arginfo.h
index ee33939b77d2d..86336d09c7d1b 100644
--- a/ext/libxml/libxml_arginfo.h
+++ b/ext/libxml/libxml_arginfo.h
@@ -87,7 +87,7 @@ static void register_libxml_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("LIBXML_ERR_FATAL", XML_ERR_FATAL, CONST_PERSISTENT);
 
 
-	zend_attribute *attribute_Deprecated_func_libxml_disable_entity_loader_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "libxml_disable_entity_loader", sizeof("libxml_disable_entity_loader") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_libxml_disable_entity_loader_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "libxml_disable_entity_loader", sizeof("libxml_disable_entity_loader") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_libxml_disable_entity_loader_0_arg0;
 	zend_string *attribute_Deprecated_func_libxml_disable_entity_loader_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_libxml_disable_entity_loader_0_arg0, attribute_Deprecated_func_libxml_disable_entity_loader_0_arg0_str);
@@ -115,9 +115,7 @@ static zend_class_entry *register_class_LibXMLError(void)
 
 	zval property_code_default_value;
 	ZVAL_UNDEF(&property_code_default_value);
-	zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
-	zend_declare_typed_property(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(property_code_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_CODE), &property_code_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 
 	zval property_column_default_value;
 	ZVAL_UNDEF(&property_column_default_value);
@@ -127,21 +125,15 @@ static zend_class_entry *register_class_LibXMLError(void)
 
 	zval property_message_default_value;
 	ZVAL_UNDEF(&property_message_default_value);
-	zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
-	zend_declare_typed_property(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_message_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_MESSAGE), &property_message_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_file_default_value;
 	ZVAL_UNDEF(&property_file_default_value);
-	zend_string *property_file_name = zend_string_init("file", sizeof("file") - 1, 1);
-	zend_declare_typed_property(class_entry, property_file_name, &property_file_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_file_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_FILE), &property_file_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_line_default_value;
 	ZVAL_UNDEF(&property_line_default_value);
-	zend_string *property_line_name = zend_string_init("line", sizeof("line") - 1, 1);
-	zend_declare_typed_property(class_entry, property_line_name, &property_line_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(property_line_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_LINE), &property_line_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 
 	return class_entry;
 }
diff --git a/ext/libxml/tests/bug61367-read_2.phpt b/ext/libxml/tests/bug61367-read_2.phpt
index bbcf696773bf0..f4b0f300293c8 100644
--- a/ext/libxml/tests/bug61367-read_2.phpt
+++ b/ext/libxml/tests/bug61367-read_2.phpt
@@ -58,6 +58,6 @@ bool(true)
 int(4)
 bool(true)
 
-Warning: DOMDocument::loadXML(): %Sfailed to load external entity "file:///%s/test_bug_61367-read/bad" in %s on line %d
+%s: DOMDocument::loadXML(): %Sfailed to load %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 32283ea3f471c..fb71c0c8d7566 100644
--- a/ext/libxml/tests/libxml_disable_entity_loader_2.phpt
+++ b/ext/libxml/tests/libxml_disable_entity_loader_2.phpt
@@ -40,6 +40,6 @@ bool(true)
 Deprecated: Function libxml_disable_entity_loader() is deprecated since 8.0, as external entity loading is disabled by default in %s on line %d
 bool(false)
 
-Warning: DOMDocument::loadXML(): %Sfailed to load external entity "%s" in %s on line %d
+%s: DOMDocument::loadXML(): %Sfailed to load %s
 bool(true)
 Done
diff --git a/ext/libxml/tests/libxml_set_external_entity_loader_variation1.phpt b/ext/libxml/tests/libxml_set_external_entity_loader_variation1.phpt
index b480652209d53..e56e59c38698b 100644
--- a/ext/libxml/tests/libxml_set_external_entity_loader_variation1.phpt
+++ b/ext/libxml/tests/libxml_set_external_entity_loader_variation1.phpt
@@ -61,7 +61,7 @@ string(13) "-//FOO/ENTITY"
 string(32) "http://example.com/fooentity.ent"
 array(4) {
   ["directory"]=>
-  string(%d) "%s"
+  %r(NULL|string\(%d\) "%s")%r
   ["intSubName"]=>
   string(3) "foo"
   ["extSubURI"]=>
diff --git a/ext/mbstring/libmbfl/mbfl/eaw_table.h b/ext/mbstring/libmbfl/mbfl/eaw_table.h
index b322f288f1f84..0150306835ba1 100644
--- a/ext/mbstring/libmbfl/mbfl/eaw_table.h
+++ b/ext/mbstring/libmbfl/mbfl/eaw_table.h
@@ -28,8 +28,10 @@ static const struct {
 	{ 0x23f3, 0x23f3 },
 	{ 0x25fd, 0x25fe },
 	{ 0x2614, 0x2615 },
+	{ 0x2630, 0x2637 },
 	{ 0x2648, 0x2653 },
 	{ 0x267f, 0x267f },
+	{ 0x268a, 0x268f },
 	{ 0x2693, 0x2693 },
 	{ 0x26a1, 0x26a1 },
 	{ 0x26aa, 0x26ab },
@@ -63,11 +65,10 @@ static const struct {
 	{ 0x3099, 0x30ff },
 	{ 0x3105, 0x312f },
 	{ 0x3131, 0x318e },
-	{ 0x3190, 0x31e3 },
+	{ 0x3190, 0x31e5 },
 	{ 0x31ef, 0x321e },
 	{ 0x3220, 0x3247 },
-	{ 0x3250, 0x4dbf },
-	{ 0x4e00, 0xa48c },
+	{ 0x3250, 0xa48c },
 	{ 0xa490, 0xa4c6 },
 	{ 0xa960, 0xa97c },
 	{ 0xac00, 0xd7a3 },
@@ -82,7 +83,7 @@ static const struct {
 	{ 0x16ff0, 0x16ff1 },
 	{ 0x17000, 0x187f7 },
 	{ 0x18800, 0x18cd5 },
-	{ 0x18d00, 0x18d08 },
+	{ 0x18cff, 0x18d08 },
 	{ 0x1aff0, 0x1aff3 },
 	{ 0x1aff5, 0x1affb },
 	{ 0x1affd, 0x1affe },
@@ -92,6 +93,8 @@ static const struct {
 	{ 0x1b155, 0x1b155 },
 	{ 0x1b164, 0x1b167 },
 	{ 0x1b170, 0x1b2fb },
+	{ 0x1d300, 0x1d356 },
+	{ 0x1d360, 0x1d376 },
 	{ 0x1f004, 0x1f004 },
 	{ 0x1f0cf, 0x1f0cf },
 	{ 0x1f18e, 0x1f18e },
@@ -132,11 +135,10 @@ static const struct {
 	{ 0x1f93c, 0x1f945 },
 	{ 0x1f947, 0x1f9ff },
 	{ 0x1fa70, 0x1fa7c },
-	{ 0x1fa80, 0x1fa88 },
-	{ 0x1fa90, 0x1fabd },
-	{ 0x1fabf, 0x1fac5 },
-	{ 0x1face, 0x1fadb },
-	{ 0x1fae0, 0x1fae8 },
+	{ 0x1fa80, 0x1fa89 },
+	{ 0x1fa8f, 0x1fac6 },
+	{ 0x1face, 0x1fadc },
+	{ 0x1fadf, 0x1fae9 },
 	{ 0x1faf0, 0x1faf8 },
 	{ 0x20000, 0x2fffd },
 	{ 0x30000, 0x3fffd },
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
index f79d21922508e..6e44f68b85790 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
@@ -349,7 +349,7 @@ 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 (strcasecmp((*encoding)->mime_name, name) == 0) {
+			if (strncasecmp((*encoding)->mime_name, name, name_len) == 0 && (*encoding)->mime_name[name_len] == '\0') {
 				return *encoding;
 			}
 		}
@@ -359,7 +359,7 @@ 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 (strcasecmp(*alias, name) == 0) {
+				if (strncasecmp(name, *alias, name_len) == 0 && (*alias)[name_len] == '\0') {
 					return *encoding;
 				}
 			}
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index 1ca160d4740a6..9c2ecc44550bd 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -2326,6 +2326,16 @@ PHP_FUNCTION(mb_substr)
 		Z_PARAM_STR_OR_NULL(encoding)
 	ZEND_PARSE_PARAMETERS_END();
 
+	if (from == ZEND_LONG_MIN) {
+		zend_argument_value_error(2, "must be between " ZEND_LONG_FMT " and " ZEND_LONG_FMT, (ZEND_LONG_MIN + 1), ZEND_LONG_MAX);
+		RETURN_THROWS();
+	}
+
+	if (!len_is_null && len == ZEND_LONG_MIN) {
+		zend_argument_value_error(3, "must be between " ZEND_LONG_FMT " and " ZEND_LONG_FMT, (ZEND_LONG_MIN + 1), ZEND_LONG_MAX);
+		RETURN_THROWS();
+	}
+
 	const mbfl_encoding *enc = php_mb_get_encoding(encoding, 4);
 	if (!enc) {
 		RETURN_THROWS();
@@ -3770,7 +3780,22 @@ static bool mb_recursive_convert_variable(zval *var, const mbfl_encoding* from_e
 
 		HashTable *ht = HASH_OF(var);
 		if (ht != NULL) {
-			ZEND_HASH_FOREACH_VAL_IND(ht, entry) {
+			ZEND_HASH_FOREACH_VAL(ht, entry) {
+				/* Can be a typed property declaration, in which case we need to remove the reference from the source list.
+				 * Just using ZEND_TRY_ASSIGN_STRINGL is not sufficient because that would not unwrap the reference
+				 * and change values through references (see bug #26639). */
+				if (Z_TYPE_P(entry) == IS_INDIRECT) {
+					ZEND_ASSERT(Z_TYPE_P(var) == IS_OBJECT);
+
+					entry = Z_INDIRECT_P(entry);
+					if (Z_ISREF_P(entry) && Z_TYPE_P(Z_REFVAL_P(entry)) == IS_STRING) {
+						zend_property_info *info = zend_get_typed_property_info_for_slot(Z_OBJ_P(var), entry);
+						if (info) {
+							ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(entry), info);
+						}
+					}
+				}
+
 				if (mb_recursive_convert_variable(entry, from_encoding, to_encoding)) {
 					if (Z_REFCOUNTED_P(var)) {
 						Z_UNPROTECT_RECURSION_P(var);
@@ -4607,7 +4632,7 @@ PHP_FUNCTION(mb_send_mail)
 	smart_str str = {0};
 	bool empty = true;
 
-	if (str_headers != NULL) {
+	if (str_headers != NULL && ZSTR_LEN(str_headers) > 0) {
 		/* Strip trailing CRLF from `str_headers`; we will add CRLF back if necessary */
 		size_t len = ZSTR_LEN(str_headers);
 		if (ZSTR_VAL(str_headers)[len-1] == '\n') {
diff --git a/ext/mbstring/tests/gh15824.phpt b/ext/mbstring/tests/gh15824.phpt
new file mode 100644
index 0000000000000..570bb2b9d0382
--- /dev/null
+++ b/ext/mbstring/tests/gh15824.phpt
@@ -0,0 +1,37 @@
+--TEST--
+GH-15824 (ValueError: mb_detect_encoding(): Argument #2 ($encodings) contains invalid encoding "UTF8")
+--EXTENSIONS--
+mbstring
+--FILE--
+
+--EXPECT--
+== alias name ==
+string(5) "UTF-8"
+string(5) "UTF-8"
+string(5) "UTF-8"
+string(10) "ISO-8859-4"
+string(10) "ISO-8859-5"
+string(10) "ISO-8859-5"
+string(10) "ISO-8859-5"
+== mime name ==
+string(5) "ASCII"
+string(7) "CP50220"
+string(7) "CP50220"
+string(19) "UTF-8-Mobile#KDDI-B"
diff --git a/ext/mbstring/tests/gh16229.phpt b/ext/mbstring/tests/gh16229.phpt
new file mode 100644
index 0000000000000..1fe558d9b1025
--- /dev/null
+++ b/ext/mbstring/tests/gh16229.phpt
@@ -0,0 +1,26 @@
+--TEST--
+GH-16229 (Address overflowed in ext/mbstring/mbstring.c:4613 #16229)
+--EXTENSIONS--
+mbstring
+--INI--
+sendmail_path={MAIL:{PWD}/mb_send_mail_gh16229.eml}
+mail.add_x_header=off
+--SKIPIF--
+
+--FILE--
+
+--CLEAN--
+
+--EXPECTF--
diff --git a/ext/mbstring/tests/gh16261.phpt b/ext/mbstring/tests/gh16261.phpt
new file mode 100644
index 0000000000000..3573bd191c63d
--- /dev/null
+++ b/ext/mbstring/tests/gh16261.phpt
@@ -0,0 +1,44 @@
+--TEST--
+GH-16261 (Reference invariant broken in mb_convert_variables())
+--EXTENSIONS--
+mbstring
+--FILE--
+x =& $ref;
+$test->z =& $ref3;
+mb_convert_variables("EUC-JP", "Shift_JIS", $test);
+
+class Test2 {
+    public function __construct(public string $x) {}
+}
+$test2 = new Test2("foo");
+
+mb_convert_variables("EUC-JP", "Shift_JIS", $test->x);
+
+var_dump($test, $test2);
+?>
+--EXPECT--
+object(Test)#1 (2) {
+  ["x"]=>
+  string(5) "hello"
+  ["y"]=>
+  uninitialized(string)
+  ["z"]=>
+  &array(1) {
+    [0]=>
+    string(5) "world"
+  }
+}
+object(Test2)#2 (1) {
+  ["x"]=>
+  string(3) "foo"
+}
diff --git a/ext/mbstring/tests/gh16360.phpt b/ext/mbstring/tests/gh16360.phpt
new file mode 100644
index 0000000000000..4e2e8fb4bfc63
--- /dev/null
+++ b/ext/mbstring/tests/gh16360.phpt
@@ -0,0 +1,23 @@
+--TEST--
+GH-16320 mb_substr overflow from negative length
+--EXTENSIONS--
+mbstring
+--FILE--
+getMessage() . PHP_EOL;
+}
+try {
+	mb_substr("abcd", 0, PHP_INT_MIN, "UTF-8");
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+var_dump(mb_substr("abcd", PHP_INT_MAX, PHP_INT_MAX, "UTF-8"));
+?>
+--EXPECTF--
+mb_substr(): Argument #2 ($start) must be between %s and %s
+mb_substr(): Argument #3 ($length) must be between %s and %s
+string(0) ""
+
diff --git a/ext/mbstring/tests/unicode_versions.phpt b/ext/mbstring/tests/unicode_versions.phpt
index f320ccc6f8e21..b5b20ae2852f7 100644
--- a/ext/mbstring/tests/unicode_versions.phpt
+++ b/ext/mbstring/tests/unicode_versions.phpt
@@ -5,6 +5,8 @@ mbstring
 --FILE--
 
 --EXPECT--
+Char widths:
 ASCII (PHP): 3
 Vietnamese (Xin chào): 8
 Traditional Chinese (你好): 4
 Sinhalese (අයේෂ්): 5
 Emoji (🐘): 2
 Emoji (🛜): 2
+Emoji (☰): 2
+Char case changes:
+Upper(ƛ) =  : bool(true)
diff --git a/ext/mbstring/unicode_data.h b/ext/mbstring/unicode_data.h
index 52b2217e1f851..b205e67b21f12 100644
--- a/ext/mbstring/unicode_data.h
+++ b/ext/mbstring/unicode_data.h
@@ -13,11 +13,11 @@
 static const unsigned short _ucprop_size = 37;
 
 static const unsigned short  _ucprop_offsets[] = {
-	0x0000, 0x02b4, 0x0420, 0x042a, 0x04aa, 0x04c2, 0x0552, 0x0560,
-	0x0562, 0x0564, 0x0566, 0x056c, 0x056c, 0x0a78, 0x0f9c, 0x0fb0,
-	0x103e, 0x143c, 0x14bc, 0x14e6, 0x1524, 0x1696, 0x1c62, 0x1cf4,
-	0x1d0e, 0x1d20, 0x1d50, 0x1d60, 0x1d7a, 0x1d84, 0x1d8a, 0x1d98,
-	0x21ac, 0x2226, 0x2254, 0x23d2, 0x250c, 0x2876, 0x0000, 0x0000
+	0x0000, 0x02ca, 0x0446, 0x0450, 0x04de, 0x04f6, 0x0586, 0x0594,
+	0x0596, 0x0598, 0x059a, 0x05a0, 0x05a0, 0x0ab6, 0x0fe2, 0x0ff6,
+	0x108c, 0x14ac, 0x152e, 0x1558, 0x1596, 0x170c, 0x1d18, 0x1db0,
+	0x1dcc, 0x1dde, 0x1e0e, 0x1e20, 0x1e3a, 0x1e44, 0x1e4a, 0x1e58,
+	0x2290, 0x230c, 0x233a, 0x24c6, 0x2604, 0x298c, 0x0000, 0x0000
 };
 
 static const unsigned int _ucprop_ranges[] = {
@@ -33,7 +33,7 @@ static const unsigned int _ucprop_ranges[] = {
 	0x000007fd, 0x000007fd, 0x00000816, 0x00000819,
 	0x0000081b, 0x00000823, 0x00000825, 0x00000827,
 	0x00000829, 0x0000082d, 0x00000859, 0x0000085b,
-	0x00000898, 0x0000089f, 0x000008ca, 0x000008e1,
+	0x00000897, 0x0000089f, 0x000008ca, 0x000008e1,
 	0x000008e3, 0x00000902, 0x0000093a, 0x0000093a,
 	0x0000093c, 0x0000093c, 0x00000941, 0x00000948,
 	0x0000094d, 0x0000094d, 0x00000951, 0x00000957,
@@ -132,22 +132,25 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00010a05, 0x00010a06, 0x00010a0c, 0x00010a0f,
 	0x00010a38, 0x00010a3a, 0x00010a3f, 0x00010a3f,
 	0x00010ae5, 0x00010ae6, 0x00010d24, 0x00010d27,
-	0x00010eab, 0x00010eac, 0x00010efd, 0x00010eff,
-	0x00010f46, 0x00010f50, 0x00010f82, 0x00010f85,
-	0x00011001, 0x00011001, 0x00011038, 0x00011046,
-	0x00011070, 0x00011070, 0x00011073, 0x00011074,
-	0x0001107f, 0x00011081, 0x000110b3, 0x000110b6,
-	0x000110b9, 0x000110ba, 0x000110c2, 0x000110c2,
-	0x00011100, 0x00011102, 0x00011127, 0x0001112b,
-	0x0001112d, 0x00011134, 0x00011173, 0x00011173,
-	0x00011180, 0x00011181, 0x000111b6, 0x000111be,
-	0x000111c9, 0x000111cc, 0x000111cf, 0x000111cf,
-	0x0001122f, 0x00011231, 0x00011234, 0x00011234,
-	0x00011236, 0x00011237, 0x0001123e, 0x0001123e,
-	0x00011241, 0x00011241, 0x000112df, 0x000112df,
-	0x000112e3, 0x000112ea, 0x00011300, 0x00011301,
-	0x0001133b, 0x0001133c, 0x00011340, 0x00011340,
-	0x00011366, 0x0001136c, 0x00011370, 0x00011374,
+	0x00010d69, 0x00010d6d, 0x00010eab, 0x00010eac,
+	0x00010efc, 0x00010eff, 0x00010f46, 0x00010f50,
+	0x00010f82, 0x00010f85, 0x00011001, 0x00011001,
+	0x00011038, 0x00011046, 0x00011070, 0x00011070,
+	0x00011073, 0x00011074, 0x0001107f, 0x00011081,
+	0x000110b3, 0x000110b6, 0x000110b9, 0x000110ba,
+	0x000110c2, 0x000110c2, 0x00011100, 0x00011102,
+	0x00011127, 0x0001112b, 0x0001112d, 0x00011134,
+	0x00011173, 0x00011173, 0x00011180, 0x00011181,
+	0x000111b6, 0x000111be, 0x000111c9, 0x000111cc,
+	0x000111cf, 0x000111cf, 0x0001122f, 0x00011231,
+	0x00011234, 0x00011234, 0x00011236, 0x00011237,
+	0x0001123e, 0x0001123e, 0x00011241, 0x00011241,
+	0x000112df, 0x000112df, 0x000112e3, 0x000112ea,
+	0x00011300, 0x00011301, 0x0001133b, 0x0001133c,
+	0x00011340, 0x00011340, 0x00011366, 0x0001136c,
+	0x00011370, 0x00011374, 0x000113bb, 0x000113c0,
+	0x000113ce, 0x000113ce, 0x000113d0, 0x000113d0,
+	0x000113d2, 0x000113d2, 0x000113e1, 0x000113e2,
 	0x00011438, 0x0001143f, 0x00011442, 0x00011444,
 	0x00011446, 0x00011446, 0x0001145e, 0x0001145e,
 	0x000114b3, 0x000114b8, 0x000114ba, 0x000114ba,
@@ -157,27 +160,29 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00011633, 0x0001163a, 0x0001163d, 0x0001163d,
 	0x0001163f, 0x00011640, 0x000116ab, 0x000116ab,
 	0x000116ad, 0x000116ad, 0x000116b0, 0x000116b5,
-	0x000116b7, 0x000116b7, 0x0001171d, 0x0001171f,
-	0x00011722, 0x00011725, 0x00011727, 0x0001172b,
-	0x0001182f, 0x00011837, 0x00011839, 0x0001183a,
-	0x0001193b, 0x0001193c, 0x0001193e, 0x0001193e,
-	0x00011943, 0x00011943, 0x000119d4, 0x000119d7,
-	0x000119da, 0x000119db, 0x000119e0, 0x000119e0,
-	0x00011a01, 0x00011a0a, 0x00011a33, 0x00011a38,
-	0x00011a3b, 0x00011a3e, 0x00011a47, 0x00011a47,
-	0x00011a51, 0x00011a56, 0x00011a59, 0x00011a5b,
-	0x00011a8a, 0x00011a96, 0x00011a98, 0x00011a99,
-	0x00011c30, 0x00011c36, 0x00011c38, 0x00011c3d,
-	0x00011c3f, 0x00011c3f, 0x00011c92, 0x00011ca7,
-	0x00011caa, 0x00011cb0, 0x00011cb2, 0x00011cb3,
-	0x00011cb5, 0x00011cb6, 0x00011d31, 0x00011d36,
-	0x00011d3a, 0x00011d3a, 0x00011d3c, 0x00011d3d,
-	0x00011d3f, 0x00011d45, 0x00011d47, 0x00011d47,
-	0x00011d90, 0x00011d91, 0x00011d95, 0x00011d95,
-	0x00011d97, 0x00011d97, 0x00011ef3, 0x00011ef4,
-	0x00011f00, 0x00011f01, 0x00011f36, 0x00011f3a,
-	0x00011f40, 0x00011f40, 0x00011f42, 0x00011f42,
+	0x000116b7, 0x000116b7, 0x0001171d, 0x0001171d,
+	0x0001171f, 0x0001171f, 0x00011722, 0x00011725,
+	0x00011727, 0x0001172b, 0x0001182f, 0x00011837,
+	0x00011839, 0x0001183a, 0x0001193b, 0x0001193c,
+	0x0001193e, 0x0001193e, 0x00011943, 0x00011943,
+	0x000119d4, 0x000119d7, 0x000119da, 0x000119db,
+	0x000119e0, 0x000119e0, 0x00011a01, 0x00011a0a,
+	0x00011a33, 0x00011a38, 0x00011a3b, 0x00011a3e,
+	0x00011a47, 0x00011a47, 0x00011a51, 0x00011a56,
+	0x00011a59, 0x00011a5b, 0x00011a8a, 0x00011a96,
+	0x00011a98, 0x00011a99, 0x00011c30, 0x00011c36,
+	0x00011c38, 0x00011c3d, 0x00011c3f, 0x00011c3f,
+	0x00011c92, 0x00011ca7, 0x00011caa, 0x00011cb0,
+	0x00011cb2, 0x00011cb3, 0x00011cb5, 0x00011cb6,
+	0x00011d31, 0x00011d36, 0x00011d3a, 0x00011d3a,
+	0x00011d3c, 0x00011d3d, 0x00011d3f, 0x00011d45,
+	0x00011d47, 0x00011d47, 0x00011d90, 0x00011d91,
+	0x00011d95, 0x00011d95, 0x00011d97, 0x00011d97,
+	0x00011ef3, 0x00011ef4, 0x00011f00, 0x00011f01,
+	0x00011f36, 0x00011f3a, 0x00011f40, 0x00011f40,
+	0x00011f42, 0x00011f42, 0x00011f5a, 0x00011f5a,
 	0x00013440, 0x00013440, 0x00013447, 0x00013455,
+	0x0001611e, 0x00016129, 0x0001612d, 0x0001612f,
 	0x00016af0, 0x00016af4, 0x00016b30, 0x00016b36,
 	0x00016f4f, 0x00016f4f, 0x00016f8f, 0x00016f92,
 	0x00016fe4, 0x00016fe4, 0x0001bc9d, 0x0001bc9e,
@@ -192,83 +197,87 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0001e023, 0x0001e024, 0x0001e026, 0x0001e02a,
 	0x0001e08f, 0x0001e08f, 0x0001e130, 0x0001e136,
 	0x0001e2ae, 0x0001e2ae, 0x0001e2ec, 0x0001e2ef,
-	0x0001e4ec, 0x0001e4ef, 0x0001e8d0, 0x0001e8d6,
-	0x0001e944, 0x0001e94a, 0x000e0100, 0x000e01ef,
-	0x00000903, 0x00000903, 0x0000093b, 0x0000093b,
-	0x0000093e, 0x00000940, 0x00000949, 0x0000094c,
-	0x0000094e, 0x0000094f, 0x00000982, 0x00000983,
-	0x000009be, 0x000009c0, 0x000009c7, 0x000009c8,
-	0x000009cb, 0x000009cc, 0x000009d7, 0x000009d7,
-	0x00000a03, 0x00000a03, 0x00000a3e, 0x00000a40,
-	0x00000a83, 0x00000a83, 0x00000abe, 0x00000ac0,
-	0x00000ac9, 0x00000ac9, 0x00000acb, 0x00000acc,
-	0x00000b02, 0x00000b03, 0x00000b3e, 0x00000b3e,
-	0x00000b40, 0x00000b40, 0x00000b47, 0x00000b48,
-	0x00000b4b, 0x00000b4c, 0x00000b57, 0x00000b57,
-	0x00000bbe, 0x00000bbf, 0x00000bc1, 0x00000bc2,
-	0x00000bc6, 0x00000bc8, 0x00000bca, 0x00000bcc,
-	0x00000bd7, 0x00000bd7, 0x00000c01, 0x00000c03,
-	0x00000c41, 0x00000c44, 0x00000c82, 0x00000c83,
-	0x00000cbe, 0x00000cbe, 0x00000cc0, 0x00000cc4,
-	0x00000cc7, 0x00000cc8, 0x00000cca, 0x00000ccb,
-	0x00000cd5, 0x00000cd6, 0x00000cf3, 0x00000cf3,
-	0x00000d02, 0x00000d03, 0x00000d3e, 0x00000d40,
-	0x00000d46, 0x00000d48, 0x00000d4a, 0x00000d4c,
-	0x00000d57, 0x00000d57, 0x00000d82, 0x00000d83,
-	0x00000dcf, 0x00000dd1, 0x00000dd8, 0x00000ddf,
-	0x00000df2, 0x00000df3, 0x00000f3e, 0x00000f3f,
-	0x00000f7f, 0x00000f7f, 0x0000102b, 0x0000102c,
-	0x00001031, 0x00001031, 0x00001038, 0x00001038,
-	0x0000103b, 0x0000103c, 0x00001056, 0x00001057,
-	0x00001062, 0x00001064, 0x00001067, 0x0000106d,
-	0x00001083, 0x00001084, 0x00001087, 0x0000108c,
-	0x0000108f, 0x0000108f, 0x0000109a, 0x0000109c,
-	0x00001715, 0x00001715, 0x00001734, 0x00001734,
-	0x000017b6, 0x000017b6, 0x000017be, 0x000017c5,
-	0x000017c7, 0x000017c8, 0x00001923, 0x00001926,
-	0x00001929, 0x0000192b, 0x00001930, 0x00001931,
-	0x00001933, 0x00001938, 0x00001a19, 0x00001a1a,
-	0x00001a55, 0x00001a55, 0x00001a57, 0x00001a57,
-	0x00001a61, 0x00001a61, 0x00001a63, 0x00001a64,
-	0x00001a6d, 0x00001a72, 0x00001b04, 0x00001b04,
-	0x00001b35, 0x00001b35, 0x00001b3b, 0x00001b3b,
-	0x00001b3d, 0x00001b41, 0x00001b43, 0x00001b44,
-	0x00001b82, 0x00001b82, 0x00001ba1, 0x00001ba1,
-	0x00001ba6, 0x00001ba7, 0x00001baa, 0x00001baa,
-	0x00001be7, 0x00001be7, 0x00001bea, 0x00001bec,
-	0x00001bee, 0x00001bee, 0x00001bf2, 0x00001bf3,
-	0x00001c24, 0x00001c2b, 0x00001c34, 0x00001c35,
-	0x00001ce1, 0x00001ce1, 0x00001cf7, 0x00001cf7,
-	0x0000302e, 0x0000302f, 0x0000a823, 0x0000a824,
-	0x0000a827, 0x0000a827, 0x0000a880, 0x0000a881,
-	0x0000a8b4, 0x0000a8c3, 0x0000a952, 0x0000a953,
-	0x0000a983, 0x0000a983, 0x0000a9b4, 0x0000a9b5,
-	0x0000a9ba, 0x0000a9bb, 0x0000a9be, 0x0000a9c0,
-	0x0000aa2f, 0x0000aa30, 0x0000aa33, 0x0000aa34,
-	0x0000aa4d, 0x0000aa4d, 0x0000aa7b, 0x0000aa7b,
-	0x0000aa7d, 0x0000aa7d, 0x0000aaeb, 0x0000aaeb,
-	0x0000aaee, 0x0000aaef, 0x0000aaf5, 0x0000aaf5,
-	0x0000abe3, 0x0000abe4, 0x0000abe6, 0x0000abe7,
-	0x0000abe9, 0x0000abea, 0x0000abec, 0x0000abec,
-	0x00011000, 0x00011000, 0x00011002, 0x00011002,
-	0x00011082, 0x00011082, 0x000110b0, 0x000110b2,
-	0x000110b7, 0x000110b8, 0x0001112c, 0x0001112c,
-	0x00011145, 0x00011146, 0x00011182, 0x00011182,
-	0x000111b3, 0x000111b5, 0x000111bf, 0x000111c0,
-	0x000111ce, 0x000111ce, 0x0001122c, 0x0001122e,
-	0x00011232, 0x00011233, 0x00011235, 0x00011235,
-	0x000112e0, 0x000112e2, 0x00011302, 0x00011303,
-	0x0001133e, 0x0001133f, 0x00011341, 0x00011344,
-	0x00011347, 0x00011348, 0x0001134b, 0x0001134d,
-	0x00011357, 0x00011357, 0x00011362, 0x00011363,
-	0x00011435, 0x00011437, 0x00011440, 0x00011441,
-	0x00011445, 0x00011445, 0x000114b0, 0x000114b2,
-	0x000114b9, 0x000114b9, 0x000114bb, 0x000114be,
-	0x000114c1, 0x000114c1, 0x000115af, 0x000115b1,
-	0x000115b8, 0x000115bb, 0x000115be, 0x000115be,
-	0x00011630, 0x00011632, 0x0001163b, 0x0001163c,
-	0x0001163e, 0x0001163e, 0x000116ac, 0x000116ac,
-	0x000116ae, 0x000116af, 0x000116b6, 0x000116b6,
+	0x0001e4ec, 0x0001e4ef, 0x0001e5ee, 0x0001e5ef,
+	0x0001e8d0, 0x0001e8d6, 0x0001e944, 0x0001e94a,
+	0x000e0100, 0x000e01ef, 0x00000903, 0x00000903,
+	0x0000093b, 0x0000093b, 0x0000093e, 0x00000940,
+	0x00000949, 0x0000094c, 0x0000094e, 0x0000094f,
+	0x00000982, 0x00000983, 0x000009be, 0x000009c0,
+	0x000009c7, 0x000009c8, 0x000009cb, 0x000009cc,
+	0x000009d7, 0x000009d7, 0x00000a03, 0x00000a03,
+	0x00000a3e, 0x00000a40, 0x00000a83, 0x00000a83,
+	0x00000abe, 0x00000ac0, 0x00000ac9, 0x00000ac9,
+	0x00000acb, 0x00000acc, 0x00000b02, 0x00000b03,
+	0x00000b3e, 0x00000b3e, 0x00000b40, 0x00000b40,
+	0x00000b47, 0x00000b48, 0x00000b4b, 0x00000b4c,
+	0x00000b57, 0x00000b57, 0x00000bbe, 0x00000bbf,
+	0x00000bc1, 0x00000bc2, 0x00000bc6, 0x00000bc8,
+	0x00000bca, 0x00000bcc, 0x00000bd7, 0x00000bd7,
+	0x00000c01, 0x00000c03, 0x00000c41, 0x00000c44,
+	0x00000c82, 0x00000c83, 0x00000cbe, 0x00000cbe,
+	0x00000cc0, 0x00000cc4, 0x00000cc7, 0x00000cc8,
+	0x00000cca, 0x00000ccb, 0x00000cd5, 0x00000cd6,
+	0x00000cf3, 0x00000cf3, 0x00000d02, 0x00000d03,
+	0x00000d3e, 0x00000d40, 0x00000d46, 0x00000d48,
+	0x00000d4a, 0x00000d4c, 0x00000d57, 0x00000d57,
+	0x00000d82, 0x00000d83, 0x00000dcf, 0x00000dd1,
+	0x00000dd8, 0x00000ddf, 0x00000df2, 0x00000df3,
+	0x00000f3e, 0x00000f3f, 0x00000f7f, 0x00000f7f,
+	0x0000102b, 0x0000102c, 0x00001031, 0x00001031,
+	0x00001038, 0x00001038, 0x0000103b, 0x0000103c,
+	0x00001056, 0x00001057, 0x00001062, 0x00001064,
+	0x00001067, 0x0000106d, 0x00001083, 0x00001084,
+	0x00001087, 0x0000108c, 0x0000108f, 0x0000108f,
+	0x0000109a, 0x0000109c, 0x00001715, 0x00001715,
+	0x00001734, 0x00001734, 0x000017b6, 0x000017b6,
+	0x000017be, 0x000017c5, 0x000017c7, 0x000017c8,
+	0x00001923, 0x00001926, 0x00001929, 0x0000192b,
+	0x00001930, 0x00001931, 0x00001933, 0x00001938,
+	0x00001a19, 0x00001a1a, 0x00001a55, 0x00001a55,
+	0x00001a57, 0x00001a57, 0x00001a61, 0x00001a61,
+	0x00001a63, 0x00001a64, 0x00001a6d, 0x00001a72,
+	0x00001b04, 0x00001b04, 0x00001b35, 0x00001b35,
+	0x00001b3b, 0x00001b3b, 0x00001b3d, 0x00001b41,
+	0x00001b43, 0x00001b44, 0x00001b82, 0x00001b82,
+	0x00001ba1, 0x00001ba1, 0x00001ba6, 0x00001ba7,
+	0x00001baa, 0x00001baa, 0x00001be7, 0x00001be7,
+	0x00001bea, 0x00001bec, 0x00001bee, 0x00001bee,
+	0x00001bf2, 0x00001bf3, 0x00001c24, 0x00001c2b,
+	0x00001c34, 0x00001c35, 0x00001ce1, 0x00001ce1,
+	0x00001cf7, 0x00001cf7, 0x0000302e, 0x0000302f,
+	0x0000a823, 0x0000a824, 0x0000a827, 0x0000a827,
+	0x0000a880, 0x0000a881, 0x0000a8b4, 0x0000a8c3,
+	0x0000a952, 0x0000a953, 0x0000a983, 0x0000a983,
+	0x0000a9b4, 0x0000a9b5, 0x0000a9ba, 0x0000a9bb,
+	0x0000a9be, 0x0000a9c0, 0x0000aa2f, 0x0000aa30,
+	0x0000aa33, 0x0000aa34, 0x0000aa4d, 0x0000aa4d,
+	0x0000aa7b, 0x0000aa7b, 0x0000aa7d, 0x0000aa7d,
+	0x0000aaeb, 0x0000aaeb, 0x0000aaee, 0x0000aaef,
+	0x0000aaf5, 0x0000aaf5, 0x0000abe3, 0x0000abe4,
+	0x0000abe6, 0x0000abe7, 0x0000abe9, 0x0000abea,
+	0x0000abec, 0x0000abec, 0x00011000, 0x00011000,
+	0x00011002, 0x00011002, 0x00011082, 0x00011082,
+	0x000110b0, 0x000110b2, 0x000110b7, 0x000110b8,
+	0x0001112c, 0x0001112c, 0x00011145, 0x00011146,
+	0x00011182, 0x00011182, 0x000111b3, 0x000111b5,
+	0x000111bf, 0x000111c0, 0x000111ce, 0x000111ce,
+	0x0001122c, 0x0001122e, 0x00011232, 0x00011233,
+	0x00011235, 0x00011235, 0x000112e0, 0x000112e2,
+	0x00011302, 0x00011303, 0x0001133e, 0x0001133f,
+	0x00011341, 0x00011344, 0x00011347, 0x00011348,
+	0x0001134b, 0x0001134d, 0x00011357, 0x00011357,
+	0x00011362, 0x00011363, 0x000113b8, 0x000113ba,
+	0x000113c2, 0x000113c2, 0x000113c5, 0x000113c5,
+	0x000113c7, 0x000113ca, 0x000113cc, 0x000113cd,
+	0x000113cf, 0x000113cf, 0x00011435, 0x00011437,
+	0x00011440, 0x00011441, 0x00011445, 0x00011445,
+	0x000114b0, 0x000114b2, 0x000114b9, 0x000114b9,
+	0x000114bb, 0x000114be, 0x000114c1, 0x000114c1,
+	0x000115af, 0x000115b1, 0x000115b8, 0x000115bb,
+	0x000115be, 0x000115be, 0x00011630, 0x00011632,
+	0x0001163b, 0x0001163c, 0x0001163e, 0x0001163e,
+	0x000116ac, 0x000116ac, 0x000116ae, 0x000116af,
+	0x000116b6, 0x000116b6, 0x0001171e, 0x0001171e,
 	0x00011720, 0x00011721, 0x00011726, 0x00011726,
 	0x0001182c, 0x0001182e, 0x00011838, 0x00011838,
 	0x00011930, 0x00011935, 0x00011937, 0x00011938,
@@ -283,42 +292,46 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00011d96, 0x00011d96, 0x00011ef5, 0x00011ef6,
 	0x00011f03, 0x00011f03, 0x00011f34, 0x00011f35,
 	0x00011f3e, 0x00011f3f, 0x00011f41, 0x00011f41,
-	0x00016f51, 0x00016f87, 0x00016ff0, 0x00016ff1,
-	0x0001d165, 0x0001d166, 0x0001d16d, 0x0001d172,
-	0x00000488, 0x00000489, 0x00001abe, 0x00001abe,
-	0x000020dd, 0x000020e0, 0x000020e2, 0x000020e4,
-	0x0000a670, 0x0000a672, 0x00000030, 0x00000039,
-	0x00000660, 0x00000669, 0x000006f0, 0x000006f9,
-	0x000007c0, 0x000007c9, 0x00000966, 0x0000096f,
-	0x000009e6, 0x000009ef, 0x00000a66, 0x00000a6f,
-	0x00000ae6, 0x00000aef, 0x00000b66, 0x00000b6f,
-	0x00000be6, 0x00000bef, 0x00000c66, 0x00000c6f,
-	0x00000ce6, 0x00000cef, 0x00000d66, 0x00000d6f,
-	0x00000de6, 0x00000def, 0x00000e50, 0x00000e59,
-	0x00000ed0, 0x00000ed9, 0x00000f20, 0x00000f29,
-	0x00001040, 0x00001049, 0x00001090, 0x00001099,
-	0x000017e0, 0x000017e9, 0x00001810, 0x00001819,
-	0x00001946, 0x0000194f, 0x000019d0, 0x000019d9,
-	0x00001a80, 0x00001a89, 0x00001a90, 0x00001a99,
-	0x00001b50, 0x00001b59, 0x00001bb0, 0x00001bb9,
-	0x00001c40, 0x00001c49, 0x00001c50, 0x00001c59,
-	0x0000a620, 0x0000a629, 0x0000a8d0, 0x0000a8d9,
-	0x0000a900, 0x0000a909, 0x0000a9d0, 0x0000a9d9,
-	0x0000a9f0, 0x0000a9f9, 0x0000aa50, 0x0000aa59,
-	0x0000abf0, 0x0000abf9, 0x0000ff10, 0x0000ff19,
-	0x000104a0, 0x000104a9, 0x00010d30, 0x00010d39,
+	0x0001612a, 0x0001612c, 0x00016f51, 0x00016f87,
+	0x00016ff0, 0x00016ff1, 0x0001d165, 0x0001d166,
+	0x0001d16d, 0x0001d172, 0x00000488, 0x00000489,
+	0x00001abe, 0x00001abe, 0x000020dd, 0x000020e0,
+	0x000020e2, 0x000020e4, 0x0000a670, 0x0000a672,
+	0x00000030, 0x00000039, 0x00000660, 0x00000669,
+	0x000006f0, 0x000006f9, 0x000007c0, 0x000007c9,
+	0x00000966, 0x0000096f, 0x000009e6, 0x000009ef,
+	0x00000a66, 0x00000a6f, 0x00000ae6, 0x00000aef,
+	0x00000b66, 0x00000b6f, 0x00000be6, 0x00000bef,
+	0x00000c66, 0x00000c6f, 0x00000ce6, 0x00000cef,
+	0x00000d66, 0x00000d6f, 0x00000de6, 0x00000def,
+	0x00000e50, 0x00000e59, 0x00000ed0, 0x00000ed9,
+	0x00000f20, 0x00000f29, 0x00001040, 0x00001049,
+	0x00001090, 0x00001099, 0x000017e0, 0x000017e9,
+	0x00001810, 0x00001819, 0x00001946, 0x0000194f,
+	0x000019d0, 0x000019d9, 0x00001a80, 0x00001a89,
+	0x00001a90, 0x00001a99, 0x00001b50, 0x00001b59,
+	0x00001bb0, 0x00001bb9, 0x00001c40, 0x00001c49,
+	0x00001c50, 0x00001c59, 0x0000a620, 0x0000a629,
+	0x0000a8d0, 0x0000a8d9, 0x0000a900, 0x0000a909,
+	0x0000a9d0, 0x0000a9d9, 0x0000a9f0, 0x0000a9f9,
+	0x0000aa50, 0x0000aa59, 0x0000abf0, 0x0000abf9,
+	0x0000ff10, 0x0000ff19, 0x000104a0, 0x000104a9,
+	0x00010d30, 0x00010d39, 0x00010d40, 0x00010d49,
 	0x00011066, 0x0001106f, 0x000110f0, 0x000110f9,
 	0x00011136, 0x0001113f, 0x000111d0, 0x000111d9,
 	0x000112f0, 0x000112f9, 0x00011450, 0x00011459,
 	0x000114d0, 0x000114d9, 0x00011650, 0x00011659,
-	0x000116c0, 0x000116c9, 0x00011730, 0x00011739,
-	0x000118e0, 0x000118e9, 0x00011950, 0x00011959,
+	0x000116c0, 0x000116c9, 0x000116d0, 0x000116e3,
+	0x00011730, 0x00011739, 0x000118e0, 0x000118e9,
+	0x00011950, 0x00011959, 0x00011bf0, 0x00011bf9,
 	0x00011c50, 0x00011c59, 0x00011d50, 0x00011d59,
 	0x00011da0, 0x00011da9, 0x00011f50, 0x00011f59,
-	0x00016a60, 0x00016a69, 0x00016ac0, 0x00016ac9,
-	0x00016b50, 0x00016b59, 0x0001d7ce, 0x0001d7ff,
-	0x0001e140, 0x0001e149, 0x0001e2f0, 0x0001e2f9,
-	0x0001e4f0, 0x0001e4f9, 0x0001e950, 0x0001e959,
+	0x00016130, 0x00016139, 0x00016a60, 0x00016a69,
+	0x00016ac0, 0x00016ac9, 0x00016b50, 0x00016b59,
+	0x00016d70, 0x00016d79, 0x0001ccf0, 0x0001ccf9,
+	0x0001d7ce, 0x0001d7ff, 0x0001e140, 0x0001e149,
+	0x0001e2f0, 0x0001e2f9, 0x0001e4f0, 0x0001e4f9,
+	0x0001e5f1, 0x0001e5fa, 0x0001e950, 0x0001e959,
 	0x0001fbf0, 0x0001fbf9, 0x000016ee, 0x000016f0,
 	0x00002160, 0x00002182, 0x00002185, 0x00002188,
 	0x00003007, 0x00003007, 0x00003021, 0x00003029,
@@ -506,328 +519,331 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0000052e, 0x0000052e, 0x00000531, 0x00000556,
 	0x000010a0, 0x000010c5, 0x000010c7, 0x000010c7,
 	0x000010cd, 0x000010cd, 0x000013a0, 0x000013f5,
-	0x00001c90, 0x00001cba, 0x00001cbd, 0x00001cbf,
-	0x00001e00, 0x00001e00, 0x00001e02, 0x00001e02,
-	0x00001e04, 0x00001e04, 0x00001e06, 0x00001e06,
-	0x00001e08, 0x00001e08, 0x00001e0a, 0x00001e0a,
-	0x00001e0c, 0x00001e0c, 0x00001e0e, 0x00001e0e,
-	0x00001e10, 0x00001e10, 0x00001e12, 0x00001e12,
-	0x00001e14, 0x00001e14, 0x00001e16, 0x00001e16,
-	0x00001e18, 0x00001e18, 0x00001e1a, 0x00001e1a,
-	0x00001e1c, 0x00001e1c, 0x00001e1e, 0x00001e1e,
-	0x00001e20, 0x00001e20, 0x00001e22, 0x00001e22,
-	0x00001e24, 0x00001e24, 0x00001e26, 0x00001e26,
-	0x00001e28, 0x00001e28, 0x00001e2a, 0x00001e2a,
-	0x00001e2c, 0x00001e2c, 0x00001e2e, 0x00001e2e,
-	0x00001e30, 0x00001e30, 0x00001e32, 0x00001e32,
-	0x00001e34, 0x00001e34, 0x00001e36, 0x00001e36,
-	0x00001e38, 0x00001e38, 0x00001e3a, 0x00001e3a,
-	0x00001e3c, 0x00001e3c, 0x00001e3e, 0x00001e3e,
-	0x00001e40, 0x00001e40, 0x00001e42, 0x00001e42,
-	0x00001e44, 0x00001e44, 0x00001e46, 0x00001e46,
-	0x00001e48, 0x00001e48, 0x00001e4a, 0x00001e4a,
-	0x00001e4c, 0x00001e4c, 0x00001e4e, 0x00001e4e,
-	0x00001e50, 0x00001e50, 0x00001e52, 0x00001e52,
-	0x00001e54, 0x00001e54, 0x00001e56, 0x00001e56,
-	0x00001e58, 0x00001e58, 0x00001e5a, 0x00001e5a,
-	0x00001e5c, 0x00001e5c, 0x00001e5e, 0x00001e5e,
-	0x00001e60, 0x00001e60, 0x00001e62, 0x00001e62,
-	0x00001e64, 0x00001e64, 0x00001e66, 0x00001e66,
-	0x00001e68, 0x00001e68, 0x00001e6a, 0x00001e6a,
-	0x00001e6c, 0x00001e6c, 0x00001e6e, 0x00001e6e,
-	0x00001e70, 0x00001e70, 0x00001e72, 0x00001e72,
-	0x00001e74, 0x00001e74, 0x00001e76, 0x00001e76,
-	0x00001e78, 0x00001e78, 0x00001e7a, 0x00001e7a,
-	0x00001e7c, 0x00001e7c, 0x00001e7e, 0x00001e7e,
-	0x00001e80, 0x00001e80, 0x00001e82, 0x00001e82,
-	0x00001e84, 0x00001e84, 0x00001e86, 0x00001e86,
-	0x00001e88, 0x00001e88, 0x00001e8a, 0x00001e8a,
-	0x00001e8c, 0x00001e8c, 0x00001e8e, 0x00001e8e,
-	0x00001e90, 0x00001e90, 0x00001e92, 0x00001e92,
-	0x00001e94, 0x00001e94, 0x00001e9e, 0x00001e9e,
-	0x00001ea0, 0x00001ea0, 0x00001ea2, 0x00001ea2,
-	0x00001ea4, 0x00001ea4, 0x00001ea6, 0x00001ea6,
-	0x00001ea8, 0x00001ea8, 0x00001eaa, 0x00001eaa,
-	0x00001eac, 0x00001eac, 0x00001eae, 0x00001eae,
-	0x00001eb0, 0x00001eb0, 0x00001eb2, 0x00001eb2,
-	0x00001eb4, 0x00001eb4, 0x00001eb6, 0x00001eb6,
-	0x00001eb8, 0x00001eb8, 0x00001eba, 0x00001eba,
-	0x00001ebc, 0x00001ebc, 0x00001ebe, 0x00001ebe,
-	0x00001ec0, 0x00001ec0, 0x00001ec2, 0x00001ec2,
-	0x00001ec4, 0x00001ec4, 0x00001ec6, 0x00001ec6,
-	0x00001ec8, 0x00001ec8, 0x00001eca, 0x00001eca,
-	0x00001ecc, 0x00001ecc, 0x00001ece, 0x00001ece,
-	0x00001ed0, 0x00001ed0, 0x00001ed2, 0x00001ed2,
-	0x00001ed4, 0x00001ed4, 0x00001ed6, 0x00001ed6,
-	0x00001ed8, 0x00001ed8, 0x00001eda, 0x00001eda,
-	0x00001edc, 0x00001edc, 0x00001ede, 0x00001ede,
-	0x00001ee0, 0x00001ee0, 0x00001ee2, 0x00001ee2,
-	0x00001ee4, 0x00001ee4, 0x00001ee6, 0x00001ee6,
-	0x00001ee8, 0x00001ee8, 0x00001eea, 0x00001eea,
-	0x00001eec, 0x00001eec, 0x00001eee, 0x00001eee,
-	0x00001ef0, 0x00001ef0, 0x00001ef2, 0x00001ef2,
-	0x00001ef4, 0x00001ef4, 0x00001ef6, 0x00001ef6,
-	0x00001ef8, 0x00001ef8, 0x00001efa, 0x00001efa,
-	0x00001efc, 0x00001efc, 0x00001efe, 0x00001efe,
-	0x00001f08, 0x00001f0f, 0x00001f18, 0x00001f1d,
-	0x00001f28, 0x00001f2f, 0x00001f38, 0x00001f3f,
-	0x00001f48, 0x00001f4d, 0x00001f59, 0x00001f59,
-	0x00001f5b, 0x00001f5b, 0x00001f5d, 0x00001f5d,
-	0x00001f5f, 0x00001f5f, 0x00001f68, 0x00001f6f,
-	0x00001fb8, 0x00001fbb, 0x00001fc8, 0x00001fcb,
-	0x00001fd8, 0x00001fdb, 0x00001fe8, 0x00001fec,
-	0x00001ff8, 0x00001ffb, 0x00002102, 0x00002102,
-	0x00002107, 0x00002107, 0x0000210b, 0x0000210d,
-	0x00002110, 0x00002112, 0x00002115, 0x00002115,
-	0x00002119, 0x0000211d, 0x00002124, 0x00002124,
-	0x00002126, 0x00002126, 0x00002128, 0x00002128,
-	0x0000212a, 0x0000212d, 0x00002130, 0x00002133,
-	0x0000213e, 0x0000213f, 0x00002145, 0x00002145,
-	0x00002183, 0x00002183, 0x00002c00, 0x00002c2f,
-	0x00002c60, 0x00002c60, 0x00002c62, 0x00002c64,
-	0x00002c67, 0x00002c67, 0x00002c69, 0x00002c69,
-	0x00002c6b, 0x00002c6b, 0x00002c6d, 0x00002c70,
-	0x00002c72, 0x00002c72, 0x00002c75, 0x00002c75,
-	0x00002c7e, 0x00002c80, 0x00002c82, 0x00002c82,
-	0x00002c84, 0x00002c84, 0x00002c86, 0x00002c86,
-	0x00002c88, 0x00002c88, 0x00002c8a, 0x00002c8a,
-	0x00002c8c, 0x00002c8c, 0x00002c8e, 0x00002c8e,
-	0x00002c90, 0x00002c90, 0x00002c92, 0x00002c92,
-	0x00002c94, 0x00002c94, 0x00002c96, 0x00002c96,
-	0x00002c98, 0x00002c98, 0x00002c9a, 0x00002c9a,
-	0x00002c9c, 0x00002c9c, 0x00002c9e, 0x00002c9e,
-	0x00002ca0, 0x00002ca0, 0x00002ca2, 0x00002ca2,
-	0x00002ca4, 0x00002ca4, 0x00002ca6, 0x00002ca6,
-	0x00002ca8, 0x00002ca8, 0x00002caa, 0x00002caa,
-	0x00002cac, 0x00002cac, 0x00002cae, 0x00002cae,
-	0x00002cb0, 0x00002cb0, 0x00002cb2, 0x00002cb2,
-	0x00002cb4, 0x00002cb4, 0x00002cb6, 0x00002cb6,
-	0x00002cb8, 0x00002cb8, 0x00002cba, 0x00002cba,
-	0x00002cbc, 0x00002cbc, 0x00002cbe, 0x00002cbe,
-	0x00002cc0, 0x00002cc0, 0x00002cc2, 0x00002cc2,
-	0x00002cc4, 0x00002cc4, 0x00002cc6, 0x00002cc6,
-	0x00002cc8, 0x00002cc8, 0x00002cca, 0x00002cca,
-	0x00002ccc, 0x00002ccc, 0x00002cce, 0x00002cce,
-	0x00002cd0, 0x00002cd0, 0x00002cd2, 0x00002cd2,
-	0x00002cd4, 0x00002cd4, 0x00002cd6, 0x00002cd6,
-	0x00002cd8, 0x00002cd8, 0x00002cda, 0x00002cda,
-	0x00002cdc, 0x00002cdc, 0x00002cde, 0x00002cde,
-	0x00002ce0, 0x00002ce0, 0x00002ce2, 0x00002ce2,
-	0x00002ceb, 0x00002ceb, 0x00002ced, 0x00002ced,
-	0x00002cf2, 0x00002cf2, 0x0000a640, 0x0000a640,
-	0x0000a642, 0x0000a642, 0x0000a644, 0x0000a644,
-	0x0000a646, 0x0000a646, 0x0000a648, 0x0000a648,
-	0x0000a64a, 0x0000a64a, 0x0000a64c, 0x0000a64c,
-	0x0000a64e, 0x0000a64e, 0x0000a650, 0x0000a650,
-	0x0000a652, 0x0000a652, 0x0000a654, 0x0000a654,
-	0x0000a656, 0x0000a656, 0x0000a658, 0x0000a658,
-	0x0000a65a, 0x0000a65a, 0x0000a65c, 0x0000a65c,
-	0x0000a65e, 0x0000a65e, 0x0000a660, 0x0000a660,
-	0x0000a662, 0x0000a662, 0x0000a664, 0x0000a664,
-	0x0000a666, 0x0000a666, 0x0000a668, 0x0000a668,
-	0x0000a66a, 0x0000a66a, 0x0000a66c, 0x0000a66c,
-	0x0000a680, 0x0000a680, 0x0000a682, 0x0000a682,
-	0x0000a684, 0x0000a684, 0x0000a686, 0x0000a686,
-	0x0000a688, 0x0000a688, 0x0000a68a, 0x0000a68a,
-	0x0000a68c, 0x0000a68c, 0x0000a68e, 0x0000a68e,
-	0x0000a690, 0x0000a690, 0x0000a692, 0x0000a692,
-	0x0000a694, 0x0000a694, 0x0000a696, 0x0000a696,
-	0x0000a698, 0x0000a698, 0x0000a69a, 0x0000a69a,
-	0x0000a722, 0x0000a722, 0x0000a724, 0x0000a724,
-	0x0000a726, 0x0000a726, 0x0000a728, 0x0000a728,
-	0x0000a72a, 0x0000a72a, 0x0000a72c, 0x0000a72c,
-	0x0000a72e, 0x0000a72e, 0x0000a732, 0x0000a732,
-	0x0000a734, 0x0000a734, 0x0000a736, 0x0000a736,
-	0x0000a738, 0x0000a738, 0x0000a73a, 0x0000a73a,
-	0x0000a73c, 0x0000a73c, 0x0000a73e, 0x0000a73e,
-	0x0000a740, 0x0000a740, 0x0000a742, 0x0000a742,
-	0x0000a744, 0x0000a744, 0x0000a746, 0x0000a746,
-	0x0000a748, 0x0000a748, 0x0000a74a, 0x0000a74a,
-	0x0000a74c, 0x0000a74c, 0x0000a74e, 0x0000a74e,
-	0x0000a750, 0x0000a750, 0x0000a752, 0x0000a752,
-	0x0000a754, 0x0000a754, 0x0000a756, 0x0000a756,
-	0x0000a758, 0x0000a758, 0x0000a75a, 0x0000a75a,
-	0x0000a75c, 0x0000a75c, 0x0000a75e, 0x0000a75e,
-	0x0000a760, 0x0000a760, 0x0000a762, 0x0000a762,
-	0x0000a764, 0x0000a764, 0x0000a766, 0x0000a766,
-	0x0000a768, 0x0000a768, 0x0000a76a, 0x0000a76a,
-	0x0000a76c, 0x0000a76c, 0x0000a76e, 0x0000a76e,
-	0x0000a779, 0x0000a779, 0x0000a77b, 0x0000a77b,
-	0x0000a77d, 0x0000a77e, 0x0000a780, 0x0000a780,
-	0x0000a782, 0x0000a782, 0x0000a784, 0x0000a784,
-	0x0000a786, 0x0000a786, 0x0000a78b, 0x0000a78b,
-	0x0000a78d, 0x0000a78d, 0x0000a790, 0x0000a790,
-	0x0000a792, 0x0000a792, 0x0000a796, 0x0000a796,
-	0x0000a798, 0x0000a798, 0x0000a79a, 0x0000a79a,
-	0x0000a79c, 0x0000a79c, 0x0000a79e, 0x0000a79e,
-	0x0000a7a0, 0x0000a7a0, 0x0000a7a2, 0x0000a7a2,
-	0x0000a7a4, 0x0000a7a4, 0x0000a7a6, 0x0000a7a6,
-	0x0000a7a8, 0x0000a7a8, 0x0000a7aa, 0x0000a7ae,
-	0x0000a7b0, 0x0000a7b4, 0x0000a7b6, 0x0000a7b6,
-	0x0000a7b8, 0x0000a7b8, 0x0000a7ba, 0x0000a7ba,
-	0x0000a7bc, 0x0000a7bc, 0x0000a7be, 0x0000a7be,
-	0x0000a7c0, 0x0000a7c0, 0x0000a7c2, 0x0000a7c2,
-	0x0000a7c4, 0x0000a7c7, 0x0000a7c9, 0x0000a7c9,
+	0x00001c89, 0x00001c89, 0x00001c90, 0x00001cba,
+	0x00001cbd, 0x00001cbf, 0x00001e00, 0x00001e00,
+	0x00001e02, 0x00001e02, 0x00001e04, 0x00001e04,
+	0x00001e06, 0x00001e06, 0x00001e08, 0x00001e08,
+	0x00001e0a, 0x00001e0a, 0x00001e0c, 0x00001e0c,
+	0x00001e0e, 0x00001e0e, 0x00001e10, 0x00001e10,
+	0x00001e12, 0x00001e12, 0x00001e14, 0x00001e14,
+	0x00001e16, 0x00001e16, 0x00001e18, 0x00001e18,
+	0x00001e1a, 0x00001e1a, 0x00001e1c, 0x00001e1c,
+	0x00001e1e, 0x00001e1e, 0x00001e20, 0x00001e20,
+	0x00001e22, 0x00001e22, 0x00001e24, 0x00001e24,
+	0x00001e26, 0x00001e26, 0x00001e28, 0x00001e28,
+	0x00001e2a, 0x00001e2a, 0x00001e2c, 0x00001e2c,
+	0x00001e2e, 0x00001e2e, 0x00001e30, 0x00001e30,
+	0x00001e32, 0x00001e32, 0x00001e34, 0x00001e34,
+	0x00001e36, 0x00001e36, 0x00001e38, 0x00001e38,
+	0x00001e3a, 0x00001e3a, 0x00001e3c, 0x00001e3c,
+	0x00001e3e, 0x00001e3e, 0x00001e40, 0x00001e40,
+	0x00001e42, 0x00001e42, 0x00001e44, 0x00001e44,
+	0x00001e46, 0x00001e46, 0x00001e48, 0x00001e48,
+	0x00001e4a, 0x00001e4a, 0x00001e4c, 0x00001e4c,
+	0x00001e4e, 0x00001e4e, 0x00001e50, 0x00001e50,
+	0x00001e52, 0x00001e52, 0x00001e54, 0x00001e54,
+	0x00001e56, 0x00001e56, 0x00001e58, 0x00001e58,
+	0x00001e5a, 0x00001e5a, 0x00001e5c, 0x00001e5c,
+	0x00001e5e, 0x00001e5e, 0x00001e60, 0x00001e60,
+	0x00001e62, 0x00001e62, 0x00001e64, 0x00001e64,
+	0x00001e66, 0x00001e66, 0x00001e68, 0x00001e68,
+	0x00001e6a, 0x00001e6a, 0x00001e6c, 0x00001e6c,
+	0x00001e6e, 0x00001e6e, 0x00001e70, 0x00001e70,
+	0x00001e72, 0x00001e72, 0x00001e74, 0x00001e74,
+	0x00001e76, 0x00001e76, 0x00001e78, 0x00001e78,
+	0x00001e7a, 0x00001e7a, 0x00001e7c, 0x00001e7c,
+	0x00001e7e, 0x00001e7e, 0x00001e80, 0x00001e80,
+	0x00001e82, 0x00001e82, 0x00001e84, 0x00001e84,
+	0x00001e86, 0x00001e86, 0x00001e88, 0x00001e88,
+	0x00001e8a, 0x00001e8a, 0x00001e8c, 0x00001e8c,
+	0x00001e8e, 0x00001e8e, 0x00001e90, 0x00001e90,
+	0x00001e92, 0x00001e92, 0x00001e94, 0x00001e94,
+	0x00001e9e, 0x00001e9e, 0x00001ea0, 0x00001ea0,
+	0x00001ea2, 0x00001ea2, 0x00001ea4, 0x00001ea4,
+	0x00001ea6, 0x00001ea6, 0x00001ea8, 0x00001ea8,
+	0x00001eaa, 0x00001eaa, 0x00001eac, 0x00001eac,
+	0x00001eae, 0x00001eae, 0x00001eb0, 0x00001eb0,
+	0x00001eb2, 0x00001eb2, 0x00001eb4, 0x00001eb4,
+	0x00001eb6, 0x00001eb6, 0x00001eb8, 0x00001eb8,
+	0x00001eba, 0x00001eba, 0x00001ebc, 0x00001ebc,
+	0x00001ebe, 0x00001ebe, 0x00001ec0, 0x00001ec0,
+	0x00001ec2, 0x00001ec2, 0x00001ec4, 0x00001ec4,
+	0x00001ec6, 0x00001ec6, 0x00001ec8, 0x00001ec8,
+	0x00001eca, 0x00001eca, 0x00001ecc, 0x00001ecc,
+	0x00001ece, 0x00001ece, 0x00001ed0, 0x00001ed0,
+	0x00001ed2, 0x00001ed2, 0x00001ed4, 0x00001ed4,
+	0x00001ed6, 0x00001ed6, 0x00001ed8, 0x00001ed8,
+	0x00001eda, 0x00001eda, 0x00001edc, 0x00001edc,
+	0x00001ede, 0x00001ede, 0x00001ee0, 0x00001ee0,
+	0x00001ee2, 0x00001ee2, 0x00001ee4, 0x00001ee4,
+	0x00001ee6, 0x00001ee6, 0x00001ee8, 0x00001ee8,
+	0x00001eea, 0x00001eea, 0x00001eec, 0x00001eec,
+	0x00001eee, 0x00001eee, 0x00001ef0, 0x00001ef0,
+	0x00001ef2, 0x00001ef2, 0x00001ef4, 0x00001ef4,
+	0x00001ef6, 0x00001ef6, 0x00001ef8, 0x00001ef8,
+	0x00001efa, 0x00001efa, 0x00001efc, 0x00001efc,
+	0x00001efe, 0x00001efe, 0x00001f08, 0x00001f0f,
+	0x00001f18, 0x00001f1d, 0x00001f28, 0x00001f2f,
+	0x00001f38, 0x00001f3f, 0x00001f48, 0x00001f4d,
+	0x00001f59, 0x00001f59, 0x00001f5b, 0x00001f5b,
+	0x00001f5d, 0x00001f5d, 0x00001f5f, 0x00001f5f,
+	0x00001f68, 0x00001f6f, 0x00001fb8, 0x00001fbb,
+	0x00001fc8, 0x00001fcb, 0x00001fd8, 0x00001fdb,
+	0x00001fe8, 0x00001fec, 0x00001ff8, 0x00001ffb,
+	0x00002102, 0x00002102, 0x00002107, 0x00002107,
+	0x0000210b, 0x0000210d, 0x00002110, 0x00002112,
+	0x00002115, 0x00002115, 0x00002119, 0x0000211d,
+	0x00002124, 0x00002124, 0x00002126, 0x00002126,
+	0x00002128, 0x00002128, 0x0000212a, 0x0000212d,
+	0x00002130, 0x00002133, 0x0000213e, 0x0000213f,
+	0x00002145, 0x00002145, 0x00002183, 0x00002183,
+	0x00002c00, 0x00002c2f, 0x00002c60, 0x00002c60,
+	0x00002c62, 0x00002c64, 0x00002c67, 0x00002c67,
+	0x00002c69, 0x00002c69, 0x00002c6b, 0x00002c6b,
+	0x00002c6d, 0x00002c70, 0x00002c72, 0x00002c72,
+	0x00002c75, 0x00002c75, 0x00002c7e, 0x00002c80,
+	0x00002c82, 0x00002c82, 0x00002c84, 0x00002c84,
+	0x00002c86, 0x00002c86, 0x00002c88, 0x00002c88,
+	0x00002c8a, 0x00002c8a, 0x00002c8c, 0x00002c8c,
+	0x00002c8e, 0x00002c8e, 0x00002c90, 0x00002c90,
+	0x00002c92, 0x00002c92, 0x00002c94, 0x00002c94,
+	0x00002c96, 0x00002c96, 0x00002c98, 0x00002c98,
+	0x00002c9a, 0x00002c9a, 0x00002c9c, 0x00002c9c,
+	0x00002c9e, 0x00002c9e, 0x00002ca0, 0x00002ca0,
+	0x00002ca2, 0x00002ca2, 0x00002ca4, 0x00002ca4,
+	0x00002ca6, 0x00002ca6, 0x00002ca8, 0x00002ca8,
+	0x00002caa, 0x00002caa, 0x00002cac, 0x00002cac,
+	0x00002cae, 0x00002cae, 0x00002cb0, 0x00002cb0,
+	0x00002cb2, 0x00002cb2, 0x00002cb4, 0x00002cb4,
+	0x00002cb6, 0x00002cb6, 0x00002cb8, 0x00002cb8,
+	0x00002cba, 0x00002cba, 0x00002cbc, 0x00002cbc,
+	0x00002cbe, 0x00002cbe, 0x00002cc0, 0x00002cc0,
+	0x00002cc2, 0x00002cc2, 0x00002cc4, 0x00002cc4,
+	0x00002cc6, 0x00002cc6, 0x00002cc8, 0x00002cc8,
+	0x00002cca, 0x00002cca, 0x00002ccc, 0x00002ccc,
+	0x00002cce, 0x00002cce, 0x00002cd0, 0x00002cd0,
+	0x00002cd2, 0x00002cd2, 0x00002cd4, 0x00002cd4,
+	0x00002cd6, 0x00002cd6, 0x00002cd8, 0x00002cd8,
+	0x00002cda, 0x00002cda, 0x00002cdc, 0x00002cdc,
+	0x00002cde, 0x00002cde, 0x00002ce0, 0x00002ce0,
+	0x00002ce2, 0x00002ce2, 0x00002ceb, 0x00002ceb,
+	0x00002ced, 0x00002ced, 0x00002cf2, 0x00002cf2,
+	0x0000a640, 0x0000a640, 0x0000a642, 0x0000a642,
+	0x0000a644, 0x0000a644, 0x0000a646, 0x0000a646,
+	0x0000a648, 0x0000a648, 0x0000a64a, 0x0000a64a,
+	0x0000a64c, 0x0000a64c, 0x0000a64e, 0x0000a64e,
+	0x0000a650, 0x0000a650, 0x0000a652, 0x0000a652,
+	0x0000a654, 0x0000a654, 0x0000a656, 0x0000a656,
+	0x0000a658, 0x0000a658, 0x0000a65a, 0x0000a65a,
+	0x0000a65c, 0x0000a65c, 0x0000a65e, 0x0000a65e,
+	0x0000a660, 0x0000a660, 0x0000a662, 0x0000a662,
+	0x0000a664, 0x0000a664, 0x0000a666, 0x0000a666,
+	0x0000a668, 0x0000a668, 0x0000a66a, 0x0000a66a,
+	0x0000a66c, 0x0000a66c, 0x0000a680, 0x0000a680,
+	0x0000a682, 0x0000a682, 0x0000a684, 0x0000a684,
+	0x0000a686, 0x0000a686, 0x0000a688, 0x0000a688,
+	0x0000a68a, 0x0000a68a, 0x0000a68c, 0x0000a68c,
+	0x0000a68e, 0x0000a68e, 0x0000a690, 0x0000a690,
+	0x0000a692, 0x0000a692, 0x0000a694, 0x0000a694,
+	0x0000a696, 0x0000a696, 0x0000a698, 0x0000a698,
+	0x0000a69a, 0x0000a69a, 0x0000a722, 0x0000a722,
+	0x0000a724, 0x0000a724, 0x0000a726, 0x0000a726,
+	0x0000a728, 0x0000a728, 0x0000a72a, 0x0000a72a,
+	0x0000a72c, 0x0000a72c, 0x0000a72e, 0x0000a72e,
+	0x0000a732, 0x0000a732, 0x0000a734, 0x0000a734,
+	0x0000a736, 0x0000a736, 0x0000a738, 0x0000a738,
+	0x0000a73a, 0x0000a73a, 0x0000a73c, 0x0000a73c,
+	0x0000a73e, 0x0000a73e, 0x0000a740, 0x0000a740,
+	0x0000a742, 0x0000a742, 0x0000a744, 0x0000a744,
+	0x0000a746, 0x0000a746, 0x0000a748, 0x0000a748,
+	0x0000a74a, 0x0000a74a, 0x0000a74c, 0x0000a74c,
+	0x0000a74e, 0x0000a74e, 0x0000a750, 0x0000a750,
+	0x0000a752, 0x0000a752, 0x0000a754, 0x0000a754,
+	0x0000a756, 0x0000a756, 0x0000a758, 0x0000a758,
+	0x0000a75a, 0x0000a75a, 0x0000a75c, 0x0000a75c,
+	0x0000a75e, 0x0000a75e, 0x0000a760, 0x0000a760,
+	0x0000a762, 0x0000a762, 0x0000a764, 0x0000a764,
+	0x0000a766, 0x0000a766, 0x0000a768, 0x0000a768,
+	0x0000a76a, 0x0000a76a, 0x0000a76c, 0x0000a76c,
+	0x0000a76e, 0x0000a76e, 0x0000a779, 0x0000a779,
+	0x0000a77b, 0x0000a77b, 0x0000a77d, 0x0000a77e,
+	0x0000a780, 0x0000a780, 0x0000a782, 0x0000a782,
+	0x0000a784, 0x0000a784, 0x0000a786, 0x0000a786,
+	0x0000a78b, 0x0000a78b, 0x0000a78d, 0x0000a78d,
+	0x0000a790, 0x0000a790, 0x0000a792, 0x0000a792,
+	0x0000a796, 0x0000a796, 0x0000a798, 0x0000a798,
+	0x0000a79a, 0x0000a79a, 0x0000a79c, 0x0000a79c,
+	0x0000a79e, 0x0000a79e, 0x0000a7a0, 0x0000a7a0,
+	0x0000a7a2, 0x0000a7a2, 0x0000a7a4, 0x0000a7a4,
+	0x0000a7a6, 0x0000a7a6, 0x0000a7a8, 0x0000a7a8,
+	0x0000a7aa, 0x0000a7ae, 0x0000a7b0, 0x0000a7b4,
+	0x0000a7b6, 0x0000a7b6, 0x0000a7b8, 0x0000a7b8,
+	0x0000a7ba, 0x0000a7ba, 0x0000a7bc, 0x0000a7bc,
+	0x0000a7be, 0x0000a7be, 0x0000a7c0, 0x0000a7c0,
+	0x0000a7c2, 0x0000a7c2, 0x0000a7c4, 0x0000a7c7,
+	0x0000a7c9, 0x0000a7c9, 0x0000a7cb, 0x0000a7cc,
 	0x0000a7d0, 0x0000a7d0, 0x0000a7d6, 0x0000a7d6,
-	0x0000a7d8, 0x0000a7d8, 0x0000a7f5, 0x0000a7f5,
+	0x0000a7d8, 0x0000a7d8, 0x0000a7da, 0x0000a7da,
+	0x0000a7dc, 0x0000a7dc, 0x0000a7f5, 0x0000a7f5,
 	0x0000ff21, 0x0000ff3a, 0x00010400, 0x00010427,
 	0x000104b0, 0x000104d3, 0x00010570, 0x0001057a,
 	0x0001057c, 0x0001058a, 0x0001058c, 0x00010592,
 	0x00010594, 0x00010595, 0x00010c80, 0x00010cb2,
-	0x000118a0, 0x000118bf, 0x00016e40, 0x00016e5f,
-	0x0001d400, 0x0001d419, 0x0001d434, 0x0001d44d,
-	0x0001d468, 0x0001d481, 0x0001d49c, 0x0001d49c,
-	0x0001d49e, 0x0001d49f, 0x0001d4a2, 0x0001d4a2,
-	0x0001d4a5, 0x0001d4a6, 0x0001d4a9, 0x0001d4ac,
-	0x0001d4ae, 0x0001d4b5, 0x0001d4d0, 0x0001d4e9,
-	0x0001d504, 0x0001d505, 0x0001d507, 0x0001d50a,
-	0x0001d50d, 0x0001d514, 0x0001d516, 0x0001d51c,
-	0x0001d538, 0x0001d539, 0x0001d53b, 0x0001d53e,
-	0x0001d540, 0x0001d544, 0x0001d546, 0x0001d546,
-	0x0001d54a, 0x0001d550, 0x0001d56c, 0x0001d585,
-	0x0001d5a0, 0x0001d5b9, 0x0001d5d4, 0x0001d5ed,
-	0x0001d608, 0x0001d621, 0x0001d63c, 0x0001d655,
-	0x0001d670, 0x0001d689, 0x0001d6a8, 0x0001d6c0,
-	0x0001d6e2, 0x0001d6fa, 0x0001d71c, 0x0001d734,
-	0x0001d756, 0x0001d76e, 0x0001d790, 0x0001d7a8,
-	0x0001d7ca, 0x0001d7ca, 0x0001e900, 0x0001e921,
-	0x00000061, 0x0000007a, 0x000000b5, 0x000000b5,
-	0x000000df, 0x000000f6, 0x000000f8, 0x000000ff,
-	0x00000101, 0x00000101, 0x00000103, 0x00000103,
-	0x00000105, 0x00000105, 0x00000107, 0x00000107,
-	0x00000109, 0x00000109, 0x0000010b, 0x0000010b,
-	0x0000010d, 0x0000010d, 0x0000010f, 0x0000010f,
-	0x00000111, 0x00000111, 0x00000113, 0x00000113,
-	0x00000115, 0x00000115, 0x00000117, 0x00000117,
-	0x00000119, 0x00000119, 0x0000011b, 0x0000011b,
-	0x0000011d, 0x0000011d, 0x0000011f, 0x0000011f,
-	0x00000121, 0x00000121, 0x00000123, 0x00000123,
-	0x00000125, 0x00000125, 0x00000127, 0x00000127,
-	0x00000129, 0x00000129, 0x0000012b, 0x0000012b,
-	0x0000012d, 0x0000012d, 0x0000012f, 0x0000012f,
-	0x00000131, 0x00000131, 0x00000133, 0x00000133,
-	0x00000135, 0x00000135, 0x00000137, 0x00000138,
-	0x0000013a, 0x0000013a, 0x0000013c, 0x0000013c,
-	0x0000013e, 0x0000013e, 0x00000140, 0x00000140,
-	0x00000142, 0x00000142, 0x00000144, 0x00000144,
-	0x00000146, 0x00000146, 0x00000148, 0x00000149,
-	0x0000014b, 0x0000014b, 0x0000014d, 0x0000014d,
-	0x0000014f, 0x0000014f, 0x00000151, 0x00000151,
-	0x00000153, 0x00000153, 0x00000155, 0x00000155,
-	0x00000157, 0x00000157, 0x00000159, 0x00000159,
-	0x0000015b, 0x0000015b, 0x0000015d, 0x0000015d,
-	0x0000015f, 0x0000015f, 0x00000161, 0x00000161,
-	0x00000163, 0x00000163, 0x00000165, 0x00000165,
-	0x00000167, 0x00000167, 0x00000169, 0x00000169,
-	0x0000016b, 0x0000016b, 0x0000016d, 0x0000016d,
-	0x0000016f, 0x0000016f, 0x00000171, 0x00000171,
-	0x00000173, 0x00000173, 0x00000175, 0x00000175,
-	0x00000177, 0x00000177, 0x0000017a, 0x0000017a,
-	0x0000017c, 0x0000017c, 0x0000017e, 0x00000180,
-	0x00000183, 0x00000183, 0x00000185, 0x00000185,
-	0x00000188, 0x00000188, 0x0000018c, 0x0000018d,
-	0x00000192, 0x00000192, 0x00000195, 0x00000195,
-	0x00000199, 0x0000019b, 0x0000019e, 0x0000019e,
-	0x000001a1, 0x000001a1, 0x000001a3, 0x000001a3,
-	0x000001a5, 0x000001a5, 0x000001a8, 0x000001a8,
-	0x000001aa, 0x000001ab, 0x000001ad, 0x000001ad,
-	0x000001b0, 0x000001b0, 0x000001b4, 0x000001b4,
-	0x000001b6, 0x000001b6, 0x000001b9, 0x000001ba,
-	0x000001bd, 0x000001bf, 0x000001c6, 0x000001c6,
-	0x000001c9, 0x000001c9, 0x000001cc, 0x000001cc,
-	0x000001ce, 0x000001ce, 0x000001d0, 0x000001d0,
-	0x000001d2, 0x000001d2, 0x000001d4, 0x000001d4,
-	0x000001d6, 0x000001d6, 0x000001d8, 0x000001d8,
-	0x000001da, 0x000001da, 0x000001dc, 0x000001dd,
-	0x000001df, 0x000001df, 0x000001e1, 0x000001e1,
-	0x000001e3, 0x000001e3, 0x000001e5, 0x000001e5,
-	0x000001e7, 0x000001e7, 0x000001e9, 0x000001e9,
-	0x000001eb, 0x000001eb, 0x000001ed, 0x000001ed,
-	0x000001ef, 0x000001f0, 0x000001f3, 0x000001f3,
-	0x000001f5, 0x000001f5, 0x000001f9, 0x000001f9,
-	0x000001fb, 0x000001fb, 0x000001fd, 0x000001fd,
-	0x000001ff, 0x000001ff, 0x00000201, 0x00000201,
-	0x00000203, 0x00000203, 0x00000205, 0x00000205,
-	0x00000207, 0x00000207, 0x00000209, 0x00000209,
-	0x0000020b, 0x0000020b, 0x0000020d, 0x0000020d,
-	0x0000020f, 0x0000020f, 0x00000211, 0x00000211,
-	0x00000213, 0x00000213, 0x00000215, 0x00000215,
-	0x00000217, 0x00000217, 0x00000219, 0x00000219,
-	0x0000021b, 0x0000021b, 0x0000021d, 0x0000021d,
-	0x0000021f, 0x0000021f, 0x00000221, 0x00000221,
-	0x00000223, 0x00000223, 0x00000225, 0x00000225,
-	0x00000227, 0x00000227, 0x00000229, 0x00000229,
-	0x0000022b, 0x0000022b, 0x0000022d, 0x0000022d,
-	0x0000022f, 0x0000022f, 0x00000231, 0x00000231,
-	0x00000233, 0x00000239, 0x0000023c, 0x0000023c,
-	0x0000023f, 0x00000240, 0x00000242, 0x00000242,
-	0x00000247, 0x00000247, 0x00000249, 0x00000249,
-	0x0000024b, 0x0000024b, 0x0000024d, 0x0000024d,
-	0x0000024f, 0x00000293, 0x00000295, 0x000002af,
-	0x00000371, 0x00000371, 0x00000373, 0x00000373,
-	0x00000377, 0x00000377, 0x0000037b, 0x0000037d,
-	0x00000390, 0x00000390, 0x000003ac, 0x000003ce,
-	0x000003d0, 0x000003d1, 0x000003d5, 0x000003d7,
-	0x000003d9, 0x000003d9, 0x000003db, 0x000003db,
-	0x000003dd, 0x000003dd, 0x000003df, 0x000003df,
-	0x000003e1, 0x000003e1, 0x000003e3, 0x000003e3,
-	0x000003e5, 0x000003e5, 0x000003e7, 0x000003e7,
-	0x000003e9, 0x000003e9, 0x000003eb, 0x000003eb,
-	0x000003ed, 0x000003ed, 0x000003ef, 0x000003f3,
-	0x000003f5, 0x000003f5, 0x000003f8, 0x000003f8,
-	0x000003fb, 0x000003fc, 0x00000430, 0x0000045f,
-	0x00000461, 0x00000461, 0x00000463, 0x00000463,
-	0x00000465, 0x00000465, 0x00000467, 0x00000467,
-	0x00000469, 0x00000469, 0x0000046b, 0x0000046b,
-	0x0000046d, 0x0000046d, 0x0000046f, 0x0000046f,
-	0x00000471, 0x00000471, 0x00000473, 0x00000473,
-	0x00000475, 0x00000475, 0x00000477, 0x00000477,
-	0x00000479, 0x00000479, 0x0000047b, 0x0000047b,
-	0x0000047d, 0x0000047d, 0x0000047f, 0x0000047f,
-	0x00000481, 0x00000481, 0x0000048b, 0x0000048b,
-	0x0000048d, 0x0000048d, 0x0000048f, 0x0000048f,
-	0x00000491, 0x00000491, 0x00000493, 0x00000493,
-	0x00000495, 0x00000495, 0x00000497, 0x00000497,
-	0x00000499, 0x00000499, 0x0000049b, 0x0000049b,
-	0x0000049d, 0x0000049d, 0x0000049f, 0x0000049f,
-	0x000004a1, 0x000004a1, 0x000004a3, 0x000004a3,
-	0x000004a5, 0x000004a5, 0x000004a7, 0x000004a7,
-	0x000004a9, 0x000004a9, 0x000004ab, 0x000004ab,
-	0x000004ad, 0x000004ad, 0x000004af, 0x000004af,
-	0x000004b1, 0x000004b1, 0x000004b3, 0x000004b3,
-	0x000004b5, 0x000004b5, 0x000004b7, 0x000004b7,
-	0x000004b9, 0x000004b9, 0x000004bb, 0x000004bb,
-	0x000004bd, 0x000004bd, 0x000004bf, 0x000004bf,
-	0x000004c2, 0x000004c2, 0x000004c4, 0x000004c4,
-	0x000004c6, 0x000004c6, 0x000004c8, 0x000004c8,
-	0x000004ca, 0x000004ca, 0x000004cc, 0x000004cc,
-	0x000004ce, 0x000004cf, 0x000004d1, 0x000004d1,
-	0x000004d3, 0x000004d3, 0x000004d5, 0x000004d5,
-	0x000004d7, 0x000004d7, 0x000004d9, 0x000004d9,
-	0x000004db, 0x000004db, 0x000004dd, 0x000004dd,
-	0x000004df, 0x000004df, 0x000004e1, 0x000004e1,
-	0x000004e3, 0x000004e3, 0x000004e5, 0x000004e5,
-	0x000004e7, 0x000004e7, 0x000004e9, 0x000004e9,
-	0x000004eb, 0x000004eb, 0x000004ed, 0x000004ed,
-	0x000004ef, 0x000004ef, 0x000004f1, 0x000004f1,
-	0x000004f3, 0x000004f3, 0x000004f5, 0x000004f5,
-	0x000004f7, 0x000004f7, 0x000004f9, 0x000004f9,
-	0x000004fb, 0x000004fb, 0x000004fd, 0x000004fd,
-	0x000004ff, 0x000004ff, 0x00000501, 0x00000501,
-	0x00000503, 0x00000503, 0x00000505, 0x00000505,
-	0x00000507, 0x00000507, 0x00000509, 0x00000509,
-	0x0000050b, 0x0000050b, 0x0000050d, 0x0000050d,
-	0x0000050f, 0x0000050f, 0x00000511, 0x00000511,
-	0x00000513, 0x00000513, 0x00000515, 0x00000515,
-	0x00000517, 0x00000517, 0x00000519, 0x00000519,
-	0x0000051b, 0x0000051b, 0x0000051d, 0x0000051d,
-	0x0000051f, 0x0000051f, 0x00000521, 0x00000521,
-	0x00000523, 0x00000523, 0x00000525, 0x00000525,
-	0x00000527, 0x00000527, 0x00000529, 0x00000529,
-	0x0000052b, 0x0000052b, 0x0000052d, 0x0000052d,
-	0x0000052f, 0x0000052f, 0x00000560, 0x00000588,
-	0x000010d0, 0x000010fa, 0x000010fd, 0x000010ff,
-	0x000013f8, 0x000013fd, 0x00001c80, 0x00001c88,
+	0x00010d50, 0x00010d65, 0x000118a0, 0x000118bf,
+	0x00016e40, 0x00016e5f, 0x0001d400, 0x0001d419,
+	0x0001d434, 0x0001d44d, 0x0001d468, 0x0001d481,
+	0x0001d49c, 0x0001d49c, 0x0001d49e, 0x0001d49f,
+	0x0001d4a2, 0x0001d4a2, 0x0001d4a5, 0x0001d4a6,
+	0x0001d4a9, 0x0001d4ac, 0x0001d4ae, 0x0001d4b5,
+	0x0001d4d0, 0x0001d4e9, 0x0001d504, 0x0001d505,
+	0x0001d507, 0x0001d50a, 0x0001d50d, 0x0001d514,
+	0x0001d516, 0x0001d51c, 0x0001d538, 0x0001d539,
+	0x0001d53b, 0x0001d53e, 0x0001d540, 0x0001d544,
+	0x0001d546, 0x0001d546, 0x0001d54a, 0x0001d550,
+	0x0001d56c, 0x0001d585, 0x0001d5a0, 0x0001d5b9,
+	0x0001d5d4, 0x0001d5ed, 0x0001d608, 0x0001d621,
+	0x0001d63c, 0x0001d655, 0x0001d670, 0x0001d689,
+	0x0001d6a8, 0x0001d6c0, 0x0001d6e2, 0x0001d6fa,
+	0x0001d71c, 0x0001d734, 0x0001d756, 0x0001d76e,
+	0x0001d790, 0x0001d7a8, 0x0001d7ca, 0x0001d7ca,
+	0x0001e900, 0x0001e921, 0x00000061, 0x0000007a,
+	0x000000b5, 0x000000b5, 0x000000df, 0x000000f6,
+	0x000000f8, 0x000000ff, 0x00000101, 0x00000101,
+	0x00000103, 0x00000103, 0x00000105, 0x00000105,
+	0x00000107, 0x00000107, 0x00000109, 0x00000109,
+	0x0000010b, 0x0000010b, 0x0000010d, 0x0000010d,
+	0x0000010f, 0x0000010f, 0x00000111, 0x00000111,
+	0x00000113, 0x00000113, 0x00000115, 0x00000115,
+	0x00000117, 0x00000117, 0x00000119, 0x00000119,
+	0x0000011b, 0x0000011b, 0x0000011d, 0x0000011d,
+	0x0000011f, 0x0000011f, 0x00000121, 0x00000121,
+	0x00000123, 0x00000123, 0x00000125, 0x00000125,
+	0x00000127, 0x00000127, 0x00000129, 0x00000129,
+	0x0000012b, 0x0000012b, 0x0000012d, 0x0000012d,
+	0x0000012f, 0x0000012f, 0x00000131, 0x00000131,
+	0x00000133, 0x00000133, 0x00000135, 0x00000135,
+	0x00000137, 0x00000138, 0x0000013a, 0x0000013a,
+	0x0000013c, 0x0000013c, 0x0000013e, 0x0000013e,
+	0x00000140, 0x00000140, 0x00000142, 0x00000142,
+	0x00000144, 0x00000144, 0x00000146, 0x00000146,
+	0x00000148, 0x00000149, 0x0000014b, 0x0000014b,
+	0x0000014d, 0x0000014d, 0x0000014f, 0x0000014f,
+	0x00000151, 0x00000151, 0x00000153, 0x00000153,
+	0x00000155, 0x00000155, 0x00000157, 0x00000157,
+	0x00000159, 0x00000159, 0x0000015b, 0x0000015b,
+	0x0000015d, 0x0000015d, 0x0000015f, 0x0000015f,
+	0x00000161, 0x00000161, 0x00000163, 0x00000163,
+	0x00000165, 0x00000165, 0x00000167, 0x00000167,
+	0x00000169, 0x00000169, 0x0000016b, 0x0000016b,
+	0x0000016d, 0x0000016d, 0x0000016f, 0x0000016f,
+	0x00000171, 0x00000171, 0x00000173, 0x00000173,
+	0x00000175, 0x00000175, 0x00000177, 0x00000177,
+	0x0000017a, 0x0000017a, 0x0000017c, 0x0000017c,
+	0x0000017e, 0x00000180, 0x00000183, 0x00000183,
+	0x00000185, 0x00000185, 0x00000188, 0x00000188,
+	0x0000018c, 0x0000018d, 0x00000192, 0x00000192,
+	0x00000195, 0x00000195, 0x00000199, 0x0000019b,
+	0x0000019e, 0x0000019e, 0x000001a1, 0x000001a1,
+	0x000001a3, 0x000001a3, 0x000001a5, 0x000001a5,
+	0x000001a8, 0x000001a8, 0x000001aa, 0x000001ab,
+	0x000001ad, 0x000001ad, 0x000001b0, 0x000001b0,
+	0x000001b4, 0x000001b4, 0x000001b6, 0x000001b6,
+	0x000001b9, 0x000001ba, 0x000001bd, 0x000001bf,
+	0x000001c6, 0x000001c6, 0x000001c9, 0x000001c9,
+	0x000001cc, 0x000001cc, 0x000001ce, 0x000001ce,
+	0x000001d0, 0x000001d0, 0x000001d2, 0x000001d2,
+	0x000001d4, 0x000001d4, 0x000001d6, 0x000001d6,
+	0x000001d8, 0x000001d8, 0x000001da, 0x000001da,
+	0x000001dc, 0x000001dd, 0x000001df, 0x000001df,
+	0x000001e1, 0x000001e1, 0x000001e3, 0x000001e3,
+	0x000001e5, 0x000001e5, 0x000001e7, 0x000001e7,
+	0x000001e9, 0x000001e9, 0x000001eb, 0x000001eb,
+	0x000001ed, 0x000001ed, 0x000001ef, 0x000001f0,
+	0x000001f3, 0x000001f3, 0x000001f5, 0x000001f5,
+	0x000001f9, 0x000001f9, 0x000001fb, 0x000001fb,
+	0x000001fd, 0x000001fd, 0x000001ff, 0x000001ff,
+	0x00000201, 0x00000201, 0x00000203, 0x00000203,
+	0x00000205, 0x00000205, 0x00000207, 0x00000207,
+	0x00000209, 0x00000209, 0x0000020b, 0x0000020b,
+	0x0000020d, 0x0000020d, 0x0000020f, 0x0000020f,
+	0x00000211, 0x00000211, 0x00000213, 0x00000213,
+	0x00000215, 0x00000215, 0x00000217, 0x00000217,
+	0x00000219, 0x00000219, 0x0000021b, 0x0000021b,
+	0x0000021d, 0x0000021d, 0x0000021f, 0x0000021f,
+	0x00000221, 0x00000221, 0x00000223, 0x00000223,
+	0x00000225, 0x00000225, 0x00000227, 0x00000227,
+	0x00000229, 0x00000229, 0x0000022b, 0x0000022b,
+	0x0000022d, 0x0000022d, 0x0000022f, 0x0000022f,
+	0x00000231, 0x00000231, 0x00000233, 0x00000239,
+	0x0000023c, 0x0000023c, 0x0000023f, 0x00000240,
+	0x00000242, 0x00000242, 0x00000247, 0x00000247,
+	0x00000249, 0x00000249, 0x0000024b, 0x0000024b,
+	0x0000024d, 0x0000024d, 0x0000024f, 0x00000293,
+	0x00000295, 0x000002af, 0x00000371, 0x00000371,
+	0x00000373, 0x00000373, 0x00000377, 0x00000377,
+	0x0000037b, 0x0000037d, 0x00000390, 0x00000390,
+	0x000003ac, 0x000003ce, 0x000003d0, 0x000003d1,
+	0x000003d5, 0x000003d7, 0x000003d9, 0x000003d9,
+	0x000003db, 0x000003db, 0x000003dd, 0x000003dd,
+	0x000003df, 0x000003df, 0x000003e1, 0x000003e1,
+	0x000003e3, 0x000003e3, 0x000003e5, 0x000003e5,
+	0x000003e7, 0x000003e7, 0x000003e9, 0x000003e9,
+	0x000003eb, 0x000003eb, 0x000003ed, 0x000003ed,
+	0x000003ef, 0x000003f3, 0x000003f5, 0x000003f5,
+	0x000003f8, 0x000003f8, 0x000003fb, 0x000003fc,
+	0x00000430, 0x0000045f, 0x00000461, 0x00000461,
+	0x00000463, 0x00000463, 0x00000465, 0x00000465,
+	0x00000467, 0x00000467, 0x00000469, 0x00000469,
+	0x0000046b, 0x0000046b, 0x0000046d, 0x0000046d,
+	0x0000046f, 0x0000046f, 0x00000471, 0x00000471,
+	0x00000473, 0x00000473, 0x00000475, 0x00000475,
+	0x00000477, 0x00000477, 0x00000479, 0x00000479,
+	0x0000047b, 0x0000047b, 0x0000047d, 0x0000047d,
+	0x0000047f, 0x0000047f, 0x00000481, 0x00000481,
+	0x0000048b, 0x0000048b, 0x0000048d, 0x0000048d,
+	0x0000048f, 0x0000048f, 0x00000491, 0x00000491,
+	0x00000493, 0x00000493, 0x00000495, 0x00000495,
+	0x00000497, 0x00000497, 0x00000499, 0x00000499,
+	0x0000049b, 0x0000049b, 0x0000049d, 0x0000049d,
+	0x0000049f, 0x0000049f, 0x000004a1, 0x000004a1,
+	0x000004a3, 0x000004a3, 0x000004a5, 0x000004a5,
+	0x000004a7, 0x000004a7, 0x000004a9, 0x000004a9,
+	0x000004ab, 0x000004ab, 0x000004ad, 0x000004ad,
+	0x000004af, 0x000004af, 0x000004b1, 0x000004b1,
+	0x000004b3, 0x000004b3, 0x000004b5, 0x000004b5,
+	0x000004b7, 0x000004b7, 0x000004b9, 0x000004b9,
+	0x000004bb, 0x000004bb, 0x000004bd, 0x000004bd,
+	0x000004bf, 0x000004bf, 0x000004c2, 0x000004c2,
+	0x000004c4, 0x000004c4, 0x000004c6, 0x000004c6,
+	0x000004c8, 0x000004c8, 0x000004ca, 0x000004ca,
+	0x000004cc, 0x000004cc, 0x000004ce, 0x000004cf,
+	0x000004d1, 0x000004d1, 0x000004d3, 0x000004d3,
+	0x000004d5, 0x000004d5, 0x000004d7, 0x000004d7,
+	0x000004d9, 0x000004d9, 0x000004db, 0x000004db,
+	0x000004dd, 0x000004dd, 0x000004df, 0x000004df,
+	0x000004e1, 0x000004e1, 0x000004e3, 0x000004e3,
+	0x000004e5, 0x000004e5, 0x000004e7, 0x000004e7,
+	0x000004e9, 0x000004e9, 0x000004eb, 0x000004eb,
+	0x000004ed, 0x000004ed, 0x000004ef, 0x000004ef,
+	0x000004f1, 0x000004f1, 0x000004f3, 0x000004f3,
+	0x000004f5, 0x000004f5, 0x000004f7, 0x000004f7,
+	0x000004f9, 0x000004f9, 0x000004fb, 0x000004fb,
+	0x000004fd, 0x000004fd, 0x000004ff, 0x000004ff,
+	0x00000501, 0x00000501, 0x00000503, 0x00000503,
+	0x00000505, 0x00000505, 0x00000507, 0x00000507,
+	0x00000509, 0x00000509, 0x0000050b, 0x0000050b,
+	0x0000050d, 0x0000050d, 0x0000050f, 0x0000050f,
+	0x00000511, 0x00000511, 0x00000513, 0x00000513,
+	0x00000515, 0x00000515, 0x00000517, 0x00000517,
+	0x00000519, 0x00000519, 0x0000051b, 0x0000051b,
+	0x0000051d, 0x0000051d, 0x0000051f, 0x0000051f,
+	0x00000521, 0x00000521, 0x00000523, 0x00000523,
+	0x00000525, 0x00000525, 0x00000527, 0x00000527,
+	0x00000529, 0x00000529, 0x0000052b, 0x0000052b,
+	0x0000052d, 0x0000052d, 0x0000052f, 0x0000052f,
+	0x00000560, 0x00000588, 0x000010d0, 0x000010fa,
+	0x000010fd, 0x000010ff, 0x000013f8, 0x000013fd,
+	0x00001c80, 0x00001c88, 0x00001c8a, 0x00001c8a,
 	0x00001d00, 0x00001d2b, 0x00001d6b, 0x00001d77,
 	0x00001d79, 0x00001d9a, 0x00001e01, 0x00001e01,
 	0x00001e03, 0x00001e03, 0x00001e05, 0x00001e05,
@@ -993,9 +1009,10 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0000a7bd, 0x0000a7bd, 0x0000a7bf, 0x0000a7bf,
 	0x0000a7c1, 0x0000a7c1, 0x0000a7c3, 0x0000a7c3,
 	0x0000a7c8, 0x0000a7c8, 0x0000a7ca, 0x0000a7ca,
-	0x0000a7d1, 0x0000a7d1, 0x0000a7d3, 0x0000a7d3,
-	0x0000a7d5, 0x0000a7d5, 0x0000a7d7, 0x0000a7d7,
-	0x0000a7d9, 0x0000a7d9, 0x0000a7f6, 0x0000a7f6,
+	0x0000a7cd, 0x0000a7cd, 0x0000a7d1, 0x0000a7d1,
+	0x0000a7d3, 0x0000a7d3, 0x0000a7d5, 0x0000a7d5,
+	0x0000a7d7, 0x0000a7d7, 0x0000a7d9, 0x0000a7d9,
+	0x0000a7db, 0x0000a7db, 0x0000a7f6, 0x0000a7f6,
 	0x0000a7fa, 0x0000a7fa, 0x0000ab30, 0x0000ab5a,
 	0x0000ab60, 0x0000ab68, 0x0000ab70, 0x0000abbf,
 	0x0000fb00, 0x0000fb06, 0x0000fb13, 0x0000fb17,
@@ -1003,218 +1020,221 @@ static const unsigned int _ucprop_ranges[] = {
 	0x000104d8, 0x000104fb, 0x00010597, 0x000105a1,
 	0x000105a3, 0x000105b1, 0x000105b3, 0x000105b9,
 	0x000105bb, 0x000105bc, 0x00010cc0, 0x00010cf2,
-	0x000118c0, 0x000118df, 0x00016e60, 0x00016e7f,
-	0x0001d41a, 0x0001d433, 0x0001d44e, 0x0001d454,
-	0x0001d456, 0x0001d467, 0x0001d482, 0x0001d49b,
-	0x0001d4b6, 0x0001d4b9, 0x0001d4bb, 0x0001d4bb,
-	0x0001d4bd, 0x0001d4c3, 0x0001d4c5, 0x0001d4cf,
-	0x0001d4ea, 0x0001d503, 0x0001d51e, 0x0001d537,
-	0x0001d552, 0x0001d56b, 0x0001d586, 0x0001d59f,
-	0x0001d5ba, 0x0001d5d3, 0x0001d5ee, 0x0001d607,
-	0x0001d622, 0x0001d63b, 0x0001d656, 0x0001d66f,
-	0x0001d68a, 0x0001d6a5, 0x0001d6c2, 0x0001d6da,
-	0x0001d6dc, 0x0001d6e1, 0x0001d6fc, 0x0001d714,
-	0x0001d716, 0x0001d71b, 0x0001d736, 0x0001d74e,
-	0x0001d750, 0x0001d755, 0x0001d770, 0x0001d788,
-	0x0001d78a, 0x0001d78f, 0x0001d7aa, 0x0001d7c2,
-	0x0001d7c4, 0x0001d7c9, 0x0001d7cb, 0x0001d7cb,
-	0x0001df00, 0x0001df09, 0x0001df0b, 0x0001df1e,
-	0x0001df25, 0x0001df2a, 0x0001e922, 0x0001e943,
-	0x000001c5, 0x000001c5, 0x000001c8, 0x000001c8,
-	0x000001cb, 0x000001cb, 0x000001f2, 0x000001f2,
-	0x00001f88, 0x00001f8f, 0x00001f98, 0x00001f9f,
-	0x00001fa8, 0x00001faf, 0x00001fbc, 0x00001fbc,
-	0x00001fcc, 0x00001fcc, 0x00001ffc, 0x00001ffc,
-	0x000002b0, 0x000002c1, 0x000002c6, 0x000002d1,
-	0x000002e0, 0x000002e4, 0x000002ec, 0x000002ec,
-	0x000002ee, 0x000002ee, 0x00000374, 0x00000374,
-	0x0000037a, 0x0000037a, 0x00000559, 0x00000559,
-	0x00000640, 0x00000640, 0x000006e5, 0x000006e6,
-	0x000007f4, 0x000007f5, 0x000007fa, 0x000007fa,
-	0x0000081a, 0x0000081a, 0x00000824, 0x00000824,
-	0x00000828, 0x00000828, 0x000008c9, 0x000008c9,
-	0x00000971, 0x00000971, 0x00000e46, 0x00000e46,
-	0x00000ec6, 0x00000ec6, 0x000010fc, 0x000010fc,
-	0x000017d7, 0x000017d7, 0x00001843, 0x00001843,
-	0x00001aa7, 0x00001aa7, 0x00001c78, 0x00001c7d,
-	0x00001d2c, 0x00001d6a, 0x00001d78, 0x00001d78,
-	0x00001d9b, 0x00001dbf, 0x00002071, 0x00002071,
-	0x0000207f, 0x0000207f, 0x00002090, 0x0000209c,
-	0x00002c7c, 0x00002c7d, 0x00002d6f, 0x00002d6f,
-	0x00002e2f, 0x00002e2f, 0x00003005, 0x00003005,
-	0x00003031, 0x00003035, 0x0000303b, 0x0000303b,
-	0x0000309d, 0x0000309e, 0x000030fc, 0x000030fe,
-	0x0000a015, 0x0000a015, 0x0000a4f8, 0x0000a4fd,
-	0x0000a60c, 0x0000a60c, 0x0000a67f, 0x0000a67f,
-	0x0000a69c, 0x0000a69d, 0x0000a717, 0x0000a71f,
-	0x0000a770, 0x0000a770, 0x0000a788, 0x0000a788,
-	0x0000a7f2, 0x0000a7f4, 0x0000a7f8, 0x0000a7f9,
-	0x0000a9cf, 0x0000a9cf, 0x0000a9e6, 0x0000a9e6,
-	0x0000aa70, 0x0000aa70, 0x0000aadd, 0x0000aadd,
-	0x0000aaf3, 0x0000aaf4, 0x0000ab5c, 0x0000ab5f,
-	0x0000ab69, 0x0000ab69, 0x0000ff70, 0x0000ff70,
-	0x0000ff9e, 0x0000ff9f, 0x00010780, 0x00010785,
-	0x00010787, 0x000107b0, 0x000107b2, 0x000107ba,
-	0x00016b40, 0x00016b43, 0x00016f93, 0x00016f9f,
-	0x00016fe0, 0x00016fe1, 0x00016fe3, 0x00016fe3,
-	0x0001aff0, 0x0001aff3, 0x0001aff5, 0x0001affb,
-	0x0001affd, 0x0001affe, 0x0001e030, 0x0001e06d,
-	0x0001e137, 0x0001e13d, 0x0001e4eb, 0x0001e4eb,
-	0x0001e94b, 0x0001e94b, 0x000000aa, 0x000000aa,
-	0x000000ba, 0x000000ba, 0x000001bb, 0x000001bb,
-	0x000001c0, 0x000001c3, 0x00000294, 0x00000294,
-	0x000005d0, 0x000005ea, 0x000005ef, 0x000005f2,
-	0x00000620, 0x0000063f, 0x00000641, 0x0000064a,
-	0x0000066e, 0x0000066f, 0x00000671, 0x000006d3,
-	0x000006d5, 0x000006d5, 0x000006ee, 0x000006ef,
-	0x000006fa, 0x000006fc, 0x000006ff, 0x000006ff,
-	0x00000710, 0x00000710, 0x00000712, 0x0000072f,
-	0x0000074d, 0x000007a5, 0x000007b1, 0x000007b1,
-	0x000007ca, 0x000007ea, 0x00000800, 0x00000815,
-	0x00000840, 0x00000858, 0x00000860, 0x0000086a,
-	0x00000870, 0x00000887, 0x00000889, 0x0000088e,
-	0x000008a0, 0x000008c8, 0x00000904, 0x00000939,
-	0x0000093d, 0x0000093d, 0x00000950, 0x00000950,
-	0x00000958, 0x00000961, 0x00000972, 0x00000980,
-	0x00000985, 0x0000098c, 0x0000098f, 0x00000990,
-	0x00000993, 0x000009a8, 0x000009aa, 0x000009b0,
-	0x000009b2, 0x000009b2, 0x000009b6, 0x000009b9,
-	0x000009bd, 0x000009bd, 0x000009ce, 0x000009ce,
-	0x000009dc, 0x000009dd, 0x000009df, 0x000009e1,
-	0x000009f0, 0x000009f1, 0x000009fc, 0x000009fc,
-	0x00000a05, 0x00000a0a, 0x00000a0f, 0x00000a10,
-	0x00000a13, 0x00000a28, 0x00000a2a, 0x00000a30,
-	0x00000a32, 0x00000a33, 0x00000a35, 0x00000a36,
-	0x00000a38, 0x00000a39, 0x00000a59, 0x00000a5c,
-	0x00000a5e, 0x00000a5e, 0x00000a72, 0x00000a74,
-	0x00000a85, 0x00000a8d, 0x00000a8f, 0x00000a91,
-	0x00000a93, 0x00000aa8, 0x00000aaa, 0x00000ab0,
-	0x00000ab2, 0x00000ab3, 0x00000ab5, 0x00000ab9,
-	0x00000abd, 0x00000abd, 0x00000ad0, 0x00000ad0,
-	0x00000ae0, 0x00000ae1, 0x00000af9, 0x00000af9,
-	0x00000b05, 0x00000b0c, 0x00000b0f, 0x00000b10,
-	0x00000b13, 0x00000b28, 0x00000b2a, 0x00000b30,
-	0x00000b32, 0x00000b33, 0x00000b35, 0x00000b39,
-	0x00000b3d, 0x00000b3d, 0x00000b5c, 0x00000b5d,
-	0x00000b5f, 0x00000b61, 0x00000b71, 0x00000b71,
-	0x00000b83, 0x00000b83, 0x00000b85, 0x00000b8a,
-	0x00000b8e, 0x00000b90, 0x00000b92, 0x00000b95,
-	0x00000b99, 0x00000b9a, 0x00000b9c, 0x00000b9c,
-	0x00000b9e, 0x00000b9f, 0x00000ba3, 0x00000ba4,
-	0x00000ba8, 0x00000baa, 0x00000bae, 0x00000bb9,
-	0x00000bd0, 0x00000bd0, 0x00000c05, 0x00000c0c,
-	0x00000c0e, 0x00000c10, 0x00000c12, 0x00000c28,
-	0x00000c2a, 0x00000c39, 0x00000c3d, 0x00000c3d,
-	0x00000c58, 0x00000c5a, 0x00000c5d, 0x00000c5d,
-	0x00000c60, 0x00000c61, 0x00000c80, 0x00000c80,
-	0x00000c85, 0x00000c8c, 0x00000c8e, 0x00000c90,
-	0x00000c92, 0x00000ca8, 0x00000caa, 0x00000cb3,
-	0x00000cb5, 0x00000cb9, 0x00000cbd, 0x00000cbd,
-	0x00000cdd, 0x00000cde, 0x00000ce0, 0x00000ce1,
-	0x00000cf1, 0x00000cf2, 0x00000d04, 0x00000d0c,
-	0x00000d0e, 0x00000d10, 0x00000d12, 0x00000d3a,
-	0x00000d3d, 0x00000d3d, 0x00000d4e, 0x00000d4e,
-	0x00000d54, 0x00000d56, 0x00000d5f, 0x00000d61,
-	0x00000d7a, 0x00000d7f, 0x00000d85, 0x00000d96,
-	0x00000d9a, 0x00000db1, 0x00000db3, 0x00000dbb,
-	0x00000dbd, 0x00000dbd, 0x00000dc0, 0x00000dc6,
-	0x00000e01, 0x00000e30, 0x00000e32, 0x00000e33,
-	0x00000e40, 0x00000e45, 0x00000e81, 0x00000e82,
-	0x00000e84, 0x00000e84, 0x00000e86, 0x00000e8a,
-	0x00000e8c, 0x00000ea3, 0x00000ea5, 0x00000ea5,
-	0x00000ea7, 0x00000eb0, 0x00000eb2, 0x00000eb3,
-	0x00000ebd, 0x00000ebd, 0x00000ec0, 0x00000ec4,
-	0x00000edc, 0x00000edf, 0x00000f00, 0x00000f00,
-	0x00000f40, 0x00000f47, 0x00000f49, 0x00000f6c,
-	0x00000f88, 0x00000f8c, 0x00001000, 0x0000102a,
-	0x0000103f, 0x0000103f, 0x00001050, 0x00001055,
-	0x0000105a, 0x0000105d, 0x00001061, 0x00001061,
-	0x00001065, 0x00001066, 0x0000106e, 0x00001070,
-	0x00001075, 0x00001081, 0x0000108e, 0x0000108e,
-	0x00001100, 0x00001248, 0x0000124a, 0x0000124d,
-	0x00001250, 0x00001256, 0x00001258, 0x00001258,
-	0x0000125a, 0x0000125d, 0x00001260, 0x00001288,
-	0x0000128a, 0x0000128d, 0x00001290, 0x000012b0,
-	0x000012b2, 0x000012b5, 0x000012b8, 0x000012be,
-	0x000012c0, 0x000012c0, 0x000012c2, 0x000012c5,
-	0x000012c8, 0x000012d6, 0x000012d8, 0x00001310,
-	0x00001312, 0x00001315, 0x00001318, 0x0000135a,
-	0x00001380, 0x0000138f, 0x00001401, 0x0000166c,
-	0x0000166f, 0x0000167f, 0x00001681, 0x0000169a,
-	0x000016a0, 0x000016ea, 0x000016f1, 0x000016f8,
-	0x00001700, 0x00001711, 0x0000171f, 0x00001731,
-	0x00001740, 0x00001751, 0x00001760, 0x0000176c,
-	0x0000176e, 0x00001770, 0x00001780, 0x000017b3,
-	0x000017dc, 0x000017dc, 0x00001820, 0x00001842,
-	0x00001844, 0x00001878, 0x00001880, 0x00001884,
-	0x00001887, 0x000018a8, 0x000018aa, 0x000018aa,
-	0x000018b0, 0x000018f5, 0x00001900, 0x0000191e,
-	0x00001950, 0x0000196d, 0x00001970, 0x00001974,
-	0x00001980, 0x000019ab, 0x000019b0, 0x000019c9,
-	0x00001a00, 0x00001a16, 0x00001a20, 0x00001a54,
-	0x00001b05, 0x00001b33, 0x00001b45, 0x00001b4c,
-	0x00001b83, 0x00001ba0, 0x00001bae, 0x00001baf,
-	0x00001bba, 0x00001be5, 0x00001c00, 0x00001c23,
-	0x00001c4d, 0x00001c4f, 0x00001c5a, 0x00001c77,
-	0x00001ce9, 0x00001cec, 0x00001cee, 0x00001cf3,
-	0x00001cf5, 0x00001cf6, 0x00001cfa, 0x00001cfa,
-	0x00002135, 0x00002138, 0x00002d30, 0x00002d67,
-	0x00002d80, 0x00002d96, 0x00002da0, 0x00002da6,
-	0x00002da8, 0x00002dae, 0x00002db0, 0x00002db6,
-	0x00002db8, 0x00002dbe, 0x00002dc0, 0x00002dc6,
-	0x00002dc8, 0x00002dce, 0x00002dd0, 0x00002dd6,
-	0x00002dd8, 0x00002dde, 0x00003006, 0x00003006,
-	0x0000303c, 0x0000303c, 0x00003041, 0x00003096,
-	0x0000309f, 0x0000309f, 0x000030a1, 0x000030fa,
-	0x000030ff, 0x000030ff, 0x00003105, 0x0000312f,
-	0x00003131, 0x0000318e, 0x000031a0, 0x000031bf,
-	0x000031f0, 0x000031ff, 0x00003400, 0x00004dbf,
-	0x00004e00, 0x0000a014, 0x0000a016, 0x0000a48c,
-	0x0000a4d0, 0x0000a4f7, 0x0000a500, 0x0000a60b,
-	0x0000a610, 0x0000a61f, 0x0000a62a, 0x0000a62b,
-	0x0000a66e, 0x0000a66e, 0x0000a6a0, 0x0000a6e5,
-	0x0000a78f, 0x0000a78f, 0x0000a7f7, 0x0000a7f7,
-	0x0000a7fb, 0x0000a801, 0x0000a803, 0x0000a805,
-	0x0000a807, 0x0000a80a, 0x0000a80c, 0x0000a822,
-	0x0000a840, 0x0000a873, 0x0000a882, 0x0000a8b3,
-	0x0000a8f2, 0x0000a8f7, 0x0000a8fb, 0x0000a8fb,
-	0x0000a8fd, 0x0000a8fe, 0x0000a90a, 0x0000a925,
-	0x0000a930, 0x0000a946, 0x0000a960, 0x0000a97c,
-	0x0000a984, 0x0000a9b2, 0x0000a9e0, 0x0000a9e4,
-	0x0000a9e7, 0x0000a9ef, 0x0000a9fa, 0x0000a9fe,
-	0x0000aa00, 0x0000aa28, 0x0000aa40, 0x0000aa42,
-	0x0000aa44, 0x0000aa4b, 0x0000aa60, 0x0000aa6f,
-	0x0000aa71, 0x0000aa76, 0x0000aa7a, 0x0000aa7a,
-	0x0000aa7e, 0x0000aaaf, 0x0000aab1, 0x0000aab1,
-	0x0000aab5, 0x0000aab6, 0x0000aab9, 0x0000aabd,
-	0x0000aac0, 0x0000aac0, 0x0000aac2, 0x0000aac2,
-	0x0000aadb, 0x0000aadc, 0x0000aae0, 0x0000aaea,
-	0x0000aaf2, 0x0000aaf2, 0x0000ab01, 0x0000ab06,
-	0x0000ab09, 0x0000ab0e, 0x0000ab11, 0x0000ab16,
-	0x0000ab20, 0x0000ab26, 0x0000ab28, 0x0000ab2e,
-	0x0000abc0, 0x0000abe2, 0x0000ac00, 0x0000d7a3,
-	0x0000d7b0, 0x0000d7c6, 0x0000d7cb, 0x0000d7fb,
-	0x0000f900, 0x0000fa6d, 0x0000fa70, 0x0000fad9,
-	0x0000fb1d, 0x0000fb1d, 0x0000fb1f, 0x0000fb28,
-	0x0000fb2a, 0x0000fb36, 0x0000fb38, 0x0000fb3c,
-	0x0000fb3e, 0x0000fb3e, 0x0000fb40, 0x0000fb41,
-	0x0000fb43, 0x0000fb44, 0x0000fb46, 0x0000fbb1,
-	0x0000fbd3, 0x0000fd3d, 0x0000fd50, 0x0000fd8f,
-	0x0000fd92, 0x0000fdc7, 0x0000fdf0, 0x0000fdfb,
-	0x0000fe70, 0x0000fe74, 0x0000fe76, 0x0000fefc,
-	0x0000ff66, 0x0000ff6f, 0x0000ff71, 0x0000ff9d,
-	0x0000ffa0, 0x0000ffbe, 0x0000ffc2, 0x0000ffc7,
-	0x0000ffca, 0x0000ffcf, 0x0000ffd2, 0x0000ffd7,
-	0x0000ffda, 0x0000ffdc, 0x00010000, 0x0001000b,
-	0x0001000d, 0x00010026, 0x00010028, 0x0001003a,
-	0x0001003c, 0x0001003d, 0x0001003f, 0x0001004d,
-	0x00010050, 0x0001005d, 0x00010080, 0x000100fa,
-	0x00010280, 0x0001029c, 0x000102a0, 0x000102d0,
-	0x00010300, 0x0001031f, 0x0001032d, 0x00010340,
-	0x00010342, 0x00010349, 0x00010350, 0x00010375,
-	0x00010380, 0x0001039d, 0x000103a0, 0x000103c3,
-	0x000103c8, 0x000103cf, 0x00010450, 0x0001049d,
-	0x00010500, 0x00010527, 0x00010530, 0x00010563,
+	0x00010d70, 0x00010d85, 0x000118c0, 0x000118df,
+	0x00016e60, 0x00016e7f, 0x0001d41a, 0x0001d433,
+	0x0001d44e, 0x0001d454, 0x0001d456, 0x0001d467,
+	0x0001d482, 0x0001d49b, 0x0001d4b6, 0x0001d4b9,
+	0x0001d4bb, 0x0001d4bb, 0x0001d4bd, 0x0001d4c3,
+	0x0001d4c5, 0x0001d4cf, 0x0001d4ea, 0x0001d503,
+	0x0001d51e, 0x0001d537, 0x0001d552, 0x0001d56b,
+	0x0001d586, 0x0001d59f, 0x0001d5ba, 0x0001d5d3,
+	0x0001d5ee, 0x0001d607, 0x0001d622, 0x0001d63b,
+	0x0001d656, 0x0001d66f, 0x0001d68a, 0x0001d6a5,
+	0x0001d6c2, 0x0001d6da, 0x0001d6dc, 0x0001d6e1,
+	0x0001d6fc, 0x0001d714, 0x0001d716, 0x0001d71b,
+	0x0001d736, 0x0001d74e, 0x0001d750, 0x0001d755,
+	0x0001d770, 0x0001d788, 0x0001d78a, 0x0001d78f,
+	0x0001d7aa, 0x0001d7c2, 0x0001d7c4, 0x0001d7c9,
+	0x0001d7cb, 0x0001d7cb, 0x0001df00, 0x0001df09,
+	0x0001df0b, 0x0001df1e, 0x0001df25, 0x0001df2a,
+	0x0001e922, 0x0001e943, 0x000001c5, 0x000001c5,
+	0x000001c8, 0x000001c8, 0x000001cb, 0x000001cb,
+	0x000001f2, 0x000001f2, 0x00001f88, 0x00001f8f,
+	0x00001f98, 0x00001f9f, 0x00001fa8, 0x00001faf,
+	0x00001fbc, 0x00001fbc, 0x00001fcc, 0x00001fcc,
+	0x00001ffc, 0x00001ffc, 0x000002b0, 0x000002c1,
+	0x000002c6, 0x000002d1, 0x000002e0, 0x000002e4,
+	0x000002ec, 0x000002ec, 0x000002ee, 0x000002ee,
+	0x00000374, 0x00000374, 0x0000037a, 0x0000037a,
+	0x00000559, 0x00000559, 0x00000640, 0x00000640,
+	0x000006e5, 0x000006e6, 0x000007f4, 0x000007f5,
+	0x000007fa, 0x000007fa, 0x0000081a, 0x0000081a,
+	0x00000824, 0x00000824, 0x00000828, 0x00000828,
+	0x000008c9, 0x000008c9, 0x00000971, 0x00000971,
+	0x00000e46, 0x00000e46, 0x00000ec6, 0x00000ec6,
+	0x000010fc, 0x000010fc, 0x000017d7, 0x000017d7,
+	0x00001843, 0x00001843, 0x00001aa7, 0x00001aa7,
+	0x00001c78, 0x00001c7d, 0x00001d2c, 0x00001d6a,
+	0x00001d78, 0x00001d78, 0x00001d9b, 0x00001dbf,
+	0x00002071, 0x00002071, 0x0000207f, 0x0000207f,
+	0x00002090, 0x0000209c, 0x00002c7c, 0x00002c7d,
+	0x00002d6f, 0x00002d6f, 0x00002e2f, 0x00002e2f,
+	0x00003005, 0x00003005, 0x00003031, 0x00003035,
+	0x0000303b, 0x0000303b, 0x0000309d, 0x0000309e,
+	0x000030fc, 0x000030fe, 0x0000a015, 0x0000a015,
+	0x0000a4f8, 0x0000a4fd, 0x0000a60c, 0x0000a60c,
+	0x0000a67f, 0x0000a67f, 0x0000a69c, 0x0000a69d,
+	0x0000a717, 0x0000a71f, 0x0000a770, 0x0000a770,
+	0x0000a788, 0x0000a788, 0x0000a7f2, 0x0000a7f4,
+	0x0000a7f8, 0x0000a7f9, 0x0000a9cf, 0x0000a9cf,
+	0x0000a9e6, 0x0000a9e6, 0x0000aa70, 0x0000aa70,
+	0x0000aadd, 0x0000aadd, 0x0000aaf3, 0x0000aaf4,
+	0x0000ab5c, 0x0000ab5f, 0x0000ab69, 0x0000ab69,
+	0x0000ff70, 0x0000ff70, 0x0000ff9e, 0x0000ff9f,
+	0x00010780, 0x00010785, 0x00010787, 0x000107b0,
+	0x000107b2, 0x000107ba, 0x00010d4e, 0x00010d4e,
+	0x00010d6f, 0x00010d6f, 0x00016b40, 0x00016b43,
+	0x00016d40, 0x00016d42, 0x00016d6b, 0x00016d6c,
+	0x00016f93, 0x00016f9f, 0x00016fe0, 0x00016fe1,
+	0x00016fe3, 0x00016fe3, 0x0001aff0, 0x0001aff3,
+	0x0001aff5, 0x0001affb, 0x0001affd, 0x0001affe,
+	0x0001e030, 0x0001e06d, 0x0001e137, 0x0001e13d,
+	0x0001e4eb, 0x0001e4eb, 0x0001e94b, 0x0001e94b,
+	0x000000aa, 0x000000aa, 0x000000ba, 0x000000ba,
+	0x000001bb, 0x000001bb, 0x000001c0, 0x000001c3,
+	0x00000294, 0x00000294, 0x000005d0, 0x000005ea,
+	0x000005ef, 0x000005f2, 0x00000620, 0x0000063f,
+	0x00000641, 0x0000064a, 0x0000066e, 0x0000066f,
+	0x00000671, 0x000006d3, 0x000006d5, 0x000006d5,
+	0x000006ee, 0x000006ef, 0x000006fa, 0x000006fc,
+	0x000006ff, 0x000006ff, 0x00000710, 0x00000710,
+	0x00000712, 0x0000072f, 0x0000074d, 0x000007a5,
+	0x000007b1, 0x000007b1, 0x000007ca, 0x000007ea,
+	0x00000800, 0x00000815, 0x00000840, 0x00000858,
+	0x00000860, 0x0000086a, 0x00000870, 0x00000887,
+	0x00000889, 0x0000088e, 0x000008a0, 0x000008c8,
+	0x00000904, 0x00000939, 0x0000093d, 0x0000093d,
+	0x00000950, 0x00000950, 0x00000958, 0x00000961,
+	0x00000972, 0x00000980, 0x00000985, 0x0000098c,
+	0x0000098f, 0x00000990, 0x00000993, 0x000009a8,
+	0x000009aa, 0x000009b0, 0x000009b2, 0x000009b2,
+	0x000009b6, 0x000009b9, 0x000009bd, 0x000009bd,
+	0x000009ce, 0x000009ce, 0x000009dc, 0x000009dd,
+	0x000009df, 0x000009e1, 0x000009f0, 0x000009f1,
+	0x000009fc, 0x000009fc, 0x00000a05, 0x00000a0a,
+	0x00000a0f, 0x00000a10, 0x00000a13, 0x00000a28,
+	0x00000a2a, 0x00000a30, 0x00000a32, 0x00000a33,
+	0x00000a35, 0x00000a36, 0x00000a38, 0x00000a39,
+	0x00000a59, 0x00000a5c, 0x00000a5e, 0x00000a5e,
+	0x00000a72, 0x00000a74, 0x00000a85, 0x00000a8d,
+	0x00000a8f, 0x00000a91, 0x00000a93, 0x00000aa8,
+	0x00000aaa, 0x00000ab0, 0x00000ab2, 0x00000ab3,
+	0x00000ab5, 0x00000ab9, 0x00000abd, 0x00000abd,
+	0x00000ad0, 0x00000ad0, 0x00000ae0, 0x00000ae1,
+	0x00000af9, 0x00000af9, 0x00000b05, 0x00000b0c,
+	0x00000b0f, 0x00000b10, 0x00000b13, 0x00000b28,
+	0x00000b2a, 0x00000b30, 0x00000b32, 0x00000b33,
+	0x00000b35, 0x00000b39, 0x00000b3d, 0x00000b3d,
+	0x00000b5c, 0x00000b5d, 0x00000b5f, 0x00000b61,
+	0x00000b71, 0x00000b71, 0x00000b83, 0x00000b83,
+	0x00000b85, 0x00000b8a, 0x00000b8e, 0x00000b90,
+	0x00000b92, 0x00000b95, 0x00000b99, 0x00000b9a,
+	0x00000b9c, 0x00000b9c, 0x00000b9e, 0x00000b9f,
+	0x00000ba3, 0x00000ba4, 0x00000ba8, 0x00000baa,
+	0x00000bae, 0x00000bb9, 0x00000bd0, 0x00000bd0,
+	0x00000c05, 0x00000c0c, 0x00000c0e, 0x00000c10,
+	0x00000c12, 0x00000c28, 0x00000c2a, 0x00000c39,
+	0x00000c3d, 0x00000c3d, 0x00000c58, 0x00000c5a,
+	0x00000c5d, 0x00000c5d, 0x00000c60, 0x00000c61,
+	0x00000c80, 0x00000c80, 0x00000c85, 0x00000c8c,
+	0x00000c8e, 0x00000c90, 0x00000c92, 0x00000ca8,
+	0x00000caa, 0x00000cb3, 0x00000cb5, 0x00000cb9,
+	0x00000cbd, 0x00000cbd, 0x00000cdd, 0x00000cde,
+	0x00000ce0, 0x00000ce1, 0x00000cf1, 0x00000cf2,
+	0x00000d04, 0x00000d0c, 0x00000d0e, 0x00000d10,
+	0x00000d12, 0x00000d3a, 0x00000d3d, 0x00000d3d,
+	0x00000d4e, 0x00000d4e, 0x00000d54, 0x00000d56,
+	0x00000d5f, 0x00000d61, 0x00000d7a, 0x00000d7f,
+	0x00000d85, 0x00000d96, 0x00000d9a, 0x00000db1,
+	0x00000db3, 0x00000dbb, 0x00000dbd, 0x00000dbd,
+	0x00000dc0, 0x00000dc6, 0x00000e01, 0x00000e30,
+	0x00000e32, 0x00000e33, 0x00000e40, 0x00000e45,
+	0x00000e81, 0x00000e82, 0x00000e84, 0x00000e84,
+	0x00000e86, 0x00000e8a, 0x00000e8c, 0x00000ea3,
+	0x00000ea5, 0x00000ea5, 0x00000ea7, 0x00000eb0,
+	0x00000eb2, 0x00000eb3, 0x00000ebd, 0x00000ebd,
+	0x00000ec0, 0x00000ec4, 0x00000edc, 0x00000edf,
+	0x00000f00, 0x00000f00, 0x00000f40, 0x00000f47,
+	0x00000f49, 0x00000f6c, 0x00000f88, 0x00000f8c,
+	0x00001000, 0x0000102a, 0x0000103f, 0x0000103f,
+	0x00001050, 0x00001055, 0x0000105a, 0x0000105d,
+	0x00001061, 0x00001061, 0x00001065, 0x00001066,
+	0x0000106e, 0x00001070, 0x00001075, 0x00001081,
+	0x0000108e, 0x0000108e, 0x00001100, 0x00001248,
+	0x0000124a, 0x0000124d, 0x00001250, 0x00001256,
+	0x00001258, 0x00001258, 0x0000125a, 0x0000125d,
+	0x00001260, 0x00001288, 0x0000128a, 0x0000128d,
+	0x00001290, 0x000012b0, 0x000012b2, 0x000012b5,
+	0x000012b8, 0x000012be, 0x000012c0, 0x000012c0,
+	0x000012c2, 0x000012c5, 0x000012c8, 0x000012d6,
+	0x000012d8, 0x00001310, 0x00001312, 0x00001315,
+	0x00001318, 0x0000135a, 0x00001380, 0x0000138f,
+	0x00001401, 0x0000166c, 0x0000166f, 0x0000167f,
+	0x00001681, 0x0000169a, 0x000016a0, 0x000016ea,
+	0x000016f1, 0x000016f8, 0x00001700, 0x00001711,
+	0x0000171f, 0x00001731, 0x00001740, 0x00001751,
+	0x00001760, 0x0000176c, 0x0000176e, 0x00001770,
+	0x00001780, 0x000017b3, 0x000017dc, 0x000017dc,
+	0x00001820, 0x00001842, 0x00001844, 0x00001878,
+	0x00001880, 0x00001884, 0x00001887, 0x000018a8,
+	0x000018aa, 0x000018aa, 0x000018b0, 0x000018f5,
+	0x00001900, 0x0000191e, 0x00001950, 0x0000196d,
+	0x00001970, 0x00001974, 0x00001980, 0x000019ab,
+	0x000019b0, 0x000019c9, 0x00001a00, 0x00001a16,
+	0x00001a20, 0x00001a54, 0x00001b05, 0x00001b33,
+	0x00001b45, 0x00001b4c, 0x00001b83, 0x00001ba0,
+	0x00001bae, 0x00001baf, 0x00001bba, 0x00001be5,
+	0x00001c00, 0x00001c23, 0x00001c4d, 0x00001c4f,
+	0x00001c5a, 0x00001c77, 0x00001ce9, 0x00001cec,
+	0x00001cee, 0x00001cf3, 0x00001cf5, 0x00001cf6,
+	0x00001cfa, 0x00001cfa, 0x00002135, 0x00002138,
+	0x00002d30, 0x00002d67, 0x00002d80, 0x00002d96,
+	0x00002da0, 0x00002da6, 0x00002da8, 0x00002dae,
+	0x00002db0, 0x00002db6, 0x00002db8, 0x00002dbe,
+	0x00002dc0, 0x00002dc6, 0x00002dc8, 0x00002dce,
+	0x00002dd0, 0x00002dd6, 0x00002dd8, 0x00002dde,
+	0x00003006, 0x00003006, 0x0000303c, 0x0000303c,
+	0x00003041, 0x00003096, 0x0000309f, 0x0000309f,
+	0x000030a1, 0x000030fa, 0x000030ff, 0x000030ff,
+	0x00003105, 0x0000312f, 0x00003131, 0x0000318e,
+	0x000031a0, 0x000031bf, 0x000031f0, 0x000031ff,
+	0x00003400, 0x00004dbf, 0x00004e00, 0x0000a014,
+	0x0000a016, 0x0000a48c, 0x0000a4d0, 0x0000a4f7,
+	0x0000a500, 0x0000a60b, 0x0000a610, 0x0000a61f,
+	0x0000a62a, 0x0000a62b, 0x0000a66e, 0x0000a66e,
+	0x0000a6a0, 0x0000a6e5, 0x0000a78f, 0x0000a78f,
+	0x0000a7f7, 0x0000a7f7, 0x0000a7fb, 0x0000a801,
+	0x0000a803, 0x0000a805, 0x0000a807, 0x0000a80a,
+	0x0000a80c, 0x0000a822, 0x0000a840, 0x0000a873,
+	0x0000a882, 0x0000a8b3, 0x0000a8f2, 0x0000a8f7,
+	0x0000a8fb, 0x0000a8fb, 0x0000a8fd, 0x0000a8fe,
+	0x0000a90a, 0x0000a925, 0x0000a930, 0x0000a946,
+	0x0000a960, 0x0000a97c, 0x0000a984, 0x0000a9b2,
+	0x0000a9e0, 0x0000a9e4, 0x0000a9e7, 0x0000a9ef,
+	0x0000a9fa, 0x0000a9fe, 0x0000aa00, 0x0000aa28,
+	0x0000aa40, 0x0000aa42, 0x0000aa44, 0x0000aa4b,
+	0x0000aa60, 0x0000aa6f, 0x0000aa71, 0x0000aa76,
+	0x0000aa7a, 0x0000aa7a, 0x0000aa7e, 0x0000aaaf,
+	0x0000aab1, 0x0000aab1, 0x0000aab5, 0x0000aab6,
+	0x0000aab9, 0x0000aabd, 0x0000aac0, 0x0000aac0,
+	0x0000aac2, 0x0000aac2, 0x0000aadb, 0x0000aadc,
+	0x0000aae0, 0x0000aaea, 0x0000aaf2, 0x0000aaf2,
+	0x0000ab01, 0x0000ab06, 0x0000ab09, 0x0000ab0e,
+	0x0000ab11, 0x0000ab16, 0x0000ab20, 0x0000ab26,
+	0x0000ab28, 0x0000ab2e, 0x0000abc0, 0x0000abe2,
+	0x0000ac00, 0x0000d7a3, 0x0000d7b0, 0x0000d7c6,
+	0x0000d7cb, 0x0000d7fb, 0x0000f900, 0x0000fa6d,
+	0x0000fa70, 0x0000fad9, 0x0000fb1d, 0x0000fb1d,
+	0x0000fb1f, 0x0000fb28, 0x0000fb2a, 0x0000fb36,
+	0x0000fb38, 0x0000fb3c, 0x0000fb3e, 0x0000fb3e,
+	0x0000fb40, 0x0000fb41, 0x0000fb43, 0x0000fb44,
+	0x0000fb46, 0x0000fbb1, 0x0000fbd3, 0x0000fd3d,
+	0x0000fd50, 0x0000fd8f, 0x0000fd92, 0x0000fdc7,
+	0x0000fdf0, 0x0000fdfb, 0x0000fe70, 0x0000fe74,
+	0x0000fe76, 0x0000fefc, 0x0000ff66, 0x0000ff6f,
+	0x0000ff71, 0x0000ff9d, 0x0000ffa0, 0x0000ffbe,
+	0x0000ffc2, 0x0000ffc7, 0x0000ffca, 0x0000ffcf,
+	0x0000ffd2, 0x0000ffd7, 0x0000ffda, 0x0000ffdc,
+	0x00010000, 0x0001000b, 0x0001000d, 0x00010026,
+	0x00010028, 0x0001003a, 0x0001003c, 0x0001003d,
+	0x0001003f, 0x0001004d, 0x00010050, 0x0001005d,
+	0x00010080, 0x000100fa, 0x00010280, 0x0001029c,
+	0x000102a0, 0x000102d0, 0x00010300, 0x0001031f,
+	0x0001032d, 0x00010340, 0x00010342, 0x00010349,
+	0x00010350, 0x00010375, 0x00010380, 0x0001039d,
+	0x000103a0, 0x000103c3, 0x000103c8, 0x000103cf,
+	0x00010450, 0x0001049d, 0x00010500, 0x00010527,
+	0x00010530, 0x00010563, 0x000105c0, 0x000105f3,
 	0x00010600, 0x00010736, 0x00010740, 0x00010755,
 	0x00010760, 0x00010767, 0x00010800, 0x00010805,
 	0x00010808, 0x00010808, 0x0001080a, 0x00010835,
@@ -1230,27 +1250,32 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00010ac9, 0x00010ae4, 0x00010b00, 0x00010b35,
 	0x00010b40, 0x00010b55, 0x00010b60, 0x00010b72,
 	0x00010b80, 0x00010b91, 0x00010c00, 0x00010c48,
-	0x00010d00, 0x00010d23, 0x00010e80, 0x00010ea9,
-	0x00010eb0, 0x00010eb1, 0x00010f00, 0x00010f1c,
-	0x00010f27, 0x00010f27, 0x00010f30, 0x00010f45,
-	0x00010f70, 0x00010f81, 0x00010fb0, 0x00010fc4,
-	0x00010fe0, 0x00010ff6, 0x00011003, 0x00011037,
-	0x00011071, 0x00011072, 0x00011075, 0x00011075,
-	0x00011083, 0x000110af, 0x000110d0, 0x000110e8,
-	0x00011103, 0x00011126, 0x00011144, 0x00011144,
-	0x00011147, 0x00011147, 0x00011150, 0x00011172,
-	0x00011176, 0x00011176, 0x00011183, 0x000111b2,
-	0x000111c1, 0x000111c4, 0x000111da, 0x000111da,
-	0x000111dc, 0x000111dc, 0x00011200, 0x00011211,
-	0x00011213, 0x0001122b, 0x0001123f, 0x00011240,
-	0x00011280, 0x00011286, 0x00011288, 0x00011288,
-	0x0001128a, 0x0001128d, 0x0001128f, 0x0001129d,
-	0x0001129f, 0x000112a8, 0x000112b0, 0x000112de,
-	0x00011305, 0x0001130c, 0x0001130f, 0x00011310,
-	0x00011313, 0x00011328, 0x0001132a, 0x00011330,
-	0x00011332, 0x00011333, 0x00011335, 0x00011339,
-	0x0001133d, 0x0001133d, 0x00011350, 0x00011350,
-	0x0001135d, 0x00011361, 0x00011400, 0x00011434,
+	0x00010d00, 0x00010d23, 0x00010d4a, 0x00010d4d,
+	0x00010d4f, 0x00010d4f, 0x00010e80, 0x00010ea9,
+	0x00010eb0, 0x00010eb1, 0x00010ec2, 0x00010ec4,
+	0x00010f00, 0x00010f1c, 0x00010f27, 0x00010f27,
+	0x00010f30, 0x00010f45, 0x00010f70, 0x00010f81,
+	0x00010fb0, 0x00010fc4, 0x00010fe0, 0x00010ff6,
+	0x00011003, 0x00011037, 0x00011071, 0x00011072,
+	0x00011075, 0x00011075, 0x00011083, 0x000110af,
+	0x000110d0, 0x000110e8, 0x00011103, 0x00011126,
+	0x00011144, 0x00011144, 0x00011147, 0x00011147,
+	0x00011150, 0x00011172, 0x00011176, 0x00011176,
+	0x00011183, 0x000111b2, 0x000111c1, 0x000111c4,
+	0x000111da, 0x000111da, 0x000111dc, 0x000111dc,
+	0x00011200, 0x00011211, 0x00011213, 0x0001122b,
+	0x0001123f, 0x00011240, 0x00011280, 0x00011286,
+	0x00011288, 0x00011288, 0x0001128a, 0x0001128d,
+	0x0001128f, 0x0001129d, 0x0001129f, 0x000112a8,
+	0x000112b0, 0x000112de, 0x00011305, 0x0001130c,
+	0x0001130f, 0x00011310, 0x00011313, 0x00011328,
+	0x0001132a, 0x00011330, 0x00011332, 0x00011333,
+	0x00011335, 0x00011339, 0x0001133d, 0x0001133d,
+	0x00011350, 0x00011350, 0x0001135d, 0x00011361,
+	0x00011380, 0x00011389, 0x0001138b, 0x0001138b,
+	0x0001138e, 0x0001138e, 0x00011390, 0x000113b5,
+	0x000113b7, 0x000113b7, 0x000113d1, 0x000113d1,
+	0x000113d3, 0x000113d3, 0x00011400, 0x00011434,
 	0x00011447, 0x0001144a, 0x0001145f, 0x00011461,
 	0x00011480, 0x000114af, 0x000114c4, 0x000114c5,
 	0x000114c7, 0x000114c7, 0x00011580, 0x000115ae,
@@ -1267,24 +1292,26 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00011a0b, 0x00011a32, 0x00011a3a, 0x00011a3a,
 	0x00011a50, 0x00011a50, 0x00011a5c, 0x00011a89,
 	0x00011a9d, 0x00011a9d, 0x00011ab0, 0x00011af8,
-	0x00011c00, 0x00011c08, 0x00011c0a, 0x00011c2e,
-	0x00011c40, 0x00011c40, 0x00011c72, 0x00011c8f,
-	0x00011d00, 0x00011d06, 0x00011d08, 0x00011d09,
-	0x00011d0b, 0x00011d30, 0x00011d46, 0x00011d46,
-	0x00011d60, 0x00011d65, 0x00011d67, 0x00011d68,
-	0x00011d6a, 0x00011d89, 0x00011d98, 0x00011d98,
-	0x00011ee0, 0x00011ef2, 0x00011f02, 0x00011f02,
-	0x00011f04, 0x00011f10, 0x00011f12, 0x00011f33,
-	0x00011fb0, 0x00011fb0, 0x00012000, 0x00012399,
-	0x00012480, 0x00012543, 0x00012f90, 0x00012ff0,
-	0x00013000, 0x0001342f, 0x00013441, 0x00013446,
-	0x00014400, 0x00014646, 0x00016800, 0x00016a38,
-	0x00016a40, 0x00016a5e, 0x00016a70, 0x00016abe,
-	0x00016ad0, 0x00016aed, 0x00016b00, 0x00016b2f,
-	0x00016b63, 0x00016b77, 0x00016b7d, 0x00016b8f,
+	0x00011bc0, 0x00011be0, 0x00011c00, 0x00011c08,
+	0x00011c0a, 0x00011c2e, 0x00011c40, 0x00011c40,
+	0x00011c72, 0x00011c8f, 0x00011d00, 0x00011d06,
+	0x00011d08, 0x00011d09, 0x00011d0b, 0x00011d30,
+	0x00011d46, 0x00011d46, 0x00011d60, 0x00011d65,
+	0x00011d67, 0x00011d68, 0x00011d6a, 0x00011d89,
+	0x00011d98, 0x00011d98, 0x00011ee0, 0x00011ef2,
+	0x00011f02, 0x00011f02, 0x00011f04, 0x00011f10,
+	0x00011f12, 0x00011f33, 0x00011fb0, 0x00011fb0,
+	0x00012000, 0x00012399, 0x00012480, 0x00012543,
+	0x00012f90, 0x00012ff0, 0x00013000, 0x0001342f,
+	0x00013441, 0x00013446, 0x00013460, 0x000143fa,
+	0x00014400, 0x00014646, 0x00016100, 0x0001611d,
+	0x00016800, 0x00016a38, 0x00016a40, 0x00016a5e,
+	0x00016a70, 0x00016abe, 0x00016ad0, 0x00016aed,
+	0x00016b00, 0x00016b2f, 0x00016b63, 0x00016b77,
+	0x00016b7d, 0x00016b8f, 0x00016d43, 0x00016d6a,
 	0x00016f00, 0x00016f4a, 0x00016f50, 0x00016f50,
 	0x00017000, 0x000187f7, 0x00018800, 0x00018cd5,
-	0x00018d00, 0x00018d08, 0x0001b000, 0x0001b122,
+	0x00018cff, 0x00018d08, 0x0001b000, 0x0001b122,
 	0x0001b132, 0x0001b132, 0x0001b150, 0x0001b152,
 	0x0001b155, 0x0001b155, 0x0001b164, 0x0001b167,
 	0x0001b170, 0x0001b2fb, 0x0001bc00, 0x0001bc6a,
@@ -1292,7 +1319,8 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0001bc90, 0x0001bc99, 0x0001df0a, 0x0001df0a,
 	0x0001e100, 0x0001e12c, 0x0001e14e, 0x0001e14e,
 	0x0001e290, 0x0001e2ad, 0x0001e2c0, 0x0001e2eb,
-	0x0001e4d0, 0x0001e4ea, 0x0001e7e0, 0x0001e7e6,
+	0x0001e4d0, 0x0001e4ea, 0x0001e5d0, 0x0001e5ed,
+	0x0001e5f0, 0x0001e5f0, 0x0001e7e0, 0x0001e7e6,
 	0x0001e7e8, 0x0001e7eb, 0x0001e7ed, 0x0001e7ee,
 	0x0001e7f0, 0x0001e7fe, 0x0001e800, 0x0001e8c4,
 	0x0001ee00, 0x0001ee03, 0x0001ee05, 0x0001ee1f,
@@ -1342,368 +1370,370 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0000fe64, 0x0000fe66, 0x0000ff0b, 0x0000ff0b,
 	0x0000ff1c, 0x0000ff1e, 0x0000ff5c, 0x0000ff5c,
 	0x0000ff5e, 0x0000ff5e, 0x0000ffe2, 0x0000ffe2,
-	0x0000ffe9, 0x0000ffec, 0x0001d6c1, 0x0001d6c1,
-	0x0001d6db, 0x0001d6db, 0x0001d6fb, 0x0001d6fb,
-	0x0001d715, 0x0001d715, 0x0001d735, 0x0001d735,
-	0x0001d74f, 0x0001d74f, 0x0001d76f, 0x0001d76f,
-	0x0001d789, 0x0001d789, 0x0001d7a9, 0x0001d7a9,
-	0x0001d7c3, 0x0001d7c3, 0x0001eef0, 0x0001eef1,
-	0x00000024, 0x00000024, 0x000000a2, 0x000000a5,
-	0x0000058f, 0x0000058f, 0x0000060b, 0x0000060b,
-	0x000007fe, 0x000007ff, 0x000009f2, 0x000009f3,
-	0x000009fb, 0x000009fb, 0x00000af1, 0x00000af1,
-	0x00000bf9, 0x00000bf9, 0x00000e3f, 0x00000e3f,
-	0x000017db, 0x000017db, 0x000020a0, 0x000020c0,
-	0x0000a838, 0x0000a838, 0x0000fdfc, 0x0000fdfc,
-	0x0000fe69, 0x0000fe69, 0x0000ff04, 0x0000ff04,
-	0x0000ffe0, 0x0000ffe1, 0x0000ffe5, 0x0000ffe6,
-	0x00011fdd, 0x00011fe0, 0x0001e2ff, 0x0001e2ff,
-	0x0001ecb0, 0x0001ecb0, 0x0000005e, 0x0000005e,
-	0x00000060, 0x00000060, 0x000000a8, 0x000000a8,
-	0x000000af, 0x000000af, 0x000000b4, 0x000000b4,
-	0x000000b8, 0x000000b8, 0x000002c2, 0x000002c5,
-	0x000002d2, 0x000002df, 0x000002e5, 0x000002eb,
-	0x000002ed, 0x000002ed, 0x000002ef, 0x000002ff,
-	0x00000375, 0x00000375, 0x00000384, 0x00000385,
-	0x00000888, 0x00000888, 0x00001fbd, 0x00001fbd,
-	0x00001fbf, 0x00001fc1, 0x00001fcd, 0x00001fcf,
-	0x00001fdd, 0x00001fdf, 0x00001fed, 0x00001fef,
-	0x00001ffd, 0x00001ffe, 0x0000309b, 0x0000309c,
-	0x0000a700, 0x0000a716, 0x0000a720, 0x0000a721,
-	0x0000a789, 0x0000a78a, 0x0000ab5b, 0x0000ab5b,
-	0x0000ab6a, 0x0000ab6b, 0x0000fbb2, 0x0000fbc2,
-	0x0000ff3e, 0x0000ff3e, 0x0000ff40, 0x0000ff40,
-	0x0000ffe3, 0x0000ffe3, 0x0001f3fb, 0x0001f3ff,
-	0x000000a6, 0x000000a6, 0x000000a9, 0x000000a9,
-	0x000000ae, 0x000000ae, 0x000000b0, 0x000000b0,
-	0x00000482, 0x00000482, 0x0000058d, 0x0000058e,
-	0x0000060e, 0x0000060f, 0x000006de, 0x000006de,
-	0x000006e9, 0x000006e9, 0x000006fd, 0x000006fe,
-	0x000007f6, 0x000007f6, 0x000009fa, 0x000009fa,
-	0x00000b70, 0x00000b70, 0x00000bf3, 0x00000bf8,
-	0x00000bfa, 0x00000bfa, 0x00000c7f, 0x00000c7f,
-	0x00000d4f, 0x00000d4f, 0x00000d79, 0x00000d79,
-	0x00000f01, 0x00000f03, 0x00000f13, 0x00000f13,
-	0x00000f15, 0x00000f17, 0x00000f1a, 0x00000f1f,
-	0x00000f34, 0x00000f34, 0x00000f36, 0x00000f36,
-	0x00000f38, 0x00000f38, 0x00000fbe, 0x00000fc5,
-	0x00000fc7, 0x00000fcc, 0x00000fce, 0x00000fcf,
-	0x00000fd5, 0x00000fd8, 0x0000109e, 0x0000109f,
-	0x00001390, 0x00001399, 0x0000166d, 0x0000166d,
-	0x00001940, 0x00001940, 0x000019de, 0x000019ff,
-	0x00001b61, 0x00001b6a, 0x00001b74, 0x00001b7c,
-	0x00002100, 0x00002101, 0x00002103, 0x00002106,
-	0x00002108, 0x00002109, 0x00002114, 0x00002114,
-	0x00002116, 0x00002117, 0x0000211e, 0x00002123,
-	0x00002125, 0x00002125, 0x00002127, 0x00002127,
-	0x00002129, 0x00002129, 0x0000212e, 0x0000212e,
-	0x0000213a, 0x0000213b, 0x0000214a, 0x0000214a,
-	0x0000214c, 0x0000214d, 0x0000214f, 0x0000214f,
-	0x0000218a, 0x0000218b, 0x00002195, 0x00002199,
-	0x0000219c, 0x0000219f, 0x000021a1, 0x000021a2,
-	0x000021a4, 0x000021a5, 0x000021a7, 0x000021ad,
-	0x000021af, 0x000021cd, 0x000021d0, 0x000021d1,
-	0x000021d3, 0x000021d3, 0x000021d5, 0x000021f3,
-	0x00002300, 0x00002307, 0x0000230c, 0x0000231f,
-	0x00002322, 0x00002328, 0x0000232b, 0x0000237b,
-	0x0000237d, 0x0000239a, 0x000023b4, 0x000023db,
-	0x000023e2, 0x00002426, 0x00002440, 0x0000244a,
-	0x0000249c, 0x000024e9, 0x00002500, 0x000025b6,
-	0x000025b8, 0x000025c0, 0x000025c2, 0x000025f7,
-	0x00002600, 0x0000266e, 0x00002670, 0x00002767,
-	0x00002794, 0x000027bf, 0x00002800, 0x000028ff,
-	0x00002b00, 0x00002b2f, 0x00002b45, 0x00002b46,
-	0x00002b4d, 0x00002b73, 0x00002b76, 0x00002b95,
-	0x00002b97, 0x00002bff, 0x00002ce5, 0x00002cea,
-	0x00002e50, 0x00002e51, 0x00002e80, 0x00002e99,
-	0x00002e9b, 0x00002ef3, 0x00002f00, 0x00002fd5,
-	0x00002ff0, 0x00002fff, 0x00003004, 0x00003004,
-	0x00003012, 0x00003013, 0x00003020, 0x00003020,
-	0x00003036, 0x00003037, 0x0000303e, 0x0000303f,
-	0x00003190, 0x00003191, 0x00003196, 0x0000319f,
-	0x000031c0, 0x000031e3, 0x000031ef, 0x000031ef,
-	0x00003200, 0x0000321e, 0x0000322a, 0x00003247,
-	0x00003250, 0x00003250, 0x00003260, 0x0000327f,
-	0x0000328a, 0x000032b0, 0x000032c0, 0x000033ff,
-	0x00004dc0, 0x00004dff, 0x0000a490, 0x0000a4c6,
-	0x0000a828, 0x0000a82b, 0x0000a836, 0x0000a837,
-	0x0000a839, 0x0000a839, 0x0000aa77, 0x0000aa79,
-	0x0000fd40, 0x0000fd4f, 0x0000fdcf, 0x0000fdcf,
-	0x0000fdfd, 0x0000fdff, 0x0000ffe4, 0x0000ffe4,
-	0x0000ffe8, 0x0000ffe8, 0x0000ffed, 0x0000ffee,
-	0x0000fffc, 0x0000fffd, 0x00010137, 0x0001013f,
-	0x00010179, 0x00010189, 0x0001018c, 0x0001018e,
-	0x00010190, 0x0001019c, 0x000101a0, 0x000101a0,
-	0x000101d0, 0x000101fc, 0x00010877, 0x00010878,
-	0x00010ac8, 0x00010ac8, 0x0001173f, 0x0001173f,
-	0x00011fd5, 0x00011fdc, 0x00011fe1, 0x00011ff1,
-	0x00016b3c, 0x00016b3f, 0x00016b45, 0x00016b45,
-	0x0001bc9c, 0x0001bc9c, 0x0001cf50, 0x0001cfc3,
-	0x0001d000, 0x0001d0f5, 0x0001d100, 0x0001d126,
-	0x0001d129, 0x0001d164, 0x0001d16a, 0x0001d16c,
-	0x0001d183, 0x0001d184, 0x0001d18c, 0x0001d1a9,
-	0x0001d1ae, 0x0001d1ea, 0x0001d200, 0x0001d241,
-	0x0001d245, 0x0001d245, 0x0001d300, 0x0001d356,
-	0x0001d800, 0x0001d9ff, 0x0001da37, 0x0001da3a,
-	0x0001da6d, 0x0001da74, 0x0001da76, 0x0001da83,
-	0x0001da85, 0x0001da86, 0x0001e14f, 0x0001e14f,
-	0x0001ecac, 0x0001ecac, 0x0001ed2e, 0x0001ed2e,
-	0x0001f000, 0x0001f02b, 0x0001f030, 0x0001f093,
-	0x0001f0a0, 0x0001f0ae, 0x0001f0b1, 0x0001f0bf,
-	0x0001f0c1, 0x0001f0cf, 0x0001f0d1, 0x0001f0f5,
-	0x0001f10d, 0x0001f1ad, 0x0001f1e6, 0x0001f202,
-	0x0001f210, 0x0001f23b, 0x0001f240, 0x0001f248,
-	0x0001f250, 0x0001f251, 0x0001f260, 0x0001f265,
-	0x0001f300, 0x0001f3fa, 0x0001f400, 0x0001f6d7,
-	0x0001f6dc, 0x0001f6ec, 0x0001f6f0, 0x0001f6fc,
-	0x0001f700, 0x0001f776, 0x0001f77b, 0x0001f7d9,
-	0x0001f7e0, 0x0001f7eb, 0x0001f7f0, 0x0001f7f0,
-	0x0001f800, 0x0001f80b, 0x0001f810, 0x0001f847,
-	0x0001f850, 0x0001f859, 0x0001f860, 0x0001f887,
-	0x0001f890, 0x0001f8ad, 0x0001f8b0, 0x0001f8b1,
-	0x0001f900, 0x0001fa53, 0x0001fa60, 0x0001fa6d,
-	0x0001fa70, 0x0001fa7c, 0x0001fa80, 0x0001fa88,
-	0x0001fa90, 0x0001fabd, 0x0001fabf, 0x0001fac5,
-	0x0001face, 0x0001fadb, 0x0001fae0, 0x0001fae8,
-	0x0001faf0, 0x0001faf8, 0x0001fb00, 0x0001fb92,
-	0x0001fb94, 0x0001fbca, 0x00000041, 0x0000005a,
-	0x00000061, 0x0000007a, 0x000000aa, 0x000000aa,
-	0x000000b5, 0x000000b5, 0x000000ba, 0x000000ba,
-	0x000000c0, 0x000000d6, 0x000000d8, 0x000000f6,
-	0x000000f8, 0x000002b8, 0x000002bb, 0x000002c1,
-	0x000002d0, 0x000002d1, 0x000002e0, 0x000002e4,
-	0x000002ee, 0x000002ee, 0x00000370, 0x00000373,
-	0x00000376, 0x00000377, 0x0000037a, 0x0000037d,
-	0x0000037f, 0x0000037f, 0x00000386, 0x00000386,
-	0x00000388, 0x0000038a, 0x0000038c, 0x0000038c,
-	0x0000038e, 0x000003a1, 0x000003a3, 0x000003f5,
-	0x000003f7, 0x00000482, 0x0000048a, 0x0000052f,
-	0x00000531, 0x00000556, 0x00000559, 0x00000589,
-	0x00000903, 0x00000939, 0x0000093b, 0x0000093b,
-	0x0000093d, 0x00000940, 0x00000949, 0x0000094c,
-	0x0000094e, 0x00000950, 0x00000958, 0x00000961,
-	0x00000964, 0x00000980, 0x00000982, 0x00000983,
-	0x00000985, 0x0000098c, 0x0000098f, 0x00000990,
-	0x00000993, 0x000009a8, 0x000009aa, 0x000009b0,
-	0x000009b2, 0x000009b2, 0x000009b6, 0x000009b9,
-	0x000009bd, 0x000009c0, 0x000009c7, 0x000009c8,
-	0x000009cb, 0x000009cc, 0x000009ce, 0x000009ce,
-	0x000009d7, 0x000009d7, 0x000009dc, 0x000009dd,
-	0x000009df, 0x000009e1, 0x000009e6, 0x000009f1,
-	0x000009f4, 0x000009fa, 0x000009fc, 0x000009fd,
-	0x00000a03, 0x00000a03, 0x00000a05, 0x00000a0a,
-	0x00000a0f, 0x00000a10, 0x00000a13, 0x00000a28,
-	0x00000a2a, 0x00000a30, 0x00000a32, 0x00000a33,
-	0x00000a35, 0x00000a36, 0x00000a38, 0x00000a39,
-	0x00000a3e, 0x00000a40, 0x00000a59, 0x00000a5c,
-	0x00000a5e, 0x00000a5e, 0x00000a66, 0x00000a6f,
-	0x00000a72, 0x00000a74, 0x00000a76, 0x00000a76,
-	0x00000a83, 0x00000a83, 0x00000a85, 0x00000a8d,
-	0x00000a8f, 0x00000a91, 0x00000a93, 0x00000aa8,
-	0x00000aaa, 0x00000ab0, 0x00000ab2, 0x00000ab3,
-	0x00000ab5, 0x00000ab9, 0x00000abd, 0x00000ac0,
-	0x00000ac9, 0x00000ac9, 0x00000acb, 0x00000acc,
-	0x00000ad0, 0x00000ad0, 0x00000ae0, 0x00000ae1,
-	0x00000ae6, 0x00000af0, 0x00000af9, 0x00000af9,
-	0x00000b02, 0x00000b03, 0x00000b05, 0x00000b0c,
-	0x00000b0f, 0x00000b10, 0x00000b13, 0x00000b28,
-	0x00000b2a, 0x00000b30, 0x00000b32, 0x00000b33,
-	0x00000b35, 0x00000b39, 0x00000b3d, 0x00000b3e,
-	0x00000b40, 0x00000b40, 0x00000b47, 0x00000b48,
-	0x00000b4b, 0x00000b4c, 0x00000b57, 0x00000b57,
-	0x00000b5c, 0x00000b5d, 0x00000b5f, 0x00000b61,
-	0x00000b66, 0x00000b77, 0x00000b83, 0x00000b83,
-	0x00000b85, 0x00000b8a, 0x00000b8e, 0x00000b90,
-	0x00000b92, 0x00000b95, 0x00000b99, 0x00000b9a,
-	0x00000b9c, 0x00000b9c, 0x00000b9e, 0x00000b9f,
-	0x00000ba3, 0x00000ba4, 0x00000ba8, 0x00000baa,
-	0x00000bae, 0x00000bb9, 0x00000bbe, 0x00000bbf,
-	0x00000bc1, 0x00000bc2, 0x00000bc6, 0x00000bc8,
-	0x00000bca, 0x00000bcc, 0x00000bd0, 0x00000bd0,
-	0x00000bd7, 0x00000bd7, 0x00000be6, 0x00000bf2,
-	0x00000c01, 0x00000c03, 0x00000c05, 0x00000c0c,
-	0x00000c0e, 0x00000c10, 0x00000c12, 0x00000c28,
-	0x00000c2a, 0x00000c39, 0x00000c3d, 0x00000c3d,
-	0x00000c41, 0x00000c44, 0x00000c58, 0x00000c5a,
-	0x00000c5d, 0x00000c5d, 0x00000c60, 0x00000c61,
-	0x00000c66, 0x00000c6f, 0x00000c77, 0x00000c77,
-	0x00000c7f, 0x00000c80, 0x00000c82, 0x00000c8c,
-	0x00000c8e, 0x00000c90, 0x00000c92, 0x00000ca8,
-	0x00000caa, 0x00000cb3, 0x00000cb5, 0x00000cb9,
-	0x00000cbd, 0x00000cc4, 0x00000cc6, 0x00000cc8,
-	0x00000cca, 0x00000ccb, 0x00000cd5, 0x00000cd6,
-	0x00000cdd, 0x00000cde, 0x00000ce0, 0x00000ce1,
-	0x00000ce6, 0x00000cef, 0x00000cf1, 0x00000cf3,
-	0x00000d02, 0x00000d0c, 0x00000d0e, 0x00000d10,
-	0x00000d12, 0x00000d3a, 0x00000d3d, 0x00000d40,
-	0x00000d46, 0x00000d48, 0x00000d4a, 0x00000d4c,
-	0x00000d4e, 0x00000d4f, 0x00000d54, 0x00000d61,
-	0x00000d66, 0x00000d7f, 0x00000d82, 0x00000d83,
-	0x00000d85, 0x00000d96, 0x00000d9a, 0x00000db1,
-	0x00000db3, 0x00000dbb, 0x00000dbd, 0x00000dbd,
-	0x00000dc0, 0x00000dc6, 0x00000dcf, 0x00000dd1,
-	0x00000dd8, 0x00000ddf, 0x00000de6, 0x00000def,
-	0x00000df2, 0x00000df4, 0x00000e01, 0x00000e30,
-	0x00000e32, 0x00000e33, 0x00000e40, 0x00000e46,
-	0x00000e4f, 0x00000e5b, 0x00000e81, 0x00000e82,
-	0x00000e84, 0x00000e84, 0x00000e86, 0x00000e8a,
-	0x00000e8c, 0x00000ea3, 0x00000ea5, 0x00000ea5,
-	0x00000ea7, 0x00000eb0, 0x00000eb2, 0x00000eb3,
-	0x00000ebd, 0x00000ebd, 0x00000ec0, 0x00000ec4,
-	0x00000ec6, 0x00000ec6, 0x00000ed0, 0x00000ed9,
-	0x00000edc, 0x00000edf, 0x00000f00, 0x00000f17,
-	0x00000f1a, 0x00000f34, 0x00000f36, 0x00000f36,
-	0x00000f38, 0x00000f38, 0x00000f3e, 0x00000f47,
-	0x00000f49, 0x00000f6c, 0x00000f7f, 0x00000f7f,
-	0x00000f85, 0x00000f85, 0x00000f88, 0x00000f8c,
+	0x0000ffe9, 0x0000ffec, 0x00010d8e, 0x00010d8f,
+	0x0001d6c1, 0x0001d6c1, 0x0001d6db, 0x0001d6db,
+	0x0001d6fb, 0x0001d6fb, 0x0001d715, 0x0001d715,
+	0x0001d735, 0x0001d735, 0x0001d74f, 0x0001d74f,
+	0x0001d76f, 0x0001d76f, 0x0001d789, 0x0001d789,
+	0x0001d7a9, 0x0001d7a9, 0x0001d7c3, 0x0001d7c3,
+	0x0001eef0, 0x0001eef1, 0x00000024, 0x00000024,
+	0x000000a2, 0x000000a5, 0x0000058f, 0x0000058f,
+	0x0000060b, 0x0000060b, 0x000007fe, 0x000007ff,
+	0x000009f2, 0x000009f3, 0x000009fb, 0x000009fb,
+	0x00000af1, 0x00000af1, 0x00000bf9, 0x00000bf9,
+	0x00000e3f, 0x00000e3f, 0x000017db, 0x000017db,
+	0x000020a0, 0x000020c0, 0x0000a838, 0x0000a838,
+	0x0000fdfc, 0x0000fdfc, 0x0000fe69, 0x0000fe69,
+	0x0000ff04, 0x0000ff04, 0x0000ffe0, 0x0000ffe1,
+	0x0000ffe5, 0x0000ffe6, 0x00011fdd, 0x00011fe0,
+	0x0001e2ff, 0x0001e2ff, 0x0001ecb0, 0x0001ecb0,
+	0x0000005e, 0x0000005e, 0x00000060, 0x00000060,
+	0x000000a8, 0x000000a8, 0x000000af, 0x000000af,
+	0x000000b4, 0x000000b4, 0x000000b8, 0x000000b8,
+	0x000002c2, 0x000002c5, 0x000002d2, 0x000002df,
+	0x000002e5, 0x000002eb, 0x000002ed, 0x000002ed,
+	0x000002ef, 0x000002ff, 0x00000375, 0x00000375,
+	0x00000384, 0x00000385, 0x00000888, 0x00000888,
+	0x00001fbd, 0x00001fbd, 0x00001fbf, 0x00001fc1,
+	0x00001fcd, 0x00001fcf, 0x00001fdd, 0x00001fdf,
+	0x00001fed, 0x00001fef, 0x00001ffd, 0x00001ffe,
+	0x0000309b, 0x0000309c, 0x0000a700, 0x0000a716,
+	0x0000a720, 0x0000a721, 0x0000a789, 0x0000a78a,
+	0x0000ab5b, 0x0000ab5b, 0x0000ab6a, 0x0000ab6b,
+	0x0000fbb2, 0x0000fbc2, 0x0000ff3e, 0x0000ff3e,
+	0x0000ff40, 0x0000ff40, 0x0000ffe3, 0x0000ffe3,
+	0x0001f3fb, 0x0001f3ff, 0x000000a6, 0x000000a6,
+	0x000000a9, 0x000000a9, 0x000000ae, 0x000000ae,
+	0x000000b0, 0x000000b0, 0x00000482, 0x00000482,
+	0x0000058d, 0x0000058e, 0x0000060e, 0x0000060f,
+	0x000006de, 0x000006de, 0x000006e9, 0x000006e9,
+	0x000006fd, 0x000006fe, 0x000007f6, 0x000007f6,
+	0x000009fa, 0x000009fa, 0x00000b70, 0x00000b70,
+	0x00000bf3, 0x00000bf8, 0x00000bfa, 0x00000bfa,
+	0x00000c7f, 0x00000c7f, 0x00000d4f, 0x00000d4f,
+	0x00000d79, 0x00000d79, 0x00000f01, 0x00000f03,
+	0x00000f13, 0x00000f13, 0x00000f15, 0x00000f17,
+	0x00000f1a, 0x00000f1f, 0x00000f34, 0x00000f34,
+	0x00000f36, 0x00000f36, 0x00000f38, 0x00000f38,
 	0x00000fbe, 0x00000fc5, 0x00000fc7, 0x00000fcc,
-	0x00000fce, 0x00000fda, 0x00001000, 0x0000102c,
-	0x00001031, 0x00001031, 0x00001038, 0x00001038,
-	0x0000103b, 0x0000103c, 0x0000103f, 0x00001057,
-	0x0000105a, 0x0000105d, 0x00001061, 0x00001070,
-	0x00001075, 0x00001081, 0x00001083, 0x00001084,
-	0x00001087, 0x0000108c, 0x0000108e, 0x0000109c,
-	0x0000109e, 0x000010c5, 0x000010c7, 0x000010c7,
-	0x000010cd, 0x000010cd, 0x000010d0, 0x00001248,
-	0x0000124a, 0x0000124d, 0x00001250, 0x00001256,
-	0x00001258, 0x00001258, 0x0000125a, 0x0000125d,
-	0x00001260, 0x00001288, 0x0000128a, 0x0000128d,
-	0x00001290, 0x000012b0, 0x000012b2, 0x000012b5,
-	0x000012b8, 0x000012be, 0x000012c0, 0x000012c0,
-	0x000012c2, 0x000012c5, 0x000012c8, 0x000012d6,
-	0x000012d8, 0x00001310, 0x00001312, 0x00001315,
-	0x00001318, 0x0000135a, 0x00001360, 0x0000137c,
-	0x00001380, 0x0000138f, 0x000013a0, 0x000013f5,
-	0x000013f8, 0x000013fd, 0x00001401, 0x0000167f,
-	0x00001681, 0x0000169a, 0x000016a0, 0x000016f8,
-	0x00001700, 0x00001711, 0x00001715, 0x00001715,
-	0x0000171f, 0x00001731, 0x00001734, 0x00001736,
-	0x00001740, 0x00001751, 0x00001760, 0x0000176c,
-	0x0000176e, 0x00001770, 0x00001780, 0x000017b3,
-	0x000017b6, 0x000017b6, 0x000017be, 0x000017c5,
-	0x000017c7, 0x000017c8, 0x000017d4, 0x000017da,
-	0x000017dc, 0x000017dc, 0x000017e0, 0x000017e9,
-	0x00001810, 0x00001819, 0x00001820, 0x00001878,
-	0x00001880, 0x00001884, 0x00001887, 0x000018a8,
-	0x000018aa, 0x000018aa, 0x000018b0, 0x000018f5,
-	0x00001900, 0x0000191e, 0x00001923, 0x00001926,
-	0x00001929, 0x0000192b, 0x00001930, 0x00001931,
-	0x00001933, 0x00001938, 0x00001946, 0x0000196d,
-	0x00001970, 0x00001974, 0x00001980, 0x000019ab,
-	0x000019b0, 0x000019c9, 0x000019d0, 0x000019da,
-	0x00001a00, 0x00001a16, 0x00001a19, 0x00001a1a,
-	0x00001a1e, 0x00001a55, 0x00001a57, 0x00001a57,
-	0x00001a61, 0x00001a61, 0x00001a63, 0x00001a64,
-	0x00001a6d, 0x00001a72, 0x00001a80, 0x00001a89,
-	0x00001a90, 0x00001a99, 0x00001aa0, 0x00001aad,
-	0x00001b04, 0x00001b33, 0x00001b35, 0x00001b35,
-	0x00001b3b, 0x00001b3b, 0x00001b3d, 0x00001b41,
-	0x00001b43, 0x00001b4c, 0x00001b50, 0x00001b6a,
-	0x00001b74, 0x00001b7e, 0x00001b82, 0x00001ba1,
-	0x00001ba6, 0x00001ba7, 0x00001baa, 0x00001baa,
-	0x00001bae, 0x00001be5, 0x00001be7, 0x00001be7,
-	0x00001bea, 0x00001bec, 0x00001bee, 0x00001bee,
-	0x00001bf2, 0x00001bf3, 0x00001bfc, 0x00001c2b,
-	0x00001c34, 0x00001c35, 0x00001c3b, 0x00001c49,
-	0x00001c4d, 0x00001c88, 0x00001c90, 0x00001cba,
-	0x00001cbd, 0x00001cc7, 0x00001cd3, 0x00001cd3,
-	0x00001ce1, 0x00001ce1, 0x00001ce9, 0x00001cec,
-	0x00001cee, 0x00001cf3, 0x00001cf5, 0x00001cf7,
-	0x00001cfa, 0x00001cfa, 0x00001d00, 0x00001dbf,
-	0x00001e00, 0x00001f15, 0x00001f18, 0x00001f1d,
-	0x00001f20, 0x00001f45, 0x00001f48, 0x00001f4d,
-	0x00001f50, 0x00001f57, 0x00001f59, 0x00001f59,
-	0x00001f5b, 0x00001f5b, 0x00001f5d, 0x00001f5d,
-	0x00001f5f, 0x00001f7d, 0x00001f80, 0x00001fb4,
-	0x00001fb6, 0x00001fbc, 0x00001fbe, 0x00001fbe,
-	0x00001fc2, 0x00001fc4, 0x00001fc6, 0x00001fcc,
-	0x00001fd0, 0x00001fd3, 0x00001fd6, 0x00001fdb,
-	0x00001fe0, 0x00001fec, 0x00001ff2, 0x00001ff4,
-	0x00001ff6, 0x00001ffc, 0x0000200e, 0x0000200e,
-	0x00002071, 0x00002071, 0x0000207f, 0x0000207f,
-	0x00002090, 0x0000209c, 0x00002102, 0x00002102,
-	0x00002107, 0x00002107, 0x0000210a, 0x00002113,
-	0x00002115, 0x00002115, 0x00002119, 0x0000211d,
-	0x00002124, 0x00002124, 0x00002126, 0x00002126,
-	0x00002128, 0x00002128, 0x0000212a, 0x0000212d,
-	0x0000212f, 0x00002139, 0x0000213c, 0x0000213f,
-	0x00002145, 0x00002149, 0x0000214e, 0x0000214f,
-	0x00002160, 0x00002188, 0x00002336, 0x0000237a,
-	0x00002395, 0x00002395, 0x0000249c, 0x000024e9,
-	0x000026ac, 0x000026ac, 0x00002800, 0x000028ff,
-	0x00002c00, 0x00002ce4, 0x00002ceb, 0x00002cee,
-	0x00002cf2, 0x00002cf3, 0x00002d00, 0x00002d25,
-	0x00002d27, 0x00002d27, 0x00002d2d, 0x00002d2d,
-	0x00002d30, 0x00002d67, 0x00002d6f, 0x00002d70,
-	0x00002d80, 0x00002d96, 0x00002da0, 0x00002da6,
-	0x00002da8, 0x00002dae, 0x00002db0, 0x00002db6,
-	0x00002db8, 0x00002dbe, 0x00002dc0, 0x00002dc6,
-	0x00002dc8, 0x00002dce, 0x00002dd0, 0x00002dd6,
-	0x00002dd8, 0x00002dde, 0x00003005, 0x00003007,
-	0x00003021, 0x00003029, 0x0000302e, 0x0000302f,
-	0x00003031, 0x00003035, 0x00003038, 0x0000303c,
-	0x00003041, 0x00003096, 0x0000309d, 0x0000309f,
-	0x000030a1, 0x000030fa, 0x000030fc, 0x000030ff,
-	0x00003105, 0x0000312f, 0x00003131, 0x0000318e,
-	0x00003190, 0x000031bf, 0x000031f0, 0x0000321c,
-	0x00003220, 0x0000324f, 0x00003260, 0x0000327b,
-	0x0000327f, 0x000032b0, 0x000032c0, 0x000032cb,
-	0x000032d0, 0x00003376, 0x0000337b, 0x000033dd,
-	0x000033e0, 0x000033fe, 0x00003400, 0x00004dbf,
-	0x00004e00, 0x0000a48c, 0x0000a4d0, 0x0000a60c,
-	0x0000a610, 0x0000a62b, 0x0000a640, 0x0000a66e,
-	0x0000a680, 0x0000a69d, 0x0000a6a0, 0x0000a6ef,
-	0x0000a6f2, 0x0000a6f7, 0x0000a722, 0x0000a787,
-	0x0000a789, 0x0000a7ca, 0x0000a7d0, 0x0000a7d1,
-	0x0000a7d3, 0x0000a7d3, 0x0000a7d5, 0x0000a7d9,
-	0x0000a7f2, 0x0000a801, 0x0000a803, 0x0000a805,
-	0x0000a807, 0x0000a80a, 0x0000a80c, 0x0000a824,
-	0x0000a827, 0x0000a827, 0x0000a830, 0x0000a837,
-	0x0000a840, 0x0000a873, 0x0000a880, 0x0000a8c3,
-	0x0000a8ce, 0x0000a8d9, 0x0000a8f2, 0x0000a8fe,
-	0x0000a900, 0x0000a925, 0x0000a92e, 0x0000a946,
-	0x0000a952, 0x0000a953, 0x0000a95f, 0x0000a97c,
-	0x0000a983, 0x0000a9b2, 0x0000a9b4, 0x0000a9b5,
-	0x0000a9ba, 0x0000a9bb, 0x0000a9be, 0x0000a9cd,
-	0x0000a9cf, 0x0000a9d9, 0x0000a9de, 0x0000a9e4,
-	0x0000a9e6, 0x0000a9fe, 0x0000aa00, 0x0000aa28,
-	0x0000aa2f, 0x0000aa30, 0x0000aa33, 0x0000aa34,
-	0x0000aa40, 0x0000aa42, 0x0000aa44, 0x0000aa4b,
-	0x0000aa4d, 0x0000aa4d, 0x0000aa50, 0x0000aa59,
-	0x0000aa5c, 0x0000aa7b, 0x0000aa7d, 0x0000aaaf,
-	0x0000aab1, 0x0000aab1, 0x0000aab5, 0x0000aab6,
-	0x0000aab9, 0x0000aabd, 0x0000aac0, 0x0000aac0,
-	0x0000aac2, 0x0000aac2, 0x0000aadb, 0x0000aaeb,
-	0x0000aaee, 0x0000aaf5, 0x0000ab01, 0x0000ab06,
-	0x0000ab09, 0x0000ab0e, 0x0000ab11, 0x0000ab16,
-	0x0000ab20, 0x0000ab26, 0x0000ab28, 0x0000ab2e,
-	0x0000ab30, 0x0000ab69, 0x0000ab70, 0x0000abe4,
-	0x0000abe6, 0x0000abe7, 0x0000abe9, 0x0000abec,
-	0x0000abf0, 0x0000abf9, 0x0000ac00, 0x0000d7a3,
-	0x0000d7b0, 0x0000d7c6, 0x0000d7cb, 0x0000d7fb,
-	0x0000d800, 0x0000fa6d, 0x0000fa70, 0x0000fad9,
-	0x0000fb00, 0x0000fb06, 0x0000fb13, 0x0000fb17,
-	0x0000ff21, 0x0000ff3a, 0x0000ff41, 0x0000ff5a,
-	0x0000ff66, 0x0000ffbe, 0x0000ffc2, 0x0000ffc7,
-	0x0000ffca, 0x0000ffcf, 0x0000ffd2, 0x0000ffd7,
-	0x0000ffda, 0x0000ffdc, 0x00010000, 0x0001000b,
-	0x0001000d, 0x00010026, 0x00010028, 0x0001003a,
-	0x0001003c, 0x0001003d, 0x0001003f, 0x0001004d,
-	0x00010050, 0x0001005d, 0x00010080, 0x000100fa,
-	0x00010100, 0x00010100, 0x00010102, 0x00010102,
-	0x00010107, 0x00010133, 0x00010137, 0x0001013f,
-	0x0001018d, 0x0001018e, 0x000101d0, 0x000101fc,
-	0x00010280, 0x0001029c, 0x000102a0, 0x000102d0,
-	0x00010300, 0x00010323, 0x0001032d, 0x0001034a,
-	0x00010350, 0x00010375, 0x00010380, 0x0001039d,
-	0x0001039f, 0x000103c3, 0x000103c8, 0x000103d5,
-	0x00010400, 0x0001049d, 0x000104a0, 0x000104a9,
-	0x000104b0, 0x000104d3, 0x000104d8, 0x000104fb,
-	0x00010500, 0x00010527, 0x00010530, 0x00010563,
-	0x0001056f, 0x0001057a, 0x0001057c, 0x0001058a,
-	0x0001058c, 0x00010592, 0x00010594, 0x00010595,
-	0x00010597, 0x000105a1, 0x000105a3, 0x000105b1,
-	0x000105b3, 0x000105b9, 0x000105bb, 0x000105bc,
+	0x00000fce, 0x00000fcf, 0x00000fd5, 0x00000fd8,
+	0x0000109e, 0x0000109f, 0x00001390, 0x00001399,
+	0x0000166d, 0x0000166d, 0x00001940, 0x00001940,
+	0x000019de, 0x000019ff, 0x00001b61, 0x00001b6a,
+	0x00001b74, 0x00001b7c, 0x00002100, 0x00002101,
+	0x00002103, 0x00002106, 0x00002108, 0x00002109,
+	0x00002114, 0x00002114, 0x00002116, 0x00002117,
+	0x0000211e, 0x00002123, 0x00002125, 0x00002125,
+	0x00002127, 0x00002127, 0x00002129, 0x00002129,
+	0x0000212e, 0x0000212e, 0x0000213a, 0x0000213b,
+	0x0000214a, 0x0000214a, 0x0000214c, 0x0000214d,
+	0x0000214f, 0x0000214f, 0x0000218a, 0x0000218b,
+	0x00002195, 0x00002199, 0x0000219c, 0x0000219f,
+	0x000021a1, 0x000021a2, 0x000021a4, 0x000021a5,
+	0x000021a7, 0x000021ad, 0x000021af, 0x000021cd,
+	0x000021d0, 0x000021d1, 0x000021d3, 0x000021d3,
+	0x000021d5, 0x000021f3, 0x00002300, 0x00002307,
+	0x0000230c, 0x0000231f, 0x00002322, 0x00002328,
+	0x0000232b, 0x0000237b, 0x0000237d, 0x0000239a,
+	0x000023b4, 0x000023db, 0x000023e2, 0x00002429,
+	0x00002440, 0x0000244a, 0x0000249c, 0x000024e9,
+	0x00002500, 0x000025b6, 0x000025b8, 0x000025c0,
+	0x000025c2, 0x000025f7, 0x00002600, 0x0000266e,
+	0x00002670, 0x00002767, 0x00002794, 0x000027bf,
+	0x00002800, 0x000028ff, 0x00002b00, 0x00002b2f,
+	0x00002b45, 0x00002b46, 0x00002b4d, 0x00002b73,
+	0x00002b76, 0x00002b95, 0x00002b97, 0x00002bff,
+	0x00002ce5, 0x00002cea, 0x00002e50, 0x00002e51,
+	0x00002e80, 0x00002e99, 0x00002e9b, 0x00002ef3,
+	0x00002f00, 0x00002fd5, 0x00002ff0, 0x00002fff,
+	0x00003004, 0x00003004, 0x00003012, 0x00003013,
+	0x00003020, 0x00003020, 0x00003036, 0x00003037,
+	0x0000303e, 0x0000303f, 0x00003190, 0x00003191,
+	0x00003196, 0x0000319f, 0x000031c0, 0x000031e5,
+	0x000031ef, 0x000031ef, 0x00003200, 0x0000321e,
+	0x0000322a, 0x00003247, 0x00003250, 0x00003250,
+	0x00003260, 0x0000327f, 0x0000328a, 0x000032b0,
+	0x000032c0, 0x000033ff, 0x00004dc0, 0x00004dff,
+	0x0000a490, 0x0000a4c6, 0x0000a828, 0x0000a82b,
+	0x0000a836, 0x0000a837, 0x0000a839, 0x0000a839,
+	0x0000aa77, 0x0000aa79, 0x0000fd40, 0x0000fd4f,
+	0x0000fdcf, 0x0000fdcf, 0x0000fdfd, 0x0000fdff,
+	0x0000ffe4, 0x0000ffe4, 0x0000ffe8, 0x0000ffe8,
+	0x0000ffed, 0x0000ffee, 0x0000fffc, 0x0000fffd,
+	0x00010137, 0x0001013f, 0x00010179, 0x00010189,
+	0x0001018c, 0x0001018e, 0x00010190, 0x0001019c,
+	0x000101a0, 0x000101a0, 0x000101d0, 0x000101fc,
+	0x00010877, 0x00010878, 0x00010ac8, 0x00010ac8,
+	0x0001173f, 0x0001173f, 0x00011fd5, 0x00011fdc,
+	0x00011fe1, 0x00011ff1, 0x00016b3c, 0x00016b3f,
+	0x00016b45, 0x00016b45, 0x0001bc9c, 0x0001bc9c,
+	0x0001cc00, 0x0001ccef, 0x0001cd00, 0x0001ceb3,
+	0x0001cf50, 0x0001cfc3, 0x0001d000, 0x0001d0f5,
+	0x0001d100, 0x0001d126, 0x0001d129, 0x0001d164,
+	0x0001d16a, 0x0001d16c, 0x0001d183, 0x0001d184,
+	0x0001d18c, 0x0001d1a9, 0x0001d1ae, 0x0001d1ea,
+	0x0001d200, 0x0001d241, 0x0001d245, 0x0001d245,
+	0x0001d300, 0x0001d356, 0x0001d800, 0x0001d9ff,
+	0x0001da37, 0x0001da3a, 0x0001da6d, 0x0001da74,
+	0x0001da76, 0x0001da83, 0x0001da85, 0x0001da86,
+	0x0001e14f, 0x0001e14f, 0x0001ecac, 0x0001ecac,
+	0x0001ed2e, 0x0001ed2e, 0x0001f000, 0x0001f02b,
+	0x0001f030, 0x0001f093, 0x0001f0a0, 0x0001f0ae,
+	0x0001f0b1, 0x0001f0bf, 0x0001f0c1, 0x0001f0cf,
+	0x0001f0d1, 0x0001f0f5, 0x0001f10d, 0x0001f1ad,
+	0x0001f1e6, 0x0001f202, 0x0001f210, 0x0001f23b,
+	0x0001f240, 0x0001f248, 0x0001f250, 0x0001f251,
+	0x0001f260, 0x0001f265, 0x0001f300, 0x0001f3fa,
+	0x0001f400, 0x0001f6d7, 0x0001f6dc, 0x0001f6ec,
+	0x0001f6f0, 0x0001f6fc, 0x0001f700, 0x0001f776,
+	0x0001f77b, 0x0001f7d9, 0x0001f7e0, 0x0001f7eb,
+	0x0001f7f0, 0x0001f7f0, 0x0001f800, 0x0001f80b,
+	0x0001f810, 0x0001f847, 0x0001f850, 0x0001f859,
+	0x0001f860, 0x0001f887, 0x0001f890, 0x0001f8ad,
+	0x0001f8b0, 0x0001f8bb, 0x0001f8c0, 0x0001f8c1,
+	0x0001f900, 0x0001fa53, 0x0001fa60, 0x0001fa6d,
+	0x0001fa70, 0x0001fa7c, 0x0001fa80, 0x0001fa89,
+	0x0001fa8f, 0x0001fac6, 0x0001face, 0x0001fadc,
+	0x0001fadf, 0x0001fae9, 0x0001faf0, 0x0001faf8,
+	0x0001fb00, 0x0001fb92, 0x0001fb94, 0x0001fbef,
+	0x00000041, 0x0000005a, 0x00000061, 0x0000007a,
+	0x000000aa, 0x000000aa, 0x000000b5, 0x000000b5,
+	0x000000ba, 0x000000ba, 0x000000c0, 0x000000d6,
+	0x000000d8, 0x000000f6, 0x000000f8, 0x000002b8,
+	0x000002bb, 0x000002c1, 0x000002d0, 0x000002d1,
+	0x000002e0, 0x000002e4, 0x000002ee, 0x000002ee,
+	0x00000370, 0x00000373, 0x00000376, 0x00000377,
+	0x0000037a, 0x0000037d, 0x0000037f, 0x0000037f,
+	0x00000386, 0x00000386, 0x00000388, 0x0000038a,
+	0x0000038c, 0x0000038c, 0x0000038e, 0x000003a1,
+	0x000003a3, 0x000003f5, 0x000003f7, 0x00000482,
+	0x0000048a, 0x0000052f, 0x00000531, 0x00000556,
+	0x00000559, 0x00000589, 0x00000903, 0x00000939,
+	0x0000093b, 0x0000093b, 0x0000093d, 0x00000940,
+	0x00000949, 0x0000094c, 0x0000094e, 0x00000950,
+	0x00000958, 0x00000961, 0x00000964, 0x00000980,
+	0x00000982, 0x00000983, 0x00000985, 0x0000098c,
+	0x0000098f, 0x00000990, 0x00000993, 0x000009a8,
+	0x000009aa, 0x000009b0, 0x000009b2, 0x000009b2,
+	0x000009b6, 0x000009b9, 0x000009bd, 0x000009c0,
+	0x000009c7, 0x000009c8, 0x000009cb, 0x000009cc,
+	0x000009ce, 0x000009ce, 0x000009d7, 0x000009d7,
+	0x000009dc, 0x000009dd, 0x000009df, 0x000009e1,
+	0x000009e6, 0x000009f1, 0x000009f4, 0x000009fa,
+	0x000009fc, 0x000009fd, 0x00000a03, 0x00000a03,
+	0x00000a05, 0x00000a0a, 0x00000a0f, 0x00000a10,
+	0x00000a13, 0x00000a28, 0x00000a2a, 0x00000a30,
+	0x00000a32, 0x00000a33, 0x00000a35, 0x00000a36,
+	0x00000a38, 0x00000a39, 0x00000a3e, 0x00000a40,
+	0x00000a59, 0x00000a5c, 0x00000a5e, 0x00000a5e,
+	0x00000a66, 0x00000a6f, 0x00000a72, 0x00000a74,
+	0x00000a76, 0x00000a76, 0x00000a83, 0x00000a83,
+	0x00000a85, 0x00000a8d, 0x00000a8f, 0x00000a91,
+	0x00000a93, 0x00000aa8, 0x00000aaa, 0x00000ab0,
+	0x00000ab2, 0x00000ab3, 0x00000ab5, 0x00000ab9,
+	0x00000abd, 0x00000ac0, 0x00000ac9, 0x00000ac9,
+	0x00000acb, 0x00000acc, 0x00000ad0, 0x00000ad0,
+	0x00000ae0, 0x00000ae1, 0x00000ae6, 0x00000af0,
+	0x00000af9, 0x00000af9, 0x00000b02, 0x00000b03,
+	0x00000b05, 0x00000b0c, 0x00000b0f, 0x00000b10,
+	0x00000b13, 0x00000b28, 0x00000b2a, 0x00000b30,
+	0x00000b32, 0x00000b33, 0x00000b35, 0x00000b39,
+	0x00000b3d, 0x00000b3e, 0x00000b40, 0x00000b40,
+	0x00000b47, 0x00000b48, 0x00000b4b, 0x00000b4c,
+	0x00000b57, 0x00000b57, 0x00000b5c, 0x00000b5d,
+	0x00000b5f, 0x00000b61, 0x00000b66, 0x00000b77,
+	0x00000b83, 0x00000b83, 0x00000b85, 0x00000b8a,
+	0x00000b8e, 0x00000b90, 0x00000b92, 0x00000b95,
+	0x00000b99, 0x00000b9a, 0x00000b9c, 0x00000b9c,
+	0x00000b9e, 0x00000b9f, 0x00000ba3, 0x00000ba4,
+	0x00000ba8, 0x00000baa, 0x00000bae, 0x00000bb9,
+	0x00000bbe, 0x00000bbf, 0x00000bc1, 0x00000bc2,
+	0x00000bc6, 0x00000bc8, 0x00000bca, 0x00000bcc,
+	0x00000bd0, 0x00000bd0, 0x00000bd7, 0x00000bd7,
+	0x00000be6, 0x00000bf2, 0x00000c01, 0x00000c03,
+	0x00000c05, 0x00000c0c, 0x00000c0e, 0x00000c10,
+	0x00000c12, 0x00000c28, 0x00000c2a, 0x00000c39,
+	0x00000c3d, 0x00000c3d, 0x00000c41, 0x00000c44,
+	0x00000c58, 0x00000c5a, 0x00000c5d, 0x00000c5d,
+	0x00000c60, 0x00000c61, 0x00000c66, 0x00000c6f,
+	0x00000c77, 0x00000c77, 0x00000c7f, 0x00000c80,
+	0x00000c82, 0x00000c8c, 0x00000c8e, 0x00000c90,
+	0x00000c92, 0x00000ca8, 0x00000caa, 0x00000cb3,
+	0x00000cb5, 0x00000cb9, 0x00000cbd, 0x00000cc4,
+	0x00000cc6, 0x00000cc8, 0x00000cca, 0x00000ccb,
+	0x00000cd5, 0x00000cd6, 0x00000cdd, 0x00000cde,
+	0x00000ce0, 0x00000ce1, 0x00000ce6, 0x00000cef,
+	0x00000cf1, 0x00000cf3, 0x00000d02, 0x00000d0c,
+	0x00000d0e, 0x00000d10, 0x00000d12, 0x00000d3a,
+	0x00000d3d, 0x00000d40, 0x00000d46, 0x00000d48,
+	0x00000d4a, 0x00000d4c, 0x00000d4e, 0x00000d4f,
+	0x00000d54, 0x00000d61, 0x00000d66, 0x00000d7f,
+	0x00000d82, 0x00000d83, 0x00000d85, 0x00000d96,
+	0x00000d9a, 0x00000db1, 0x00000db3, 0x00000dbb,
+	0x00000dbd, 0x00000dbd, 0x00000dc0, 0x00000dc6,
+	0x00000dcf, 0x00000dd1, 0x00000dd8, 0x00000ddf,
+	0x00000de6, 0x00000def, 0x00000df2, 0x00000df4,
+	0x00000e01, 0x00000e30, 0x00000e32, 0x00000e33,
+	0x00000e40, 0x00000e46, 0x00000e4f, 0x00000e5b,
+	0x00000e81, 0x00000e82, 0x00000e84, 0x00000e84,
+	0x00000e86, 0x00000e8a, 0x00000e8c, 0x00000ea3,
+	0x00000ea5, 0x00000ea5, 0x00000ea7, 0x00000eb0,
+	0x00000eb2, 0x00000eb3, 0x00000ebd, 0x00000ebd,
+	0x00000ec0, 0x00000ec4, 0x00000ec6, 0x00000ec6,
+	0x00000ed0, 0x00000ed9, 0x00000edc, 0x00000edf,
+	0x00000f00, 0x00000f17, 0x00000f1a, 0x00000f34,
+	0x00000f36, 0x00000f36, 0x00000f38, 0x00000f38,
+	0x00000f3e, 0x00000f47, 0x00000f49, 0x00000f6c,
+	0x00000f7f, 0x00000f7f, 0x00000f85, 0x00000f85,
+	0x00000f88, 0x00000f8c, 0x00000fbe, 0x00000fc5,
+	0x00000fc7, 0x00000fcc, 0x00000fce, 0x00000fda,
+	0x00001000, 0x0000102c, 0x00001031, 0x00001031,
+	0x00001038, 0x00001038, 0x0000103b, 0x0000103c,
+	0x0000103f, 0x00001057, 0x0000105a, 0x0000105d,
+	0x00001061, 0x00001070, 0x00001075, 0x00001081,
+	0x00001083, 0x00001084, 0x00001087, 0x0000108c,
+	0x0000108e, 0x0000109c, 0x0000109e, 0x000010c5,
+	0x000010c7, 0x000010c7, 0x000010cd, 0x000010cd,
+	0x000010d0, 0x00001248, 0x0000124a, 0x0000124d,
+	0x00001250, 0x00001256, 0x00001258, 0x00001258,
+	0x0000125a, 0x0000125d, 0x00001260, 0x00001288,
+	0x0000128a, 0x0000128d, 0x00001290, 0x000012b0,
+	0x000012b2, 0x000012b5, 0x000012b8, 0x000012be,
+	0x000012c0, 0x000012c0, 0x000012c2, 0x000012c5,
+	0x000012c8, 0x000012d6, 0x000012d8, 0x00001310,
+	0x00001312, 0x00001315, 0x00001318, 0x0000135a,
+	0x00001360, 0x0000137c, 0x00001380, 0x0000138f,
+	0x000013a0, 0x000013f5, 0x000013f8, 0x000013fd,
+	0x00001401, 0x0000167f, 0x00001681, 0x0000169a,
+	0x000016a0, 0x000016f8, 0x00001700, 0x00001711,
+	0x00001715, 0x00001715, 0x0000171f, 0x00001731,
+	0x00001734, 0x00001736, 0x00001740, 0x00001751,
+	0x00001760, 0x0000176c, 0x0000176e, 0x00001770,
+	0x00001780, 0x000017b3, 0x000017b6, 0x000017b6,
+	0x000017be, 0x000017c5, 0x000017c7, 0x000017c8,
+	0x000017d4, 0x000017da, 0x000017dc, 0x000017dc,
+	0x000017e0, 0x000017e9, 0x00001810, 0x00001819,
+	0x00001820, 0x00001878, 0x00001880, 0x00001884,
+	0x00001887, 0x000018a8, 0x000018aa, 0x000018aa,
+	0x000018b0, 0x000018f5, 0x00001900, 0x0000191e,
+	0x00001923, 0x00001926, 0x00001929, 0x0000192b,
+	0x00001930, 0x00001931, 0x00001933, 0x00001938,
+	0x00001946, 0x0000196d, 0x00001970, 0x00001974,
+	0x00001980, 0x000019ab, 0x000019b0, 0x000019c9,
+	0x000019d0, 0x000019da, 0x00001a00, 0x00001a16,
+	0x00001a19, 0x00001a1a, 0x00001a1e, 0x00001a55,
+	0x00001a57, 0x00001a57, 0x00001a61, 0x00001a61,
+	0x00001a63, 0x00001a64, 0x00001a6d, 0x00001a72,
+	0x00001a80, 0x00001a89, 0x00001a90, 0x00001a99,
+	0x00001aa0, 0x00001aad, 0x00001b04, 0x00001b33,
+	0x00001b35, 0x00001b35, 0x00001b3b, 0x00001b3b,
+	0x00001b3d, 0x00001b41, 0x00001b43, 0x00001b4c,
+	0x00001b4e, 0x00001b6a, 0x00001b74, 0x00001b7f,
+	0x00001b82, 0x00001ba1, 0x00001ba6, 0x00001ba7,
+	0x00001baa, 0x00001baa, 0x00001bae, 0x00001be5,
+	0x00001be7, 0x00001be7, 0x00001bea, 0x00001bec,
+	0x00001bee, 0x00001bee, 0x00001bf2, 0x00001bf3,
+	0x00001bfc, 0x00001c2b, 0x00001c34, 0x00001c35,
+	0x00001c3b, 0x00001c49, 0x00001c4d, 0x00001c8a,
+	0x00001c90, 0x00001cba, 0x00001cbd, 0x00001cc7,
+	0x00001cd3, 0x00001cd3, 0x00001ce1, 0x00001ce1,
+	0x00001ce9, 0x00001cec, 0x00001cee, 0x00001cf3,
+	0x00001cf5, 0x00001cf7, 0x00001cfa, 0x00001cfa,
+	0x00001d00, 0x00001dbf, 0x00001e00, 0x00001f15,
+	0x00001f18, 0x00001f1d, 0x00001f20, 0x00001f45,
+	0x00001f48, 0x00001f4d, 0x00001f50, 0x00001f57,
+	0x00001f59, 0x00001f59, 0x00001f5b, 0x00001f5b,
+	0x00001f5d, 0x00001f5d, 0x00001f5f, 0x00001f7d,
+	0x00001f80, 0x00001fb4, 0x00001fb6, 0x00001fbc,
+	0x00001fbe, 0x00001fbe, 0x00001fc2, 0x00001fc4,
+	0x00001fc6, 0x00001fcc, 0x00001fd0, 0x00001fd3,
+	0x00001fd6, 0x00001fdb, 0x00001fe0, 0x00001fec,
+	0x00001ff2, 0x00001ff4, 0x00001ff6, 0x00001ffc,
+	0x0000200e, 0x0000200e, 0x00002071, 0x00002071,
+	0x0000207f, 0x0000207f, 0x00002090, 0x0000209c,
+	0x00002102, 0x00002102, 0x00002107, 0x00002107,
+	0x0000210a, 0x00002113, 0x00002115, 0x00002115,
+	0x00002119, 0x0000211d, 0x00002124, 0x00002124,
+	0x00002126, 0x00002126, 0x00002128, 0x00002128,
+	0x0000212a, 0x0000212d, 0x0000212f, 0x00002139,
+	0x0000213c, 0x0000213f, 0x00002145, 0x00002149,
+	0x0000214e, 0x0000214f, 0x00002160, 0x00002188,
+	0x00002336, 0x0000237a, 0x00002395, 0x00002395,
+	0x0000249c, 0x000024e9, 0x000026ac, 0x000026ac,
+	0x00002800, 0x000028ff, 0x00002c00, 0x00002ce4,
+	0x00002ceb, 0x00002cee, 0x00002cf2, 0x00002cf3,
+	0x00002d00, 0x00002d25, 0x00002d27, 0x00002d27,
+	0x00002d2d, 0x00002d2d, 0x00002d30, 0x00002d67,
+	0x00002d6f, 0x00002d70, 0x00002d80, 0x00002d96,
+	0x00002da0, 0x00002da6, 0x00002da8, 0x00002dae,
+	0x00002db0, 0x00002db6, 0x00002db8, 0x00002dbe,
+	0x00002dc0, 0x00002dc6, 0x00002dc8, 0x00002dce,
+	0x00002dd0, 0x00002dd6, 0x00002dd8, 0x00002dde,
+	0x00003005, 0x00003007, 0x00003021, 0x00003029,
+	0x0000302e, 0x0000302f, 0x00003031, 0x00003035,
+	0x00003038, 0x0000303c, 0x00003041, 0x00003096,
+	0x0000309d, 0x0000309f, 0x000030a1, 0x000030fa,
+	0x000030fc, 0x000030ff, 0x00003105, 0x0000312f,
+	0x00003131, 0x0000318e, 0x00003190, 0x000031bf,
+	0x000031f0, 0x0000321c, 0x00003220, 0x0000324f,
+	0x00003260, 0x0000327b, 0x0000327f, 0x000032b0,
+	0x000032c0, 0x000032cb, 0x000032d0, 0x00003376,
+	0x0000337b, 0x000033dd, 0x000033e0, 0x000033fe,
+	0x00003400, 0x00004dbf, 0x00004e00, 0x0000a48c,
+	0x0000a4d0, 0x0000a60c, 0x0000a610, 0x0000a62b,
+	0x0000a640, 0x0000a66e, 0x0000a680, 0x0000a69d,
+	0x0000a6a0, 0x0000a6ef, 0x0000a6f2, 0x0000a6f7,
+	0x0000a722, 0x0000a787, 0x0000a789, 0x0000a7cd,
+	0x0000a7d0, 0x0000a7d1, 0x0000a7d3, 0x0000a7d3,
+	0x0000a7d5, 0x0000a7dc, 0x0000a7f2, 0x0000a801,
+	0x0000a803, 0x0000a805, 0x0000a807, 0x0000a80a,
+	0x0000a80c, 0x0000a824, 0x0000a827, 0x0000a827,
+	0x0000a830, 0x0000a837, 0x0000a840, 0x0000a873,
+	0x0000a880, 0x0000a8c3, 0x0000a8ce, 0x0000a8d9,
+	0x0000a8f2, 0x0000a8fe, 0x0000a900, 0x0000a925,
+	0x0000a92e, 0x0000a946, 0x0000a952, 0x0000a953,
+	0x0000a95f, 0x0000a97c, 0x0000a983, 0x0000a9b2,
+	0x0000a9b4, 0x0000a9b5, 0x0000a9ba, 0x0000a9bb,
+	0x0000a9be, 0x0000a9cd, 0x0000a9cf, 0x0000a9d9,
+	0x0000a9de, 0x0000a9e4, 0x0000a9e6, 0x0000a9fe,
+	0x0000aa00, 0x0000aa28, 0x0000aa2f, 0x0000aa30,
+	0x0000aa33, 0x0000aa34, 0x0000aa40, 0x0000aa42,
+	0x0000aa44, 0x0000aa4b, 0x0000aa4d, 0x0000aa4d,
+	0x0000aa50, 0x0000aa59, 0x0000aa5c, 0x0000aa7b,
+	0x0000aa7d, 0x0000aaaf, 0x0000aab1, 0x0000aab1,
+	0x0000aab5, 0x0000aab6, 0x0000aab9, 0x0000aabd,
+	0x0000aac0, 0x0000aac0, 0x0000aac2, 0x0000aac2,
+	0x0000aadb, 0x0000aaeb, 0x0000aaee, 0x0000aaf5,
+	0x0000ab01, 0x0000ab06, 0x0000ab09, 0x0000ab0e,
+	0x0000ab11, 0x0000ab16, 0x0000ab20, 0x0000ab26,
+	0x0000ab28, 0x0000ab2e, 0x0000ab30, 0x0000ab69,
+	0x0000ab70, 0x0000abe4, 0x0000abe6, 0x0000abe7,
+	0x0000abe9, 0x0000abec, 0x0000abf0, 0x0000abf9,
+	0x0000ac00, 0x0000d7a3, 0x0000d7b0, 0x0000d7c6,
+	0x0000d7cb, 0x0000d7fb, 0x0000d800, 0x0000fa6d,
+	0x0000fa70, 0x0000fad9, 0x0000fb00, 0x0000fb06,
+	0x0000fb13, 0x0000fb17, 0x0000ff21, 0x0000ff3a,
+	0x0000ff41, 0x0000ff5a, 0x0000ff66, 0x0000ffbe,
+	0x0000ffc2, 0x0000ffc7, 0x0000ffca, 0x0000ffcf,
+	0x0000ffd2, 0x0000ffd7, 0x0000ffda, 0x0000ffdc,
+	0x00010000, 0x0001000b, 0x0001000d, 0x00010026,
+	0x00010028, 0x0001003a, 0x0001003c, 0x0001003d,
+	0x0001003f, 0x0001004d, 0x00010050, 0x0001005d,
+	0x00010080, 0x000100fa, 0x00010100, 0x00010100,
+	0x00010102, 0x00010102, 0x00010107, 0x00010133,
+	0x00010137, 0x0001013f, 0x0001018d, 0x0001018e,
+	0x000101d0, 0x000101fc, 0x00010280, 0x0001029c,
+	0x000102a0, 0x000102d0, 0x00010300, 0x00010323,
+	0x0001032d, 0x0001034a, 0x00010350, 0x00010375,
+	0x00010380, 0x0001039d, 0x0001039f, 0x000103c3,
+	0x000103c8, 0x000103d5, 0x00010400, 0x0001049d,
+	0x000104a0, 0x000104a9, 0x000104b0, 0x000104d3,
+	0x000104d8, 0x000104fb, 0x00010500, 0x00010527,
+	0x00010530, 0x00010563, 0x0001056f, 0x0001057a,
+	0x0001057c, 0x0001058a, 0x0001058c, 0x00010592,
+	0x00010594, 0x00010595, 0x00010597, 0x000105a1,
+	0x000105a3, 0x000105b1, 0x000105b3, 0x000105b9,
+	0x000105bb, 0x000105bc, 0x000105c0, 0x000105f3,
 	0x00010600, 0x00010736, 0x00010740, 0x00010755,
 	0x00010760, 0x00010767, 0x00010780, 0x00010785,
 	0x00010787, 0x000107b0, 0x000107b2, 0x000107ba,
@@ -1732,67 +1762,78 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00011341, 0x00011344, 0x00011347, 0x00011348,
 	0x0001134b, 0x0001134d, 0x00011350, 0x00011350,
 	0x00011357, 0x00011357, 0x0001135d, 0x00011363,
-	0x00011400, 0x00011437, 0x00011440, 0x00011441,
-	0x00011445, 0x00011445, 0x00011447, 0x0001145b,
-	0x0001145d, 0x0001145d, 0x0001145f, 0x00011461,
-	0x00011480, 0x000114b2, 0x000114b9, 0x000114b9,
-	0x000114bb, 0x000114be, 0x000114c1, 0x000114c1,
-	0x000114c4, 0x000114c7, 0x000114d0, 0x000114d9,
-	0x00011580, 0x000115b1, 0x000115b8, 0x000115bb,
-	0x000115be, 0x000115be, 0x000115c1, 0x000115db,
-	0x00011600, 0x00011632, 0x0001163b, 0x0001163c,
-	0x0001163e, 0x0001163e, 0x00011641, 0x00011644,
-	0x00011650, 0x00011659, 0x00011680, 0x000116aa,
-	0x000116ac, 0x000116ac, 0x000116ae, 0x000116af,
-	0x000116b6, 0x000116b6, 0x000116b8, 0x000116b9,
-	0x000116c0, 0x000116c9, 0x00011700, 0x0001171a,
-	0x00011720, 0x00011721, 0x00011726, 0x00011726,
-	0x00011730, 0x00011746, 0x00011800, 0x0001182e,
-	0x00011838, 0x00011838, 0x0001183b, 0x0001183b,
-	0x000118a0, 0x000118f2, 0x000118ff, 0x00011906,
-	0x00011909, 0x00011909, 0x0001190c, 0x00011913,
-	0x00011915, 0x00011916, 0x00011918, 0x00011935,
-	0x00011937, 0x00011938, 0x0001193d, 0x0001193d,
-	0x0001193f, 0x00011942, 0x00011944, 0x00011946,
-	0x00011950, 0x00011959, 0x000119a0, 0x000119a7,
-	0x000119aa, 0x000119d3, 0x000119dc, 0x000119df,
-	0x000119e1, 0x000119e4, 0x00011a00, 0x00011a00,
-	0x00011a07, 0x00011a08, 0x00011a0b, 0x00011a32,
-	0x00011a39, 0x00011a3a, 0x00011a3f, 0x00011a46,
-	0x00011a50, 0x00011a50, 0x00011a57, 0x00011a58,
-	0x00011a5c, 0x00011a89, 0x00011a97, 0x00011a97,
-	0x00011a9a, 0x00011aa2, 0x00011ab0, 0x00011af8,
-	0x00011b00, 0x00011b09, 0x00011c00, 0x00011c08,
-	0x00011c0a, 0x00011c2f, 0x00011c3e, 0x00011c45,
-	0x00011c50, 0x00011c6c, 0x00011c70, 0x00011c8f,
-	0x00011ca9, 0x00011ca9, 0x00011cb1, 0x00011cb1,
-	0x00011cb4, 0x00011cb4, 0x00011d00, 0x00011d06,
-	0x00011d08, 0x00011d09, 0x00011d0b, 0x00011d30,
-	0x00011d46, 0x00011d46, 0x00011d50, 0x00011d59,
-	0x00011d60, 0x00011d65, 0x00011d67, 0x00011d68,
-	0x00011d6a, 0x00011d8e, 0x00011d93, 0x00011d94,
-	0x00011d96, 0x00011d96, 0x00011d98, 0x00011d98,
-	0x00011da0, 0x00011da9, 0x00011ee0, 0x00011ef2,
-	0x00011ef5, 0x00011ef8, 0x00011f02, 0x00011f10,
-	0x00011f12, 0x00011f35, 0x00011f3e, 0x00011f3f,
-	0x00011f41, 0x00011f41, 0x00011f43, 0x00011f59,
-	0x00011fb0, 0x00011fb0, 0x00011fc0, 0x00011fd4,
-	0x00011fff, 0x00012399, 0x00012400, 0x0001246e,
-	0x00012470, 0x00012474, 0x00012480, 0x00012543,
-	0x00012f90, 0x00012ff2, 0x00013000, 0x0001343f,
-	0x00013441, 0x00013446, 0x00014400, 0x00014646,
-	0x00016800, 0x00016a38, 0x00016a40, 0x00016a5e,
-	0x00016a60, 0x00016a69, 0x00016a6e, 0x00016abe,
-	0x00016ac0, 0x00016ac9, 0x00016ad0, 0x00016aed,
-	0x00016af5, 0x00016af5, 0x00016b00, 0x00016b2f,
-	0x00016b37, 0x00016b45, 0x00016b50, 0x00016b59,
-	0x00016b5b, 0x00016b61, 0x00016b63, 0x00016b77,
-	0x00016b7d, 0x00016b8f, 0x00016e40, 0x00016e9a,
+	0x00011380, 0x00011389, 0x0001138b, 0x0001138b,
+	0x0001138e, 0x0001138e, 0x00011390, 0x000113b5,
+	0x000113b7, 0x000113ba, 0x000113c2, 0x000113c2,
+	0x000113c5, 0x000113c5, 0x000113c7, 0x000113ca,
+	0x000113cc, 0x000113cd, 0x000113cf, 0x000113cf,
+	0x000113d1, 0x000113d1, 0x000113d3, 0x000113d5,
+	0x000113d7, 0x000113d8, 0x00011400, 0x00011437,
+	0x00011440, 0x00011441, 0x00011445, 0x00011445,
+	0x00011447, 0x0001145b, 0x0001145d, 0x0001145d,
+	0x0001145f, 0x00011461, 0x00011480, 0x000114b2,
+	0x000114b9, 0x000114b9, 0x000114bb, 0x000114be,
+	0x000114c1, 0x000114c1, 0x000114c4, 0x000114c7,
+	0x000114d0, 0x000114d9, 0x00011580, 0x000115b1,
+	0x000115b8, 0x000115bb, 0x000115be, 0x000115be,
+	0x000115c1, 0x000115db, 0x00011600, 0x00011632,
+	0x0001163b, 0x0001163c, 0x0001163e, 0x0001163e,
+	0x00011641, 0x00011644, 0x00011650, 0x00011659,
+	0x00011680, 0x000116aa, 0x000116ac, 0x000116ac,
+	0x000116ae, 0x000116af, 0x000116b6, 0x000116b6,
+	0x000116b8, 0x000116b9, 0x000116c0, 0x000116c9,
+	0x000116d0, 0x000116e3, 0x00011700, 0x0001171a,
+	0x0001171e, 0x0001171e, 0x00011720, 0x00011721,
+	0x00011726, 0x00011726, 0x00011730, 0x00011746,
+	0x00011800, 0x0001182e, 0x00011838, 0x00011838,
+	0x0001183b, 0x0001183b, 0x000118a0, 0x000118f2,
+	0x000118ff, 0x00011906, 0x00011909, 0x00011909,
+	0x0001190c, 0x00011913, 0x00011915, 0x00011916,
+	0x00011918, 0x00011935, 0x00011937, 0x00011938,
+	0x0001193d, 0x0001193d, 0x0001193f, 0x00011942,
+	0x00011944, 0x00011946, 0x00011950, 0x00011959,
+	0x000119a0, 0x000119a7, 0x000119aa, 0x000119d3,
+	0x000119dc, 0x000119df, 0x000119e1, 0x000119e4,
+	0x00011a00, 0x00011a00, 0x00011a07, 0x00011a08,
+	0x00011a0b, 0x00011a32, 0x00011a39, 0x00011a3a,
+	0x00011a3f, 0x00011a46, 0x00011a50, 0x00011a50,
+	0x00011a57, 0x00011a58, 0x00011a5c, 0x00011a89,
+	0x00011a97, 0x00011a97, 0x00011a9a, 0x00011aa2,
+	0x00011ab0, 0x00011af8, 0x00011b00, 0x00011b09,
+	0x00011bc0, 0x00011be1, 0x00011bf0, 0x00011bf9,
+	0x00011c00, 0x00011c08, 0x00011c0a, 0x00011c2f,
+	0x00011c3e, 0x00011c45, 0x00011c50, 0x00011c6c,
+	0x00011c70, 0x00011c8f, 0x00011ca9, 0x00011ca9,
+	0x00011cb1, 0x00011cb1, 0x00011cb4, 0x00011cb4,
+	0x00011d00, 0x00011d06, 0x00011d08, 0x00011d09,
+	0x00011d0b, 0x00011d30, 0x00011d46, 0x00011d46,
+	0x00011d50, 0x00011d59, 0x00011d60, 0x00011d65,
+	0x00011d67, 0x00011d68, 0x00011d6a, 0x00011d8e,
+	0x00011d93, 0x00011d94, 0x00011d96, 0x00011d96,
+	0x00011d98, 0x00011d98, 0x00011da0, 0x00011da9,
+	0x00011ee0, 0x00011ef2, 0x00011ef5, 0x00011ef8,
+	0x00011f02, 0x00011f10, 0x00011f12, 0x00011f35,
+	0x00011f3e, 0x00011f3f, 0x00011f41, 0x00011f41,
+	0x00011f43, 0x00011f59, 0x00011fb0, 0x00011fb0,
+	0x00011fc0, 0x00011fd4, 0x00011fff, 0x00012399,
+	0x00012400, 0x0001246e, 0x00012470, 0x00012474,
+	0x00012480, 0x00012543, 0x00012f90, 0x00012ff2,
+	0x00013000, 0x0001343f, 0x00013441, 0x00013446,
+	0x00013460, 0x000143fa, 0x00014400, 0x00014646,
+	0x00016100, 0x0001611d, 0x0001612a, 0x0001612c,
+	0x00016130, 0x00016139, 0x00016800, 0x00016a38,
+	0x00016a40, 0x00016a5e, 0x00016a60, 0x00016a69,
+	0x00016a6e, 0x00016abe, 0x00016ac0, 0x00016ac9,
+	0x00016ad0, 0x00016aed, 0x00016af5, 0x00016af5,
+	0x00016b00, 0x00016b2f, 0x00016b37, 0x00016b45,
+	0x00016b50, 0x00016b59, 0x00016b5b, 0x00016b61,
+	0x00016b63, 0x00016b77, 0x00016b7d, 0x00016b8f,
+	0x00016d40, 0x00016d79, 0x00016e40, 0x00016e9a,
 	0x00016f00, 0x00016f4a, 0x00016f50, 0x00016f87,
 	0x00016f93, 0x00016f9f, 0x00016fe0, 0x00016fe1,
 	0x00016fe3, 0x00016fe3, 0x00016ff0, 0x00016ff1,
 	0x00017000, 0x000187f7, 0x00018800, 0x00018cd5,
-	0x00018d00, 0x00018d08, 0x0001aff0, 0x0001aff3,
+	0x00018cff, 0x00018d08, 0x0001aff0, 0x0001aff3,
 	0x0001aff5, 0x0001affb, 0x0001affd, 0x0001affe,
 	0x0001b000, 0x0001b122, 0x0001b132, 0x0001b132,
 	0x0001b150, 0x0001b152, 0x0001b155, 0x0001b155,
@@ -1800,24 +1841,27 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0001bc00, 0x0001bc6a, 0x0001bc70, 0x0001bc7c,
 	0x0001bc80, 0x0001bc88, 0x0001bc90, 0x0001bc99,
 	0x0001bc9c, 0x0001bc9c, 0x0001bc9f, 0x0001bc9f,
-	0x0001cf50, 0x0001cfc3, 0x0001d000, 0x0001d0f5,
-	0x0001d100, 0x0001d126, 0x0001d129, 0x0001d166,
-	0x0001d16a, 0x0001d172, 0x0001d183, 0x0001d184,
-	0x0001d18c, 0x0001d1a9, 0x0001d1ae, 0x0001d1e8,
-	0x0001d2c0, 0x0001d2d3, 0x0001d2e0, 0x0001d2f3,
-	0x0001d360, 0x0001d378, 0x0001d400, 0x0001d454,
-	0x0001d456, 0x0001d49c, 0x0001d49e, 0x0001d49f,
-	0x0001d4a2, 0x0001d4a2, 0x0001d4a5, 0x0001d4a6,
-	0x0001d4a9, 0x0001d4ac, 0x0001d4ae, 0x0001d4b9,
-	0x0001d4bb, 0x0001d4bb, 0x0001d4bd, 0x0001d4c3,
-	0x0001d4c5, 0x0001d505, 0x0001d507, 0x0001d50a,
-	0x0001d50d, 0x0001d514, 0x0001d516, 0x0001d51c,
-	0x0001d51e, 0x0001d539, 0x0001d53b, 0x0001d53e,
-	0x0001d540, 0x0001d544, 0x0001d546, 0x0001d546,
-	0x0001d54a, 0x0001d550, 0x0001d552, 0x0001d6a5,
-	0x0001d6a8, 0x0001d6da, 0x0001d6dc, 0x0001d714,
-	0x0001d716, 0x0001d74e, 0x0001d750, 0x0001d788,
-	0x0001d78a, 0x0001d7c2, 0x0001d7c4, 0x0001d7cb,
+	0x0001ccd6, 0x0001ccef, 0x0001cf50, 0x0001cfc3,
+	0x0001d000, 0x0001d0f5, 0x0001d100, 0x0001d126,
+	0x0001d129, 0x0001d166, 0x0001d16a, 0x0001d172,
+	0x0001d183, 0x0001d184, 0x0001d18c, 0x0001d1a9,
+	0x0001d1ae, 0x0001d1e8, 0x0001d2c0, 0x0001d2d3,
+	0x0001d2e0, 0x0001d2f3, 0x0001d360, 0x0001d378,
+	0x0001d400, 0x0001d454, 0x0001d456, 0x0001d49c,
+	0x0001d49e, 0x0001d49f, 0x0001d4a2, 0x0001d4a2,
+	0x0001d4a5, 0x0001d4a6, 0x0001d4a9, 0x0001d4ac,
+	0x0001d4ae, 0x0001d4b9, 0x0001d4bb, 0x0001d4bb,
+	0x0001d4bd, 0x0001d4c3, 0x0001d4c5, 0x0001d505,
+	0x0001d507, 0x0001d50a, 0x0001d50d, 0x0001d514,
+	0x0001d516, 0x0001d51c, 0x0001d51e, 0x0001d539,
+	0x0001d53b, 0x0001d53e, 0x0001d540, 0x0001d544,
+	0x0001d546, 0x0001d546, 0x0001d54a, 0x0001d550,
+	0x0001d552, 0x0001d6a5, 0x0001d6a8, 0x0001d6c0,
+	0x0001d6c2, 0x0001d6da, 0x0001d6dc, 0x0001d6fa,
+	0x0001d6fc, 0x0001d714, 0x0001d716, 0x0001d734,
+	0x0001d736, 0x0001d74e, 0x0001d750, 0x0001d76e,
+	0x0001d770, 0x0001d788, 0x0001d78a, 0x0001d7a8,
+	0x0001d7aa, 0x0001d7c2, 0x0001d7c4, 0x0001d7cb,
 	0x0001d800, 0x0001d9ff, 0x0001da37, 0x0001da3a,
 	0x0001da6d, 0x0001da74, 0x0001da76, 0x0001da83,
 	0x0001da85, 0x0001da8b, 0x0001df00, 0x0001df1e,
@@ -1826,47 +1870,50 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0001e140, 0x0001e149, 0x0001e14e, 0x0001e14f,
 	0x0001e290, 0x0001e2ad, 0x0001e2c0, 0x0001e2eb,
 	0x0001e2f0, 0x0001e2f9, 0x0001e4d0, 0x0001e4eb,
-	0x0001e4f0, 0x0001e4f9, 0x0001e7e0, 0x0001e7e6,
-	0x0001e7e8, 0x0001e7eb, 0x0001e7ed, 0x0001e7ee,
-	0x0001e7f0, 0x0001e7fe, 0x0001f110, 0x0001f12e,
-	0x0001f130, 0x0001f169, 0x0001f170, 0x0001f1ac,
-	0x0001f1e6, 0x0001f202, 0x0001f210, 0x0001f23b,
-	0x0001f240, 0x0001f248, 0x0001f250, 0x0001f251,
-	0x00020000, 0x0002a6df, 0x0002a700, 0x0002b739,
-	0x0002b740, 0x0002b81d, 0x0002b820, 0x0002cea1,
-	0x0002ceb0, 0x0002ebe0, 0x0002ebf0, 0x0002ee5d,
-	0x0002f800, 0x0002fa1d, 0x00030000, 0x0003134a,
-	0x00031350, 0x000323af, 0x000f0000, 0x000ffffd,
-	0x00100000, 0x0010fffd, 0x000005be, 0x000005be,
-	0x000005c0, 0x000005c0, 0x000005c3, 0x000005c3,
-	0x000005c6, 0x000005c6, 0x000005d0, 0x000005ea,
-	0x000005ef, 0x000005f4, 0x000007c0, 0x000007ea,
-	0x000007f4, 0x000007f5, 0x000007fa, 0x000007fa,
-	0x000007fe, 0x00000815, 0x0000081a, 0x0000081a,
-	0x00000824, 0x00000824, 0x00000828, 0x00000828,
-	0x00000830, 0x0000083e, 0x00000840, 0x00000858,
-	0x0000085e, 0x0000085e, 0x0000200f, 0x0000200f,
-	0x0000fb1d, 0x0000fb1d, 0x0000fb1f, 0x0000fb28,
-	0x0000fb2a, 0x0000fb36, 0x0000fb38, 0x0000fb3c,
-	0x0000fb3e, 0x0000fb3e, 0x0000fb40, 0x0000fb41,
-	0x0000fb43, 0x0000fb44, 0x0000fb46, 0x0000fb4f,
-	0x00010800, 0x00010805, 0x00010808, 0x00010808,
-	0x0001080a, 0x00010835, 0x00010837, 0x00010838,
-	0x0001083c, 0x0001083c, 0x0001083f, 0x00010855,
-	0x00010857, 0x0001089e, 0x000108a7, 0x000108af,
-	0x000108e0, 0x000108f2, 0x000108f4, 0x000108f5,
-	0x000108fb, 0x0001091b, 0x00010920, 0x00010939,
-	0x0001093f, 0x0001093f, 0x00010980, 0x000109b7,
-	0x000109bc, 0x000109cf, 0x000109d2, 0x00010a00,
-	0x00010a10, 0x00010a13, 0x00010a15, 0x00010a17,
-	0x00010a19, 0x00010a35, 0x00010a40, 0x00010a48,
-	0x00010a50, 0x00010a58, 0x00010a60, 0x00010a9f,
-	0x00010ac0, 0x00010ae4, 0x00010aeb, 0x00010af6,
-	0x00010b00, 0x00010b35, 0x00010b40, 0x00010b55,
-	0x00010b58, 0x00010b72, 0x00010b78, 0x00010b91,
-	0x00010b99, 0x00010b9c, 0x00010ba9, 0x00010baf,
-	0x00010c00, 0x00010c48, 0x00010c80, 0x00010cb2,
-	0x00010cc0, 0x00010cf2, 0x00010cfa, 0x00010cff,
+	0x0001e4f0, 0x0001e4f9, 0x0001e5d0, 0x0001e5ed,
+	0x0001e5f0, 0x0001e5fa, 0x0001e5ff, 0x0001e5ff,
+	0x0001e7e0, 0x0001e7e6, 0x0001e7e8, 0x0001e7eb,
+	0x0001e7ed, 0x0001e7ee, 0x0001e7f0, 0x0001e7fe,
+	0x0001f110, 0x0001f12e, 0x0001f130, 0x0001f169,
+	0x0001f170, 0x0001f1ac, 0x0001f1e6, 0x0001f202,
+	0x0001f210, 0x0001f23b, 0x0001f240, 0x0001f248,
+	0x0001f250, 0x0001f251, 0x00020000, 0x0002a6df,
+	0x0002a700, 0x0002b739, 0x0002b740, 0x0002b81d,
+	0x0002b820, 0x0002cea1, 0x0002ceb0, 0x0002ebe0,
+	0x0002ebf0, 0x0002ee5d, 0x0002f800, 0x0002fa1d,
+	0x00030000, 0x0003134a, 0x00031350, 0x000323af,
+	0x000f0000, 0x000ffffd, 0x00100000, 0x0010fffd,
+	0x000005be, 0x000005be, 0x000005c0, 0x000005c0,
+	0x000005c3, 0x000005c3, 0x000005c6, 0x000005c6,
+	0x000005d0, 0x000005ea, 0x000005ef, 0x000005f4,
+	0x000007c0, 0x000007ea, 0x000007f4, 0x000007f5,
+	0x000007fa, 0x000007fa, 0x000007fe, 0x00000815,
+	0x0000081a, 0x0000081a, 0x00000824, 0x00000824,
+	0x00000828, 0x00000828, 0x00000830, 0x0000083e,
+	0x00000840, 0x00000858, 0x0000085e, 0x0000085e,
+	0x0000200f, 0x0000200f, 0x0000fb1d, 0x0000fb1d,
+	0x0000fb1f, 0x0000fb28, 0x0000fb2a, 0x0000fb36,
+	0x0000fb38, 0x0000fb3c, 0x0000fb3e, 0x0000fb3e,
+	0x0000fb40, 0x0000fb41, 0x0000fb43, 0x0000fb44,
+	0x0000fb46, 0x0000fb4f, 0x00010800, 0x00010805,
+	0x00010808, 0x00010808, 0x0001080a, 0x00010835,
+	0x00010837, 0x00010838, 0x0001083c, 0x0001083c,
+	0x0001083f, 0x00010855, 0x00010857, 0x0001089e,
+	0x000108a7, 0x000108af, 0x000108e0, 0x000108f2,
+	0x000108f4, 0x000108f5, 0x000108fb, 0x0001091b,
+	0x00010920, 0x00010939, 0x0001093f, 0x0001093f,
+	0x00010980, 0x000109b7, 0x000109bc, 0x000109cf,
+	0x000109d2, 0x00010a00, 0x00010a10, 0x00010a13,
+	0x00010a15, 0x00010a17, 0x00010a19, 0x00010a35,
+	0x00010a40, 0x00010a48, 0x00010a50, 0x00010a58,
+	0x00010a60, 0x00010a9f, 0x00010ac0, 0x00010ae4,
+	0x00010aeb, 0x00010af6, 0x00010b00, 0x00010b35,
+	0x00010b40, 0x00010b55, 0x00010b58, 0x00010b72,
+	0x00010b78, 0x00010b91, 0x00010b99, 0x00010b9c,
+	0x00010ba9, 0x00010baf, 0x00010c00, 0x00010c48,
+	0x00010c80, 0x00010cb2, 0x00010cc0, 0x00010cf2,
+	0x00010cfa, 0x00010cff, 0x00010d4a, 0x00010d65,
+	0x00010d6f, 0x00010d85, 0x00010d8e, 0x00010d8f,
 	0x00010e80, 0x00010ea9, 0x00010ead, 0x00010ead,
 	0x00010eb0, 0x00010eb1, 0x00010f00, 0x00010f27,
 	0x00010f70, 0x00010f81, 0x00010f86, 0x00010f89,
@@ -1879,28 +1926,29 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00002070, 0x00002070, 0x00002074, 0x00002079,
 	0x00002080, 0x00002089, 0x00002488, 0x0000249b,
 	0x0000ff10, 0x0000ff19, 0x000102e1, 0x000102fb,
-	0x0001d7ce, 0x0001d7ff, 0x0001f100, 0x0001f10a,
-	0x0001fbf0, 0x0001fbf9, 0x0000002b, 0x0000002b,
-	0x0000002d, 0x0000002d, 0x0000207a, 0x0000207b,
-	0x0000208a, 0x0000208b, 0x00002212, 0x00002212,
-	0x0000fb29, 0x0000fb29, 0x0000fe62, 0x0000fe63,
-	0x0000ff0b, 0x0000ff0b, 0x0000ff0d, 0x0000ff0d,
-	0x00000023, 0x00000025, 0x000000a2, 0x000000a5,
-	0x000000b0, 0x000000b1, 0x0000058f, 0x0000058f,
-	0x00000609, 0x0000060a, 0x0000066a, 0x0000066a,
-	0x000009f2, 0x000009f3, 0x000009fb, 0x000009fb,
-	0x00000af1, 0x00000af1, 0x00000bf9, 0x00000bf9,
-	0x00000e3f, 0x00000e3f, 0x000017db, 0x000017db,
-	0x00002030, 0x00002034, 0x000020a0, 0x000020c0,
-	0x0000212e, 0x0000212e, 0x00002213, 0x00002213,
-	0x0000a838, 0x0000a839, 0x0000fe5f, 0x0000fe5f,
-	0x0000fe69, 0x0000fe6a, 0x0000ff03, 0x0000ff05,
-	0x0000ffe0, 0x0000ffe1, 0x0000ffe5, 0x0000ffe6,
-	0x00011fdd, 0x00011fe0, 0x0001e2ff, 0x0001e2ff,
-	0x00000600, 0x00000605, 0x00000660, 0x00000669,
-	0x0000066b, 0x0000066c, 0x000006dd, 0x000006dd,
-	0x00000890, 0x00000891, 0x000008e2, 0x000008e2,
-	0x00010d30, 0x00010d39, 0x00010e60, 0x00010e7e,
+	0x0001ccf0, 0x0001ccf9, 0x0001d7ce, 0x0001d7ff,
+	0x0001f100, 0x0001f10a, 0x0001fbf0, 0x0001fbf9,
+	0x0000002b, 0x0000002b, 0x0000002d, 0x0000002d,
+	0x0000207a, 0x0000207b, 0x0000208a, 0x0000208b,
+	0x00002212, 0x00002212, 0x0000fb29, 0x0000fb29,
+	0x0000fe62, 0x0000fe63, 0x0000ff0b, 0x0000ff0b,
+	0x0000ff0d, 0x0000ff0d, 0x00000023, 0x00000025,
+	0x000000a2, 0x000000a5, 0x000000b0, 0x000000b1,
+	0x0000058f, 0x0000058f, 0x00000609, 0x0000060a,
+	0x0000066a, 0x0000066a, 0x000009f2, 0x000009f3,
+	0x000009fb, 0x000009fb, 0x00000af1, 0x00000af1,
+	0x00000bf9, 0x00000bf9, 0x00000e3f, 0x00000e3f,
+	0x000017db, 0x000017db, 0x00002030, 0x00002034,
+	0x000020a0, 0x000020c0, 0x0000212e, 0x0000212e,
+	0x00002213, 0x00002213, 0x0000a838, 0x0000a839,
+	0x0000fe5f, 0x0000fe5f, 0x0000fe69, 0x0000fe6a,
+	0x0000ff03, 0x0000ff05, 0x0000ffe0, 0x0000ffe1,
+	0x0000ffe5, 0x0000ffe6, 0x00011fdd, 0x00011fe0,
+	0x0001e2ff, 0x0001e2ff, 0x00000600, 0x00000605,
+	0x00000660, 0x00000669, 0x0000066b, 0x0000066c,
+	0x000006dd, 0x000006dd, 0x00000890, 0x00000891,
+	0x000008e2, 0x000008e2, 0x00010d30, 0x00010d39,
+	0x00010d40, 0x00010d49, 0x00010e60, 0x00010e7e,
 	0x0000002c, 0x0000002c, 0x0000002e, 0x0000002f,
 	0x0000003a, 0x0000003a, 0x000000a0, 0x000000a0,
 	0x0000060c, 0x0000060c, 0x0000202f, 0x0000202f,
@@ -1941,7 +1989,7 @@ static const unsigned int _ucprop_ranges[] = {
 	0x000007fd, 0x000007fd, 0x00000816, 0x00000819,
 	0x0000081b, 0x00000823, 0x00000825, 0x00000827,
 	0x00000829, 0x0000082d, 0x00000859, 0x0000085b,
-	0x00000898, 0x0000089f, 0x000008ca, 0x000008e1,
+	0x00000897, 0x0000089f, 0x000008ca, 0x000008e1,
 	0x000008e3, 0x00000902, 0x0000093a, 0x0000093a,
 	0x0000093c, 0x0000093c, 0x00000941, 0x00000948,
 	0x0000094d, 0x0000094d, 0x00000951, 0x00000957,
@@ -2031,7 +2079,7 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00002140, 0x00002144, 0x0000214a, 0x0000214d,
 	0x00002150, 0x0000215f, 0x00002189, 0x0000218b,
 	0x00002190, 0x00002211, 0x00002214, 0x00002335,
-	0x0000237b, 0x00002394, 0x00002396, 0x00002426,
+	0x0000237b, 0x00002394, 0x00002396, 0x00002429,
 	0x00002440, 0x0000244a, 0x00002460, 0x00002487,
 	0x000024ea, 0x000026ab, 0x000026ad, 0x000027ff,
 	0x00002900, 0x00002b73, 0x00002b76, 0x00002b95,
@@ -2044,7 +2092,7 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0000302a, 0x0000302d, 0x00003030, 0x00003030,
 	0x00003036, 0x00003037, 0x0000303d, 0x0000303f,
 	0x00003099, 0x0000309c, 0x000030a0, 0x000030a0,
-	0x000030fb, 0x000030fb, 0x000031c0, 0x000031e3,
+	0x000030fb, 0x000030fb, 0x000031c0, 0x000031e5,
 	0x000031ef, 0x000031ef, 0x0000321d, 0x0000321e,
 	0x00003250, 0x0000325f, 0x0000327c, 0x0000327e,
 	0x000032b1, 0x000032bf, 0x000032cc, 0x000032cf,
@@ -2088,23 +2136,26 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00010a05, 0x00010a06, 0x00010a0c, 0x00010a0f,
 	0x00010a38, 0x00010a3a, 0x00010a3f, 0x00010a3f,
 	0x00010ae5, 0x00010ae6, 0x00010b39, 0x00010b3f,
-	0x00010d24, 0x00010d27, 0x00010eab, 0x00010eac,
-	0x00010efd, 0x00010eff, 0x00010f46, 0x00010f50,
-	0x00010f82, 0x00010f85, 0x00011001, 0x00011001,
-	0x00011038, 0x00011046, 0x00011052, 0x00011065,
-	0x00011070, 0x00011070, 0x00011073, 0x00011074,
-	0x0001107f, 0x00011081, 0x000110b3, 0x000110b6,
-	0x000110b9, 0x000110ba, 0x000110c2, 0x000110c2,
-	0x00011100, 0x00011102, 0x00011127, 0x0001112b,
-	0x0001112d, 0x00011134, 0x00011173, 0x00011173,
-	0x00011180, 0x00011181, 0x000111b6, 0x000111be,
-	0x000111c9, 0x000111cc, 0x000111cf, 0x000111cf,
-	0x0001122f, 0x00011231, 0x00011234, 0x00011234,
-	0x00011236, 0x00011237, 0x0001123e, 0x0001123e,
-	0x00011241, 0x00011241, 0x000112df, 0x000112df,
-	0x000112e3, 0x000112ea, 0x00011300, 0x00011301,
-	0x0001133b, 0x0001133c, 0x00011340, 0x00011340,
-	0x00011366, 0x0001136c, 0x00011370, 0x00011374,
+	0x00010d24, 0x00010d27, 0x00010d69, 0x00010d6e,
+	0x00010eab, 0x00010eac, 0x00010efc, 0x00010eff,
+	0x00010f46, 0x00010f50, 0x00010f82, 0x00010f85,
+	0x00011001, 0x00011001, 0x00011038, 0x00011046,
+	0x00011052, 0x00011065, 0x00011070, 0x00011070,
+	0x00011073, 0x00011074, 0x0001107f, 0x00011081,
+	0x000110b3, 0x000110b6, 0x000110b9, 0x000110ba,
+	0x000110c2, 0x000110c2, 0x00011100, 0x00011102,
+	0x00011127, 0x0001112b, 0x0001112d, 0x00011134,
+	0x00011173, 0x00011173, 0x00011180, 0x00011181,
+	0x000111b6, 0x000111be, 0x000111c9, 0x000111cc,
+	0x000111cf, 0x000111cf, 0x0001122f, 0x00011231,
+	0x00011234, 0x00011234, 0x00011236, 0x00011237,
+	0x0001123e, 0x0001123e, 0x00011241, 0x00011241,
+	0x000112df, 0x000112df, 0x000112e3, 0x000112ea,
+	0x00011300, 0x00011301, 0x0001133b, 0x0001133c,
+	0x00011340, 0x00011340, 0x00011366, 0x0001136c,
+	0x00011370, 0x00011374, 0x000113bb, 0x000113c0,
+	0x000113ce, 0x000113ce, 0x000113d0, 0x000113d0,
+	0x000113d2, 0x000113d2, 0x000113e1, 0x000113e2,
 	0x00011438, 0x0001143f, 0x00011442, 0x00011444,
 	0x00011446, 0x00011446, 0x0001145e, 0x0001145e,
 	0x000114b3, 0x000114b8, 0x000114ba, 0x000114ba,
@@ -2115,47 +2166,53 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0001163f, 0x00011640, 0x00011660, 0x0001166c,
 	0x000116ab, 0x000116ab, 0x000116ad, 0x000116ad,
 	0x000116b0, 0x000116b5, 0x000116b7, 0x000116b7,
-	0x0001171d, 0x0001171f, 0x00011722, 0x00011725,
-	0x00011727, 0x0001172b, 0x0001182f, 0x00011837,
-	0x00011839, 0x0001183a, 0x0001193b, 0x0001193c,
-	0x0001193e, 0x0001193e, 0x00011943, 0x00011943,
-	0x000119d4, 0x000119d7, 0x000119da, 0x000119db,
-	0x000119e0, 0x000119e0, 0x00011a01, 0x00011a06,
-	0x00011a09, 0x00011a0a, 0x00011a33, 0x00011a38,
-	0x00011a3b, 0x00011a3e, 0x00011a47, 0x00011a47,
-	0x00011a51, 0x00011a56, 0x00011a59, 0x00011a5b,
-	0x00011a8a, 0x00011a96, 0x00011a98, 0x00011a99,
-	0x00011c30, 0x00011c36, 0x00011c38, 0x00011c3d,
-	0x00011c92, 0x00011ca7, 0x00011caa, 0x00011cb0,
-	0x00011cb2, 0x00011cb3, 0x00011cb5, 0x00011cb6,
-	0x00011d31, 0x00011d36, 0x00011d3a, 0x00011d3a,
-	0x00011d3c, 0x00011d3d, 0x00011d3f, 0x00011d45,
-	0x00011d47, 0x00011d47, 0x00011d90, 0x00011d91,
-	0x00011d95, 0x00011d95, 0x00011d97, 0x00011d97,
-	0x00011ef3, 0x00011ef4, 0x00011f00, 0x00011f01,
-	0x00011f36, 0x00011f3a, 0x00011f40, 0x00011f40,
-	0x00011f42, 0x00011f42, 0x00011fd5, 0x00011fdc,
+	0x0001171d, 0x0001171d, 0x0001171f, 0x0001171f,
+	0x00011722, 0x00011725, 0x00011727, 0x0001172b,
+	0x0001182f, 0x00011837, 0x00011839, 0x0001183a,
+	0x0001193b, 0x0001193c, 0x0001193e, 0x0001193e,
+	0x00011943, 0x00011943, 0x000119d4, 0x000119d7,
+	0x000119da, 0x000119db, 0x000119e0, 0x000119e0,
+	0x00011a01, 0x00011a06, 0x00011a09, 0x00011a0a,
+	0x00011a33, 0x00011a38, 0x00011a3b, 0x00011a3e,
+	0x00011a47, 0x00011a47, 0x00011a51, 0x00011a56,
+	0x00011a59, 0x00011a5b, 0x00011a8a, 0x00011a96,
+	0x00011a98, 0x00011a99, 0x00011c30, 0x00011c36,
+	0x00011c38, 0x00011c3d, 0x00011c92, 0x00011ca7,
+	0x00011caa, 0x00011cb0, 0x00011cb2, 0x00011cb3,
+	0x00011cb5, 0x00011cb6, 0x00011d31, 0x00011d36,
+	0x00011d3a, 0x00011d3a, 0x00011d3c, 0x00011d3d,
+	0x00011d3f, 0x00011d45, 0x00011d47, 0x00011d47,
+	0x00011d90, 0x00011d91, 0x00011d95, 0x00011d95,
+	0x00011d97, 0x00011d97, 0x00011ef3, 0x00011ef4,
+	0x00011f00, 0x00011f01, 0x00011f36, 0x00011f3a,
+	0x00011f40, 0x00011f40, 0x00011f42, 0x00011f42,
+	0x00011f5a, 0x00011f5a, 0x00011fd5, 0x00011fdc,
 	0x00011fe1, 0x00011ff1, 0x00013440, 0x00013440,
-	0x00013447, 0x00013455, 0x00016af0, 0x00016af4,
+	0x00013447, 0x00013455, 0x0001611e, 0x00016129,
+	0x0001612d, 0x0001612f, 0x00016af0, 0x00016af4,
 	0x00016b30, 0x00016b36, 0x00016f4f, 0x00016f4f,
 	0x00016f8f, 0x00016f92, 0x00016fe2, 0x00016fe2,
 	0x00016fe4, 0x00016fe4, 0x0001bc9d, 0x0001bc9e,
-	0x0001bca0, 0x0001bca3, 0x0001cf00, 0x0001cf2d,
+	0x0001bca0, 0x0001bca3, 0x0001cc00, 0x0001ccd5,
+	0x0001cd00, 0x0001ceb3, 0x0001cf00, 0x0001cf2d,
 	0x0001cf30, 0x0001cf46, 0x0001d167, 0x0001d169,
 	0x0001d173, 0x0001d182, 0x0001d185, 0x0001d18b,
 	0x0001d1aa, 0x0001d1ad, 0x0001d1e9, 0x0001d1ea,
 	0x0001d200, 0x0001d245, 0x0001d300, 0x0001d356,
-	0x0001d6db, 0x0001d6db, 0x0001d715, 0x0001d715,
-	0x0001d74f, 0x0001d74f, 0x0001d789, 0x0001d789,
-	0x0001d7c3, 0x0001d7c3, 0x0001da00, 0x0001da36,
-	0x0001da3b, 0x0001da6c, 0x0001da75, 0x0001da75,
-	0x0001da84, 0x0001da84, 0x0001da9b, 0x0001da9f,
-	0x0001daa1, 0x0001daaf, 0x0001e000, 0x0001e006,
-	0x0001e008, 0x0001e018, 0x0001e01b, 0x0001e021,
-	0x0001e023, 0x0001e024, 0x0001e026, 0x0001e02a,
-	0x0001e08f, 0x0001e08f, 0x0001e130, 0x0001e136,
-	0x0001e2ae, 0x0001e2ae, 0x0001e2ec, 0x0001e2ef,
-	0x0001e4ec, 0x0001e4ef, 0x0001e8d0, 0x0001e8d6,
+	0x0001d6c1, 0x0001d6c1, 0x0001d6db, 0x0001d6db,
+	0x0001d6fb, 0x0001d6fb, 0x0001d715, 0x0001d715,
+	0x0001d735, 0x0001d735, 0x0001d74f, 0x0001d74f,
+	0x0001d76f, 0x0001d76f, 0x0001d789, 0x0001d789,
+	0x0001d7a9, 0x0001d7a9, 0x0001d7c3, 0x0001d7c3,
+	0x0001da00, 0x0001da36, 0x0001da3b, 0x0001da6c,
+	0x0001da75, 0x0001da75, 0x0001da84, 0x0001da84,
+	0x0001da9b, 0x0001da9f, 0x0001daa1, 0x0001daaf,
+	0x0001e000, 0x0001e006, 0x0001e008, 0x0001e018,
+	0x0001e01b, 0x0001e021, 0x0001e023, 0x0001e024,
+	0x0001e026, 0x0001e02a, 0x0001e08f, 0x0001e08f,
+	0x0001e130, 0x0001e136, 0x0001e2ae, 0x0001e2ae,
+	0x0001e2ec, 0x0001e2ef, 0x0001e4ec, 0x0001e4ef,
+	0x0001e5ee, 0x0001e5ef, 0x0001e8d0, 0x0001e8d6,
 	0x0001e944, 0x0001e94a, 0x0001eef0, 0x0001eef1,
 	0x0001f000, 0x0001f02b, 0x0001f030, 0x0001f093,
 	0x0001f0a0, 0x0001f0ae, 0x0001f0b1, 0x0001f0bf,
@@ -2168,13 +2225,13 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0001f7e0, 0x0001f7eb, 0x0001f7f0, 0x0001f7f0,
 	0x0001f800, 0x0001f80b, 0x0001f810, 0x0001f847,
 	0x0001f850, 0x0001f859, 0x0001f860, 0x0001f887,
-	0x0001f890, 0x0001f8ad, 0x0001f8b0, 0x0001f8b1,
-	0x0001f900, 0x0001fa53, 0x0001fa60, 0x0001fa6d,
-	0x0001fa70, 0x0001fa7c, 0x0001fa80, 0x0001fa88,
-	0x0001fa90, 0x0001fabd, 0x0001fabf, 0x0001fac5,
-	0x0001face, 0x0001fadb, 0x0001fae0, 0x0001fae8,
+	0x0001f890, 0x0001f8ad, 0x0001f8b0, 0x0001f8bb,
+	0x0001f8c0, 0x0001f8c1, 0x0001f900, 0x0001fa53,
+	0x0001fa60, 0x0001fa6d, 0x0001fa70, 0x0001fa7c,
+	0x0001fa80, 0x0001fa89, 0x0001fa8f, 0x0001fac6,
+	0x0001face, 0x0001fadc, 0x0001fadf, 0x0001fae9,
 	0x0001faf0, 0x0001faf8, 0x0001fb00, 0x0001fb92,
-	0x0001fb94, 0x0001fbca, 0x000e0001, 0x000e0001,
+	0x0001fb94, 0x0001fbef, 0x000e0001, 0x000e0001,
 	0x000e0020, 0x000e007f, 0x000e0100, 0x000e01ef,
 	0x00000608, 0x00000608, 0x0000060b, 0x0000060b,
 	0x0000060d, 0x0000060d, 0x0000061b, 0x0000064a,
@@ -2188,70 +2245,71 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0000fd50, 0x0000fd8f, 0x0000fd92, 0x0000fdc7,
 	0x0000fdf0, 0x0000fdfc, 0x0000fe70, 0x0000fe74,
 	0x0000fe76, 0x0000fefc, 0x00010d00, 0x00010d23,
-	0x00010f30, 0x00010f45, 0x00010f51, 0x00010f59,
-	0x0001ec71, 0x0001ecb4, 0x0001ed01, 0x0001ed3d,
-	0x0001ee00, 0x0001ee03, 0x0001ee05, 0x0001ee1f,
-	0x0001ee21, 0x0001ee22, 0x0001ee24, 0x0001ee24,
-	0x0001ee27, 0x0001ee27, 0x0001ee29, 0x0001ee32,
-	0x0001ee34, 0x0001ee37, 0x0001ee39, 0x0001ee39,
-	0x0001ee3b, 0x0001ee3b, 0x0001ee42, 0x0001ee42,
-	0x0001ee47, 0x0001ee47, 0x0001ee49, 0x0001ee49,
-	0x0001ee4b, 0x0001ee4b, 0x0001ee4d, 0x0001ee4f,
-	0x0001ee51, 0x0001ee52, 0x0001ee54, 0x0001ee54,
-	0x0001ee57, 0x0001ee57, 0x0001ee59, 0x0001ee59,
-	0x0001ee5b, 0x0001ee5b, 0x0001ee5d, 0x0001ee5d,
-	0x0001ee5f, 0x0001ee5f, 0x0001ee61, 0x0001ee62,
-	0x0001ee64, 0x0001ee64, 0x0001ee67, 0x0001ee6a,
-	0x0001ee6c, 0x0001ee72, 0x0001ee74, 0x0001ee77,
-	0x0001ee79, 0x0001ee7c, 0x0001ee7e, 0x0001ee7e,
-	0x0001ee80, 0x0001ee89, 0x0001ee8b, 0x0001ee9b,
-	0x0001eea1, 0x0001eea3, 0x0001eea5, 0x0001eea9,
-	0x0001eeab, 0x0001eebb, 0x00000000, 0x0000001f,
-	0x0000007f, 0x0000009f, 0x000000ad, 0x000000ad,
-	0x00000600, 0x00000605, 0x0000061c, 0x0000061c,
-	0x000006dd, 0x000006dd, 0x0000070f, 0x0000070f,
-	0x00000890, 0x00000891, 0x000008e2, 0x000008e2,
-	0x0000180e, 0x0000180e, 0x0000200b, 0x0000200f,
-	0x0000202a, 0x0000202e, 0x00002060, 0x00002064,
-	0x00002066, 0x0000206f, 0x0000feff, 0x0000feff,
-	0x0000fff9, 0x0000fffb, 0x000110bd, 0x000110bd,
-	0x000110cd, 0x000110cd, 0x00013430, 0x0001343f,
-	0x0001bca0, 0x0001bca3, 0x0001d173, 0x0001d17a,
-	0x000e0001, 0x000e0001, 0x000e0020, 0x000e007f,
-	0x00000021, 0x00000023, 0x00000025, 0x0000002a,
-	0x0000002c, 0x0000002f, 0x0000003a, 0x0000003b,
-	0x0000003f, 0x00000040, 0x0000005b, 0x0000005d,
-	0x0000005f, 0x0000005f, 0x0000007b, 0x0000007b,
-	0x0000007d, 0x0000007d, 0x000000a1, 0x000000a1,
-	0x000000a7, 0x000000a7, 0x000000ab, 0x000000ab,
-	0x000000b6, 0x000000b7, 0x000000bb, 0x000000bb,
-	0x000000bf, 0x000000bf, 0x0000037e, 0x0000037e,
-	0x00000387, 0x00000387, 0x0000055a, 0x0000055f,
-	0x00000589, 0x0000058a, 0x000005be, 0x000005be,
-	0x000005c0, 0x000005c0, 0x000005c3, 0x000005c3,
-	0x000005c6, 0x000005c6, 0x000005f3, 0x000005f4,
-	0x00000609, 0x0000060a, 0x0000060c, 0x0000060d,
-	0x0000061b, 0x0000061b, 0x0000061d, 0x0000061f,
-	0x0000066a, 0x0000066d, 0x000006d4, 0x000006d4,
-	0x00000700, 0x0000070d, 0x000007f7, 0x000007f9,
-	0x00000830, 0x0000083e, 0x0000085e, 0x0000085e,
-	0x00000964, 0x00000965, 0x00000970, 0x00000970,
-	0x000009fd, 0x000009fd, 0x00000a76, 0x00000a76,
-	0x00000af0, 0x00000af0, 0x00000c77, 0x00000c77,
-	0x00000c84, 0x00000c84, 0x00000df4, 0x00000df4,
-	0x00000e4f, 0x00000e4f, 0x00000e5a, 0x00000e5b,
-	0x00000f04, 0x00000f12, 0x00000f14, 0x00000f14,
-	0x00000f3a, 0x00000f3d, 0x00000f85, 0x00000f85,
-	0x00000fd0, 0x00000fd4, 0x00000fd9, 0x00000fda,
-	0x0000104a, 0x0000104f, 0x000010fb, 0x000010fb,
-	0x00001360, 0x00001368, 0x00001400, 0x00001400,
-	0x0000166e, 0x0000166e, 0x0000169b, 0x0000169c,
-	0x000016eb, 0x000016ed, 0x00001735, 0x00001736,
-	0x000017d4, 0x000017d6, 0x000017d8, 0x000017da,
-	0x00001800, 0x0000180a, 0x00001944, 0x00001945,
-	0x00001a1e, 0x00001a1f, 0x00001aa0, 0x00001aa6,
-	0x00001aa8, 0x00001aad, 0x00001b5a, 0x00001b60,
-	0x00001b7d, 0x00001b7e, 0x00001bfc, 0x00001bff,
+	0x00010ec2, 0x00010ec4, 0x00010f30, 0x00010f45,
+	0x00010f51, 0x00010f59, 0x0001ec71, 0x0001ecb4,
+	0x0001ed01, 0x0001ed3d, 0x0001ee00, 0x0001ee03,
+	0x0001ee05, 0x0001ee1f, 0x0001ee21, 0x0001ee22,
+	0x0001ee24, 0x0001ee24, 0x0001ee27, 0x0001ee27,
+	0x0001ee29, 0x0001ee32, 0x0001ee34, 0x0001ee37,
+	0x0001ee39, 0x0001ee39, 0x0001ee3b, 0x0001ee3b,
+	0x0001ee42, 0x0001ee42, 0x0001ee47, 0x0001ee47,
+	0x0001ee49, 0x0001ee49, 0x0001ee4b, 0x0001ee4b,
+	0x0001ee4d, 0x0001ee4f, 0x0001ee51, 0x0001ee52,
+	0x0001ee54, 0x0001ee54, 0x0001ee57, 0x0001ee57,
+	0x0001ee59, 0x0001ee59, 0x0001ee5b, 0x0001ee5b,
+	0x0001ee5d, 0x0001ee5d, 0x0001ee5f, 0x0001ee5f,
+	0x0001ee61, 0x0001ee62, 0x0001ee64, 0x0001ee64,
+	0x0001ee67, 0x0001ee6a, 0x0001ee6c, 0x0001ee72,
+	0x0001ee74, 0x0001ee77, 0x0001ee79, 0x0001ee7c,
+	0x0001ee7e, 0x0001ee7e, 0x0001ee80, 0x0001ee89,
+	0x0001ee8b, 0x0001ee9b, 0x0001eea1, 0x0001eea3,
+	0x0001eea5, 0x0001eea9, 0x0001eeab, 0x0001eebb,
+	0x00000000, 0x0000001f, 0x0000007f, 0x0000009f,
+	0x000000ad, 0x000000ad, 0x00000600, 0x00000605,
+	0x0000061c, 0x0000061c, 0x000006dd, 0x000006dd,
+	0x0000070f, 0x0000070f, 0x00000890, 0x00000891,
+	0x000008e2, 0x000008e2, 0x0000180e, 0x0000180e,
+	0x0000200b, 0x0000200f, 0x0000202a, 0x0000202e,
+	0x00002060, 0x00002064, 0x00002066, 0x0000206f,
+	0x0000feff, 0x0000feff, 0x0000fff9, 0x0000fffb,
+	0x000110bd, 0x000110bd, 0x000110cd, 0x000110cd,
+	0x00013430, 0x0001343f, 0x0001bca0, 0x0001bca3,
+	0x0001d173, 0x0001d17a, 0x000e0001, 0x000e0001,
+	0x000e0020, 0x000e007f, 0x00000021, 0x00000023,
+	0x00000025, 0x0000002a, 0x0000002c, 0x0000002f,
+	0x0000003a, 0x0000003b, 0x0000003f, 0x00000040,
+	0x0000005b, 0x0000005d, 0x0000005f, 0x0000005f,
+	0x0000007b, 0x0000007b, 0x0000007d, 0x0000007d,
+	0x000000a1, 0x000000a1, 0x000000a7, 0x000000a7,
+	0x000000ab, 0x000000ab, 0x000000b6, 0x000000b7,
+	0x000000bb, 0x000000bb, 0x000000bf, 0x000000bf,
+	0x0000037e, 0x0000037e, 0x00000387, 0x00000387,
+	0x0000055a, 0x0000055f, 0x00000589, 0x0000058a,
+	0x000005be, 0x000005be, 0x000005c0, 0x000005c0,
+	0x000005c3, 0x000005c3, 0x000005c6, 0x000005c6,
+	0x000005f3, 0x000005f4, 0x00000609, 0x0000060a,
+	0x0000060c, 0x0000060d, 0x0000061b, 0x0000061b,
+	0x0000061d, 0x0000061f, 0x0000066a, 0x0000066d,
+	0x000006d4, 0x000006d4, 0x00000700, 0x0000070d,
+	0x000007f7, 0x000007f9, 0x00000830, 0x0000083e,
+	0x0000085e, 0x0000085e, 0x00000964, 0x00000965,
+	0x00000970, 0x00000970, 0x000009fd, 0x000009fd,
+	0x00000a76, 0x00000a76, 0x00000af0, 0x00000af0,
+	0x00000c77, 0x00000c77, 0x00000c84, 0x00000c84,
+	0x00000df4, 0x00000df4, 0x00000e4f, 0x00000e4f,
+	0x00000e5a, 0x00000e5b, 0x00000f04, 0x00000f12,
+	0x00000f14, 0x00000f14, 0x00000f3a, 0x00000f3d,
+	0x00000f85, 0x00000f85, 0x00000fd0, 0x00000fd4,
+	0x00000fd9, 0x00000fda, 0x0000104a, 0x0000104f,
+	0x000010fb, 0x000010fb, 0x00001360, 0x00001368,
+	0x00001400, 0x00001400, 0x0000166e, 0x0000166e,
+	0x0000169b, 0x0000169c, 0x000016eb, 0x000016ed,
+	0x00001735, 0x00001736, 0x000017d4, 0x000017d6,
+	0x000017d8, 0x000017da, 0x00001800, 0x0000180a,
+	0x00001944, 0x00001945, 0x00001a1e, 0x00001a1f,
+	0x00001aa0, 0x00001aa6, 0x00001aa8, 0x00001aad,
+	0x00001b4e, 0x00001b4f, 0x00001b5a, 0x00001b60,
+	0x00001b7d, 0x00001b7f, 0x00001bfc, 0x00001bff,
 	0x00001c3b, 0x00001c3f, 0x00001c7e, 0x00001c7f,
 	0x00001cc0, 0x00001cc7, 0x00001cd3, 0x00001cd3,
 	0x00002010, 0x00002027, 0x00002030, 0x00002043,
@@ -2290,29 +2348,32 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0001091f, 0x0001091f, 0x0001093f, 0x0001093f,
 	0x00010a50, 0x00010a58, 0x00010a7f, 0x00010a7f,
 	0x00010af0, 0x00010af6, 0x00010b39, 0x00010b3f,
-	0x00010b99, 0x00010b9c, 0x00010ead, 0x00010ead,
-	0x00010f55, 0x00010f59, 0x00010f86, 0x00010f89,
-	0x00011047, 0x0001104d, 0x000110bb, 0x000110bc,
-	0x000110be, 0x000110c1, 0x00011140, 0x00011143,
-	0x00011174, 0x00011175, 0x000111c5, 0x000111c8,
-	0x000111cd, 0x000111cd, 0x000111db, 0x000111db,
-	0x000111dd, 0x000111df, 0x00011238, 0x0001123d,
-	0x000112a9, 0x000112a9, 0x0001144b, 0x0001144f,
-	0x0001145a, 0x0001145b, 0x0001145d, 0x0001145d,
-	0x000114c6, 0x000114c6, 0x000115c1, 0x000115d7,
-	0x00011641, 0x00011643, 0x00011660, 0x0001166c,
-	0x000116b9, 0x000116b9, 0x0001173c, 0x0001173e,
-	0x0001183b, 0x0001183b, 0x00011944, 0x00011946,
-	0x000119e2, 0x000119e2, 0x00011a3f, 0x00011a46,
-	0x00011a9a, 0x00011a9c, 0x00011a9e, 0x00011aa2,
-	0x00011b00, 0x00011b09, 0x00011c41, 0x00011c45,
+	0x00010b99, 0x00010b9c, 0x00010d6e, 0x00010d6e,
+	0x00010ead, 0x00010ead, 0x00010f55, 0x00010f59,
+	0x00010f86, 0x00010f89, 0x00011047, 0x0001104d,
+	0x000110bb, 0x000110bc, 0x000110be, 0x000110c1,
+	0x00011140, 0x00011143, 0x00011174, 0x00011175,
+	0x000111c5, 0x000111c8, 0x000111cd, 0x000111cd,
+	0x000111db, 0x000111db, 0x000111dd, 0x000111df,
+	0x00011238, 0x0001123d, 0x000112a9, 0x000112a9,
+	0x000113d4, 0x000113d5, 0x000113d7, 0x000113d8,
+	0x0001144b, 0x0001144f, 0x0001145a, 0x0001145b,
+	0x0001145d, 0x0001145d, 0x000114c6, 0x000114c6,
+	0x000115c1, 0x000115d7, 0x00011641, 0x00011643,
+	0x00011660, 0x0001166c, 0x000116b9, 0x000116b9,
+	0x0001173c, 0x0001173e, 0x0001183b, 0x0001183b,
+	0x00011944, 0x00011946, 0x000119e2, 0x000119e2,
+	0x00011a3f, 0x00011a46, 0x00011a9a, 0x00011a9c,
+	0x00011a9e, 0x00011aa2, 0x00011b00, 0x00011b09,
+	0x00011be1, 0x00011be1, 0x00011c41, 0x00011c45,
 	0x00011c70, 0x00011c71, 0x00011ef7, 0x00011ef8,
 	0x00011f43, 0x00011f4f, 0x00011fff, 0x00011fff,
 	0x00012470, 0x00012474, 0x00012ff1, 0x00012ff2,
 	0x00016a6e, 0x00016a6f, 0x00016af5, 0x00016af5,
 	0x00016b37, 0x00016b3b, 0x00016b44, 0x00016b44,
-	0x00016e97, 0x00016e9a, 0x00016fe2, 0x00016fe2,
-	0x0001bc9f, 0x0001bc9f, 0x0001da87, 0x0001da8b,
+	0x00016d6d, 0x00016d6f, 0x00016e97, 0x00016e9a,
+	0x00016fe2, 0x00016fe2, 0x0001bc9f, 0x0001bc9f,
+	0x0001da87, 0x0001da8b, 0x0001e5ff, 0x0001e5ff,
 	0x0001e95e, 0x0001e95f, 0x00000041, 0x0000005a,
 	0x00000061, 0x0000007a, 0x000000aa, 0x000000aa,
 	0x000000b5, 0x000000b5, 0x000000ba, 0x000000ba,
@@ -2330,7 +2391,7 @@ static const unsigned int _ucprop_ranges[] = {
 	0x000010a0, 0x000010c5, 0x000010c7, 0x000010c7,
 	0x000010cd, 0x000010cd, 0x000010d0, 0x000010fa,
 	0x000010fc, 0x000010ff, 0x000013a0, 0x000013f5,
-	0x000013f8, 0x000013fd, 0x00001c80, 0x00001c88,
+	0x000013f8, 0x000013fd, 0x00001c80, 0x00001c8a,
 	0x00001c90, 0x00001cba, 0x00001cbd, 0x00001cbf,
 	0x00001d00, 0x00001dbf, 0x00001e00, 0x00001f15,
 	0x00001f18, 0x00001f1d, 0x00001f20, 0x00001f45,
@@ -2357,8 +2418,8 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00002d27, 0x00002d27, 0x00002d2d, 0x00002d2d,
 	0x0000a640, 0x0000a66d, 0x0000a680, 0x0000a69d,
 	0x0000a722, 0x0000a787, 0x0000a78b, 0x0000a78e,
-	0x0000a790, 0x0000a7ca, 0x0000a7d0, 0x0000a7d1,
-	0x0000a7d3, 0x0000a7d3, 0x0000a7d5, 0x0000a7d9,
+	0x0000a790, 0x0000a7cd, 0x0000a7d0, 0x0000a7d1,
+	0x0000a7d3, 0x0000a7d3, 0x0000a7d5, 0x0000a7dc,
 	0x0000a7f2, 0x0000a7f6, 0x0000a7f8, 0x0000a7fa,
 	0x0000ab30, 0x0000ab5a, 0x0000ab5c, 0x0000ab69,
 	0x0000ab70, 0x0000abbf, 0x0000fb00, 0x0000fb06,
@@ -2372,6 +2433,7 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00010780, 0x00010780, 0x00010783, 0x00010785,
 	0x00010787, 0x000107b0, 0x000107b2, 0x000107ba,
 	0x00010c80, 0x00010cb2, 0x00010cc0, 0x00010cf2,
+	0x00010d50, 0x00010d65, 0x00010d70, 0x00010d85,
 	0x000118a0, 0x000118df, 0x00016e40, 0x00016e7f,
 	0x0001d400, 0x0001d454, 0x0001d456, 0x0001d49c,
 	0x0001d49e, 0x0001d49f, 0x0001d4a2, 0x0001d4a2,
@@ -2414,7 +2476,7 @@ static const unsigned int _ucprop_ranges[] = {
 	0x000007fa, 0x000007fa, 0x000007fd, 0x000007fd,
 	0x00000816, 0x0000082d, 0x00000859, 0x0000085b,
 	0x00000888, 0x00000888, 0x00000890, 0x00000891,
-	0x00000898, 0x0000089f, 0x000008c9, 0x00000902,
+	0x00000897, 0x0000089f, 0x000008c9, 0x00000902,
 	0x0000093a, 0x0000093a, 0x0000093c, 0x0000093c,
 	0x00000941, 0x00000948, 0x0000094d, 0x0000094d,
 	0x00000951, 0x00000957, 0x00000962, 0x00000963,
@@ -2542,24 +2604,28 @@ static const unsigned int _ucprop_ranges[] = {
 	0x00010a01, 0x00010a03, 0x00010a05, 0x00010a06,
 	0x00010a0c, 0x00010a0f, 0x00010a38, 0x00010a3a,
 	0x00010a3f, 0x00010a3f, 0x00010ae5, 0x00010ae6,
-	0x00010d24, 0x00010d27, 0x00010eab, 0x00010eac,
-	0x00010efd, 0x00010eff, 0x00010f46, 0x00010f50,
-	0x00010f82, 0x00010f85, 0x00011001, 0x00011001,
-	0x00011038, 0x00011046, 0x00011070, 0x00011070,
-	0x00011073, 0x00011074, 0x0001107f, 0x00011081,
-	0x000110b3, 0x000110b6, 0x000110b9, 0x000110ba,
-	0x000110bd, 0x000110bd, 0x000110c2, 0x000110c2,
-	0x000110cd, 0x000110cd, 0x00011100, 0x00011102,
-	0x00011127, 0x0001112b, 0x0001112d, 0x00011134,
-	0x00011173, 0x00011173, 0x00011180, 0x00011181,
-	0x000111b6, 0x000111be, 0x000111c9, 0x000111cc,
-	0x000111cf, 0x000111cf, 0x0001122f, 0x00011231,
-	0x00011234, 0x00011234, 0x00011236, 0x00011237,
-	0x0001123e, 0x0001123e, 0x00011241, 0x00011241,
-	0x000112df, 0x000112df, 0x000112e3, 0x000112ea,
-	0x00011300, 0x00011301, 0x0001133b, 0x0001133c,
-	0x00011340, 0x00011340, 0x00011366, 0x0001136c,
-	0x00011370, 0x00011374, 0x00011438, 0x0001143f,
+	0x00010d24, 0x00010d27, 0x00010d4e, 0x00010d4e,
+	0x00010d69, 0x00010d6d, 0x00010d6f, 0x00010d6f,
+	0x00010eab, 0x00010eac, 0x00010efc, 0x00010eff,
+	0x00010f46, 0x00010f50, 0x00010f82, 0x00010f85,
+	0x00011001, 0x00011001, 0x00011038, 0x00011046,
+	0x00011070, 0x00011070, 0x00011073, 0x00011074,
+	0x0001107f, 0x00011081, 0x000110b3, 0x000110b6,
+	0x000110b9, 0x000110ba, 0x000110bd, 0x000110bd,
+	0x000110c2, 0x000110c2, 0x000110cd, 0x000110cd,
+	0x00011100, 0x00011102, 0x00011127, 0x0001112b,
+	0x0001112d, 0x00011134, 0x00011173, 0x00011173,
+	0x00011180, 0x00011181, 0x000111b6, 0x000111be,
+	0x000111c9, 0x000111cc, 0x000111cf, 0x000111cf,
+	0x0001122f, 0x00011231, 0x00011234, 0x00011234,
+	0x00011236, 0x00011237, 0x0001123e, 0x0001123e,
+	0x00011241, 0x00011241, 0x000112df, 0x000112df,
+	0x000112e3, 0x000112ea, 0x00011300, 0x00011301,
+	0x0001133b, 0x0001133c, 0x00011340, 0x00011340,
+	0x00011366, 0x0001136c, 0x00011370, 0x00011374,
+	0x000113bb, 0x000113c0, 0x000113ce, 0x000113ce,
+	0x000113d0, 0x000113d0, 0x000113d2, 0x000113d2,
+	0x000113e1, 0x000113e2, 0x00011438, 0x0001143f,
 	0x00011442, 0x00011444, 0x00011446, 0x00011446,
 	0x0001145e, 0x0001145e, 0x000114b3, 0x000114b8,
 	0x000114ba, 0x000114ba, 0x000114bf, 0x000114c0,
@@ -2569,28 +2635,31 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0001163d, 0x0001163d, 0x0001163f, 0x00011640,
 	0x000116ab, 0x000116ab, 0x000116ad, 0x000116ad,
 	0x000116b0, 0x000116b5, 0x000116b7, 0x000116b7,
-	0x0001171d, 0x0001171f, 0x00011722, 0x00011725,
-	0x00011727, 0x0001172b, 0x0001182f, 0x00011837,
-	0x00011839, 0x0001183a, 0x0001193b, 0x0001193c,
-	0x0001193e, 0x0001193e, 0x00011943, 0x00011943,
-	0x000119d4, 0x000119d7, 0x000119da, 0x000119db,
-	0x000119e0, 0x000119e0, 0x00011a01, 0x00011a0a,
-	0x00011a33, 0x00011a38, 0x00011a3b, 0x00011a3e,
-	0x00011a47, 0x00011a47, 0x00011a51, 0x00011a56,
-	0x00011a59, 0x00011a5b, 0x00011a8a, 0x00011a96,
-	0x00011a98, 0x00011a99, 0x00011c30, 0x00011c36,
-	0x00011c38, 0x00011c3d, 0x00011c3f, 0x00011c3f,
-	0x00011c92, 0x00011ca7, 0x00011caa, 0x00011cb0,
-	0x00011cb2, 0x00011cb3, 0x00011cb5, 0x00011cb6,
-	0x00011d31, 0x00011d36, 0x00011d3a, 0x00011d3a,
-	0x00011d3c, 0x00011d3d, 0x00011d3f, 0x00011d45,
-	0x00011d47, 0x00011d47, 0x00011d90, 0x00011d91,
-	0x00011d95, 0x00011d95, 0x00011d97, 0x00011d97,
-	0x00011ef3, 0x00011ef4, 0x00011f00, 0x00011f01,
-	0x00011f36, 0x00011f3a, 0x00011f40, 0x00011f40,
-	0x00011f42, 0x00011f42, 0x00013430, 0x00013440,
-	0x00013447, 0x00013455, 0x00016af0, 0x00016af4,
+	0x0001171d, 0x0001171d, 0x0001171f, 0x0001171f,
+	0x00011722, 0x00011725, 0x00011727, 0x0001172b,
+	0x0001182f, 0x00011837, 0x00011839, 0x0001183a,
+	0x0001193b, 0x0001193c, 0x0001193e, 0x0001193e,
+	0x00011943, 0x00011943, 0x000119d4, 0x000119d7,
+	0x000119da, 0x000119db, 0x000119e0, 0x000119e0,
+	0x00011a01, 0x00011a0a, 0x00011a33, 0x00011a38,
+	0x00011a3b, 0x00011a3e, 0x00011a47, 0x00011a47,
+	0x00011a51, 0x00011a56, 0x00011a59, 0x00011a5b,
+	0x00011a8a, 0x00011a96, 0x00011a98, 0x00011a99,
+	0x00011c30, 0x00011c36, 0x00011c38, 0x00011c3d,
+	0x00011c3f, 0x00011c3f, 0x00011c92, 0x00011ca7,
+	0x00011caa, 0x00011cb0, 0x00011cb2, 0x00011cb3,
+	0x00011cb5, 0x00011cb6, 0x00011d31, 0x00011d36,
+	0x00011d3a, 0x00011d3a, 0x00011d3c, 0x00011d3d,
+	0x00011d3f, 0x00011d45, 0x00011d47, 0x00011d47,
+	0x00011d90, 0x00011d91, 0x00011d95, 0x00011d95,
+	0x00011d97, 0x00011d97, 0x00011ef3, 0x00011ef4,
+	0x00011f00, 0x00011f01, 0x00011f36, 0x00011f3a,
+	0x00011f40, 0x00011f40, 0x00011f42, 0x00011f42,
+	0x00011f5a, 0x00011f5a, 0x00013430, 0x00013440,
+	0x00013447, 0x00013455, 0x0001611e, 0x00016129,
+	0x0001612d, 0x0001612f, 0x00016af0, 0x00016af4,
 	0x00016b30, 0x00016b36, 0x00016b40, 0x00016b43,
+	0x00016d40, 0x00016d42, 0x00016d6b, 0x00016d6c,
 	0x00016f4f, 0x00016f4f, 0x00016f8f, 0x00016f9f,
 	0x00016fe0, 0x00016fe1, 0x00016fe3, 0x00016fe4,
 	0x0001aff0, 0x0001aff3, 0x0001aff5, 0x0001affb,
@@ -2607,1571 +2676,1606 @@ static const unsigned int _ucprop_ranges[] = {
 	0x0001e026, 0x0001e02a, 0x0001e030, 0x0001e06d,
 	0x0001e08f, 0x0001e08f, 0x0001e130, 0x0001e13d,
 	0x0001e2ae, 0x0001e2ae, 0x0001e2ec, 0x0001e2ef,
-	0x0001e4eb, 0x0001e4ef, 0x0001e8d0, 0x0001e8d6,
-	0x0001e944, 0x0001e94b, 0x0001f3fb, 0x0001f3ff,
-	0x000e0001, 0x000e0001, 0x000e0020, 0x000e007f,
-	0x000e0100, 0x000e01ef
+	0x0001e4eb, 0x0001e4ef, 0x0001e5ee, 0x0001e5ef,
+	0x0001e8d0, 0x0001e8d6, 0x0001e944, 0x0001e94b,
+	0x0001f3fb, 0x0001f3ff, 0x000e0001, 0x000e0001,
+	0x000e0020, 0x000e007f, 0x000e0100, 0x000e01ef
 };
 
-static const unsigned _uccase_upper_g_size = 254;
+static const unsigned _uccase_upper_g_size = 306;
 static const short _uccase_upper_g[] = {
-	 1704,    68,   561,   324,   833,  3274,  1268,    14,
-	 4441,     1,   589,  3822,    93,     9,  2821,     3,
-	  510,   226,  2015,   269,  3730,   271,   333,   158,
-	-1343,  2844,   284,     2,    91,  4525,  1171,   491,
-	  206,    26,   756,  1667,  2861, -1115,  1861,     3,
-	  709,   274,   355,   437,  4405,     1,  1910,     2,
-	 2543,    76,  1058,   504,   108,    11,   437,  2035,
-	  582,   725,  4907,    25, 10812,   337,   146,  2953,
-	  644,    26,  1513,   714,   265,  2176,  1921,     2,
-	   64,   107,  2081,  2862,   598,    87,  9030,   314,
-	  313,   689,  3906,     1,   766,     1,  2708,   417,
-	 -303,    18,  1227,     2,  2074,   923,  2872,   299,
-	 1748,     2,  8643,  2821,   642,   259,  1494,     3,
-	  686,  5182,  3310,  2373,  3739,     1,  6416,    55,
-	 -499,   416,   293,    50,  5224,   361,   714,  2469,
-	   52,     1,  1037,    16,   703,  2530, 32767,   758,
-	  767,     2, 10398,    51,  1267,    86,   161,     7,
-	 9194,   658, -1146,  3657,    49,     3,  3081,  1491,
-	   99,   728,   203,     1,  1426,   511,  -621,   429,
-	  273,    64,  7770,    78,   264,   377,   295,     1,
-	  577,    16,  7383,   353, -1152,    96,   336,     7,
-	  146,   263,  4769,    18,  3182,    18,  1538,   255,
-	 1364,  -882,  1767,     2,  7582,  1353,   578,  2173,
-	  344,     1,  6593,     1,  -848,   478,  2452,     1,
-	 2311,   259,  2542,   285,   257,     1,  3103,   105,
-	 5143,   372, -1237,   686,  2020,    23,    73,  -851,
-	 3603,    76,  5778,    37,  2366,  6197,   580,  1876,
-	   76,    84, 28044,  1625,   374,   413,  3732,     1,
-	 3213,     1,  1623,   440,   424,     1,  -405,     2,
-	 5166,   297,   598,    14,  3267,    38,  9815,    84,
-	  780,   682,   296,     2,   105,  3934,   424,   280,
-	 3736,   231,  6714,   414,   499,  2389
+	 3332,    32,  1410,   122,  4805,     2, 25559,   556,
+	   94,    76,   416,   837,   187,  1295,    46,   592,
+	   84,  1561,  3990,    79,   536,  1310,  7720,     1,
+	  448,   643,  1767,   268,   535,  1298,   352,  1137,
+	  118,    11,   442,    70,  -619,    33,  1186,  4346,
+	 1179,     2,   863,   924,  5932,   572,   252,   824,
+	  623,   170,    73,     1,  -113,   189,  -663,   176,
+	 4628,   183,  1162,    66,   550,  1406,  1580,  2160,
+	   45,  1073,  1123,  1120,   474,    27,  -337,     6,
+	 -852,   252,  3326,    22,   731,    44,   793,   873,
+	 1305,  2397,   545,   554,  1732,  1107,   897,    58,
+	  537,  1335,    99,   181, 16501,    19,   493,     2,
+	  520,  2024,   129,   565,   556,   331,   192,    44,
+	  516,     1,  2432,   197,  -910,    82,  4898,    14,
+	 -963,     1,   886,  1750,  1691,  1920,   616,   645,
+	 2555,   155,    77,    36, 10886,    22,   506,   520,
+	 1804,    16,   870,     9, -1321,  2097,  1547,  2548,
+	  702,  1259,  8016,   561,    21,  2099,   606,     1,
+	  325,     5,  3624,    16,  1341,     2,  2997,    63,
+	  202,  2577,   966,   893,   297,   558,    12,  1017,
+	 2683,     1,  4145,   708,  5119,    16,  -989,     1,
+	  768,    12,  1026,   180,   703,    81,  4373,   968,
+	  564,   621,   676,     1,  2583,    69,  1315,    27,
+	-1048,     2,  1531,   187,     7,   350,  4635,    17,
+	 2013,   515,  1109,  3288,  1011,     1,   530,   564,
+	 1074,    18,  1471,   100,   825,   181,  1150,   212,
+	 1011,    12,  1614,   985,  1082,    84,   102,    14,
+	  166,   224,   822,    19, -1079,  1630,  4882,   161,
+	  309,  1620,   390,   601, -1467,  1177,  1155,   692,
+	  940,     4,  -406,     1,  1028,   566, -1118,   348,
+	 2880,     9,   122,  1782,    55,     3,   579,  1034,
+	 1252,    37,  1531,  1410,  -504,     1,  1199,   569,
+	-1169,   405,  1541,    29,   387,  1989,    33,   816,
+	 4142,   872,  1347,   517,  2656,  1393,  -610,     1,
+	 1191,    31,  1294,   164, 16301,    10,   857,   602,
+	   32,   985,  2445,  1208,   323,  2159,  3138,    31,
+	 3063,     1,  1033,    35,  1048,    40,  1655,    50,
+	 1144,   577,    81,   170, 13582,  1154,  2882,   424,
+	 5094,   288
 };
 
-static const unsigned _uccase_upper_table_size = 1525;
+static const unsigned _uccase_upper_table_size = 1552;
 static const unsigned _uccase_upper_table[] = {
-	0x00000282, 0x0000a7c5, 0x0000217b, 0x0000216b,
-	0x000001fd, 0x000001fc, 0x00001e5d, 0x00001e5c,
-	0x0000a669, 0x0000a668, 0x0000abb3, 0x000013e3,
-	0x00001efb, 0x00001efa, 0x00001eb3, 0x00001eb2,
-	0x0000023c, 0x0000023b, 0x000003e3, 0x000003e2,
-	0x0000023f, 0x00002c7e, 0x0001e926, 0x0001e904,
-	0x000010e7, 0x00001ca7, 0x00010cc1, 0x00010c81,
-	0x0000ab80, 0x000013b0, 0x00001fd6, 0x020000b7,
-	0x00000440, 0x00000420, 0x00010ce0, 0x00010ca0,
-	0x00000455, 0x00000405, 0x00001f9a, 0x020000f1,
-	0x0000a75d, 0x0000a75c, 0x00001f63, 0x00001f6b,
-	0x00002c4d, 0x00002c1d, 0x0000044a, 0x0000042a,
-	0x0000a79b, 0x0000a79a, 0x00016e7c, 0x00016e5c,
-	0x00002c8f, 0x00002c8e, 0x00001ef1, 0x00001ef0,
-	0x00001e43, 0x00001e42, 0x00001f40, 0x00001f48,
-	0x00002cdb, 0x00002cda, 0x0000ff4d, 0x0000ff2d,
-	0x00001e29, 0x00001e28, 0x000118c9, 0x000118a9,
-	0x000004d3, 0x000004d2, 0x00002d08, 0x000010a8,
-	0x00000217, 0x00000216, 0x000000e5, 0x000000c5,
-	0x0000051f, 0x0000051e, 0x000105b3, 0x0001058c,
-	0x0000010f, 0x0000010e, 0x000000ef, 0x000000cf,
-	0x00001f70, 0x00001fba, 0x0000022f, 0x0000022e,
-	0x00001f37, 0x00001f3f, 0x0000ab7e, 0x000013ae,
-	0x00000585, 0x00000555, 0x0000045b, 0x0000040b,
-	0x000003d1, 0x00000398, 0x00000169, 0x00000168,
-	0x00000523, 0x00000522, 0x000001b9, 0x000001b8,
-	0x0000ff52, 0x0000ff32, 0x0000a7d1, 0x0000a7d0,
-	0x00000117, 0x00000116, 0x000004dd, 0x000004dc,
-	0x00016e63, 0x00016e43, 0x000001e3, 0x000001e2,
-	0x00016e65, 0x00016e45, 0x00002d0b, 0x000010ab,
-	0x000024e8, 0x000024ce, 0x000024d1, 0x000024b7,
-	0x00000103, 0x00000102, 0x00010cdf, 0x00010c9f,
-	0x000024e3, 0x000024c9, 0x00001f90, 0x02000018,
-	0x00010ce7, 0x00010ca7, 0x00002caf, 0x00002cae,
-	0x00002d05, 0x000010a5, 0x0001e940, 0x0001e91e,
-	0x000010dc, 0x00001c9c, 0x00001c85, 0x00000422,
-	0x00002c53, 0x00002c23, 0x00010cea, 0x00010caa,
-	0x00000163, 0x00000162, 0x00001fa0, 0x02000030,
-	0x00000497, 0x00000496, 0x00010430, 0x00010408,
-	0x00001e73, 0x00001e72, 0x0000a65b, 0x0000a65a,
-	0x0000a78c, 0x0000a78b, 0x00010449, 0x00010421,
-	0x000001dd, 0x0000018e, 0x0000a697, 0x0000a696,
-	0x00000511, 0x00000510, 0x0000fb03, 0x0300005d,
-	0x00001f22, 0x00001f2a, 0x00001d79, 0x0000a77d,
-	0x00010cc4, 0x00010c84, 0x000003cb, 0x000003ab,
-	0x00000257, 0x0000018a, 0x00010cf2, 0x00010cb2,
-	0x000010df, 0x00001c9f, 0x00000451, 0x00000401,
-	0x0000ab87, 0x000013b7, 0x0000a74f, 0x0000a74e,
-	0x00000576, 0x00000546, 0x00000445, 0x00000425,
-	0x00002d04, 0x000010a4, 0x00002d20, 0x000010c0,
-	0x00002c87, 0x00002c86, 0x000104e3, 0x000104bb,
-	0x0001e929, 0x0001e907, 0x00001e6d, 0x00001e6c,
-	0x0000016f, 0x0000016e, 0x000004bf, 0x000004be,
-	0x00000256, 0x00000189, 0x00001f84, 0x0200000c,
-	0x0000a691, 0x0000a690, 0x00010cdd, 0x00010c9d,
-	0x0000217e, 0x0000216e, 0x00001ee7, 0x00001ee6,
-	0x00002c37, 0x00002c07, 0x0000abb7, 0x000013e7,
-	0x000003c5, 0x000003a5, 0x00000251, 0x00002c6d,
-	0x00000155, 0x00000154, 0x00000450, 0x00000400,
-	0x00002c54, 0x00002c24, 0x00001f61, 0x00001f69,
-	0x000001bd, 0x000001bc, 0x00000459, 0x00000409,
-	0x0000043f, 0x0000041f, 0x0000ff44, 0x0000ff24,
-	0x0000a785, 0x0000a784, 0x000004ca, 0x000004c9,
-	0x00002c43, 0x00002c13, 0x000104f7, 0x000104cf,
-	0x00001e67, 0x00001e66, 0x0001e931, 0x0001e90f,
-	0x000004b9, 0x000004b8, 0x00000345, 0x00000399,
-	0x00001eb1, 0x00001eb0, 0x00001fd0, 0x00001fd8,
-	0x00016e7e, 0x00016e5e, 0x000003d7, 0x000003cf,
-	0x00001ee1, 0x00001ee0, 0x00002c5a, 0x00002c2a,
-	0x000104f5, 0x000104cd, 0x000003bf, 0x0000039f,
-	0x0000ff41, 0x0000ff21, 0x00001f56, 0x030000a5,
-	0x000010d3, 0x00001c93, 0x000003ca, 0x000003aa,
-	0x0000ff4b, 0x0000ff2b, 0x00016e61, 0x00016e41,
-	0x00016e70, 0x00016e50, 0x00000439, 0x00000419,
-	0x0000ff58, 0x0000ff38, 0x00001e21, 0x00001e20,
-	0x00000101, 0x00000100, 0x00000444, 0x00000424,
-	0x0000abbd, 0x000013ed, 0x00001e61, 0x00001e60,
-	0x0000a77a, 0x0000a779, 0x000004b3, 0x000004b2,
-	0x000001eb, 0x000001ea, 0x0000a791, 0x0000a790,
-	0x000010da, 0x00001c9a, 0x0001e933, 0x0001e911,
-	0x0000026a, 0x0000a7ae, 0x00001edb, 0x00001eda,
-	0x00010ccb, 0x00010c8b, 0x0000052d, 0x0000052c,
-	0x0000056c, 0x0000053c, 0x00001f15, 0x00001f1d,
-	0x0000006e, 0x0000004e, 0x00010cd6, 0x00010c96,
-	0x000003ef, 0x000003ee, 0x00001f55, 0x00001f5d,
-	0x0000a735, 0x0000a734, 0x00010ce8, 0x00010ca8,
-	0x00002d01, 0x000010a1, 0x0000ab77, 0x000013a7,
-	0x0001e93a, 0x0001e918, 0x00002cd3, 0x00002cd2,
-	0x0000ab8f, 0x000013bf, 0x00001fa5, 0x0200003f,
-	0x0000a793, 0x0000a792, 0x0000a781, 0x0000a780,
-	0x0000013a, 0x00000139, 0x000104f8, 0x000104d0,
-	0x00001ea5, 0x00001ea4, 0x000010eb, 0x00001cab,
-	0x0000aba9, 0x000013d9, 0x000118c3, 0x000118a3,
-	0x0000057f, 0x0000054f, 0x00002c6c, 0x00002c6b,
-	0x00001fd7, 0x030000ba, 0x000001ff, 0x000001fe,
-	0x0001e928, 0x0001e906, 0x000118c1, 0x000118a1,
-	0x00000503, 0x00000502, 0x000003ed, 0x000003ec,
-	0x00000072, 0x00000052, 0x000118c8, 0x000118a8,
-	0x0000ab73, 0x000013a3, 0x000104f1, 0x000104c9,
-	0x000024e0, 0x000024c6, 0x0000a68d, 0x0000a68c,
-	0x000004cc, 0x000004cb, 0x00002c9d, 0x00002c9c,
-	0x00000231, 0x00000230, 0x000024db, 0x000024c1,
-	0x00001fe4, 0x020000c6, 0x000004f1, 0x000004f0,
-	0x000104f2, 0x000104ca, 0x00001e93, 0x00001e92,
-	0x00000229, 0x00000228, 0x000004e1, 0x000004e0,
-	0x000010fe, 0x00001cbe, 0x00001f88, 0x020000d3,
-	0x0001043b, 0x00010413, 0x00002c59, 0x00002c29,
-	0x000024d8, 0x000024be, 0x00002d18, 0x000010b8,
-	0x0000a76b, 0x0000a76a, 0x000001ce, 0x000001cd,
-	0x000003eb, 0x000003ea, 0x00000509, 0x00000508,
-	0x0000006f, 0x0000004f, 0x000010ef, 0x00001caf,
-	0x0000057e, 0x0000054e, 0x00001f87, 0x02000015,
-	0x00001fa4, 0x0200003c, 0x00010cd5, 0x00010c95,
-	0x00002c9b, 0x00002c9a, 0x000104e2, 0x000104ba,
-	0x000000e9, 0x000000c9, 0x00001f04, 0x00001f0c,
-	0x00010cce, 0x00010c8e, 0x000104ec, 0x000104c4,
-	0x00001e89, 0x00001e88, 0x0000022b, 0x0000022a,
-	0x000004df, 0x000004de, 0x0000ff45, 0x0000ff25,
-	0x00001ecf, 0x00001ece, 0x000000f2, 0x000000d2,
-	0x0000051d, 0x0000051c, 0x0000010b, 0x0000010a,
-	0x00000261, 0x0000a7ac, 0x0000a72b, 0x0000a72a,
-	0x0000aba6, 0x000013d6, 0x000105b0, 0x00010589,
-	0x00001f02, 0x00001f0a, 0x0000a765, 0x0000a764,
-	0x00010cda, 0x00010c9a, 0x00000477, 0x00000476,
-	0x00001f7d, 0x00001ffb, 0x00001e09, 0x00001e08,
-	0x000118ce, 0x000118ae, 0x0000045f, 0x0000040f,
-	0x0000020f, 0x0000020e, 0x00001e51, 0x00001e50,
-	0x00010cca, 0x00010c8a, 0x00002cbb, 0x00002cba,
-	0x000104e6, 0x000104be, 0x0000abaf, 0x000013df,
-	0x0000045e, 0x0000040e, 0x00002d0f, 0x000010af,
-	0x00002170, 0x00002160, 0x00000260, 0x00000193,
-	0x000010f3, 0x00001cb3, 0x0000043c, 0x0000041c,
-	0x000105af, 0x00010588, 0x00001efd, 0x00001efc,
-	0x0000ff48, 0x0000ff28, 0x00010ce2, 0x00010ca2,
-	0x0000ff4a, 0x0000ff2a, 0x00001f7c, 0x00001ffa,
-	0x0000a763, 0x0000a762, 0x00001fc6, 0x020000ac,
-	0x000010fa, 0x00001cba, 0x000003b6, 0x00000396,
-	0x00000161, 0x00000160, 0x0000ab74, 0x000013a4,
-	0x000104e9, 0x000104c1, 0x00001ff6, 0x020000d0,
-	0x000001a5, 0x000001a4, 0x00010cc8, 0x00010c88,
-	0x0000abb4, 0x000013e4, 0x000024e6, 0x000024cc,
-	0x000001e7, 0x000001e6, 0x00002c3b, 0x00002c0b,
-	0x000118cb, 0x000118ab, 0x00000271, 0x00002c6e,
-	0x00001e5b, 0x00001e5a, 0x0000ab84, 0x000013b4,
-	0x0000056a, 0x0000053a, 0x000000fe, 0x000000de,
-	0x000013fd, 0x000013f5, 0x000000fd, 0x000000dd,
-	0x000010e5, 0x00001ca5, 0x000105a4, 0x0001057d,
-	0x000000e2, 0x000000c2, 0x0000a659, 0x0000a658,
-	0x0001042d, 0x00010405, 0x00002c4b, 0x00002c1b,
-	0x00000289, 0x00000244, 0x00001e3d, 0x00001e3c,
-	0x0000011b, 0x0000011a, 0x000004c2, 0x000004c1,
-	0x000001bf, 0x000001f7, 0x00000180, 0x00000243,
-	0x00000586, 0x00000556, 0x00002cc5, 0x00002cc4,
-	0x0000ff57, 0x0000ff37, 0x000000f6, 0x000000d6,
-	0x00016e67, 0x00016e47, 0x0001e943, 0x0001e921,
-	0x00016e79, 0x00016e59, 0x00001eb7, 0x00001eb6,
-	0x00000151, 0x00000150, 0x000010e4, 0x00001ca4,
-	0x00000109, 0x00000108, 0x00000454, 0x00000404,
-	0x000118c4, 0x000118a4, 0x00016e6d, 0x00016e4d,
-	0x00002c35, 0x00002c05, 0x00001f31, 0x00001f39,
-	0x00000127, 0x00000126, 0x00000583, 0x00000553,
-	0x00000479, 0x00000478, 0x00001f36, 0x00001f3e,
-	0x0000016d, 0x0000016c, 0x00002c40, 0x00002c10,
-	0x00000481, 0x00000480, 0x00001fab, 0x0200010c,
-	0x000001a1, 0x000001a0, 0x00010428, 0x00010400,
-	0x0000abbe, 0x000013ee, 0x000024d4, 0x000024ba,
-	0x00000507, 0x00000506, 0x0000a695, 0x0000a694,
-	0x00002ce1, 0x00002ce0, 0x0000ff49, 0x0000ff29,
-	0x0000021b, 0x0000021a, 0x00010ccd, 0x00010c8d,
-	0x00000525, 0x00000524, 0x000003d9, 0x000003d8,
-	0x00001ee3, 0x00001ee2, 0x00000240, 0x00002c7f,
-	0x00000575, 0x00000545, 0x00002c48, 0x00002c18,
-	0x00001e01, 0x00001e00, 0x00010cc3, 0x00010c83,
-	0x00016e6e, 0x00016e4e, 0x000013fb, 0x000013f3,
-	0x00001f41, 0x00001f49, 0x00001e31, 0x00001e30,
-	0x0000abab, 0x000013db, 0x000004a7, 0x000004a6,
-	0x00000148, 0x00000147, 0x00001e2d, 0x00001e2c,
-	0x0000a65f, 0x0000a65e, 0x000004eb, 0x000004ea,
-	0x00001ef3, 0x00001ef2, 0x00001eab, 0x00001eaa,
-	0x00002c58, 0x00002c28, 0x0001e939, 0x0001e917,
-	0x000104e1, 0x000104b9, 0x00001ea7, 0x00001ea6,
-	0x00001f42, 0x00001f4a, 0x000024dc, 0x000024c2,
-	0x00002c52, 0x00002c22, 0x00001f25, 0x00001f2d,
-	0x0000a64f, 0x0000a64e, 0x0000a687, 0x0000a686,
-	0x0000fb06, 0x02000068, 0x00001f21, 0x00001f29,
-	0x0000a77f, 0x0000a77e, 0x00016e68, 0x00016e48,
-	0x00002cdf, 0x00002cde, 0x0000ab81, 0x000013b1,
-	0x00000442, 0x00000422, 0x0000abb5, 0x000013e5,
-	0x0000047d, 0x0000047c, 0x00001ef7, 0x00001ef6,
-	0x00001e69, 0x00001e68, 0x0000a74d, 0x0000a74c,
-	0x000004b7, 0x000004b6, 0x00001f9b, 0x020000f4,
-	0x00001ead, 0x00001eac, 0x0000a69b, 0x0000a69a,
-	0x000004f7, 0x000004f6, 0x000003ce, 0x0000038f,
-	0x00001ec7, 0x00001ec6, 0x00000199, 0x00000198,
-	0x00000515, 0x00000514, 0x000105b5, 0x0001058e,
-	0x000024e7, 0x000024cd, 0x0000a74b, 0x0000a74a,
-	0x00000571, 0x00000541, 0x00002c31, 0x00002c01,
-	0x0001044f, 0x00010427, 0x000118df, 0x000118bf,
-	0x00016e7a, 0x00016e5a, 0x000104db, 0x000104b3,
-	0x000003dd, 0x000003dc, 0x00001e27, 0x00001e26,
-	0x0000a649, 0x0000a648, 0x00000475, 0x00000474,
-	0x00010cd9, 0x00010c99, 0x00001e25, 0x00001e24,
-	0x0000048d, 0x0000048c, 0x000003b4, 0x00000394,
-	0x00001f86, 0x02000012, 0x0000ff56, 0x0000ff36,
-	0x00010cc2, 0x00010c82, 0x00000499, 0x00000498,
-	0x00000254, 0x00000186, 0x00001ed9, 0x00001ed8,
-	0x000013fa, 0x000013f2, 0x000024d2, 0x000024b8,
-	0x000104d8, 0x000104b0, 0x00010436, 0x0001040e,
-	0x000003f0, 0x0000039a, 0x00000569, 0x00000539,
-	0x00002184, 0x00002183, 0x00010cef, 0x00010caf,
-	0x0000a655, 0x0000a654, 0x0000217c, 0x0000216c,
-	0x0000043d, 0x0000041d, 0x00001f9c, 0x020000f7,
-	0x00001e1d, 0x00001e1c, 0x0000a643, 0x0000a642,
-	0x00002ccf, 0x00002cce, 0x00001ef5, 0x00001ef4,
-	0x00001e3b, 0x00001e3a, 0x000010d4, 0x00001c94,
-	0x0000abb8, 0x000013e8, 0x0000217a, 0x0000216a,
-	0x00001e8f, 0x00001e8e, 0x0000a68b, 0x0000a68a,
-	0x00010429, 0x00010401, 0x0000fb16, 0x02000077,
-	0x00000269, 0x00000196, 0x0000a7bd, 0x0000a7bc,
-	0x00010448, 0x00010420, 0x00001f65, 0x00001f6d,
-	0x00001f11, 0x00001f19, 0x00001c82, 0x0000041e,
-	0x0000044f, 0x0000042f, 0x000003f3, 0x0000037f,
-	0x0001043c, 0x00010414, 0x00001f64, 0x00001f6c,
-	0x00002174, 0x00002164, 0x000104e5, 0x000104bd,
-	0x00010438, 0x00010410, 0x00001f71, 0x00001fbb,
-	0x000118d2, 0x000118b2, 0x00002ca3, 0x00002ca2,
-	0x000104fb, 0x000104d3, 0x000001f3, 0x000001f1,
-	0x0001059b, 0x00010574, 0x00002ccd, 0x00002ccc,
-	0x00002c76, 0x00002c75, 0x00010433, 0x0001040b,
-	0x00010cc9, 0x00010c89, 0x000004e7, 0x000004e6,
-	0x0001042c, 0x00010404, 0x00001ecd, 0x00001ecc,
-	0x0000ab75, 0x000013a5, 0x0001044a, 0x00010422,
-	0x000003b7, 0x00000397, 0x0001e932, 0x0001e910,
-	0x0000007a, 0x0000005a, 0x000105bb, 0x00010594,
-	0x000105aa, 0x00010583, 0x0001043e, 0x00010416,
-	0x0000019e, 0x00000220, 0x00010cd8, 0x00010c98,
-	0x000105a6, 0x0001057f, 0x00001f81, 0x02000003,
-	0x00000074, 0x00000054, 0x00001e9a, 0x02000097,
-	0x00002c91, 0x00002c90, 0x0000006c, 0x0000004c,
-	0x000001ef, 0x000001ee, 0x000105ab, 0x00010584,
-	0x00001eed, 0x00001eec, 0x0000ff5a, 0x0000ff3a,
-	0x00001e87, 0x00001e86, 0x0000ab9c, 0x000013cc,
-	0x000004d5, 0x000004d4, 0x000000e6, 0x000000c6,
-	0x00000292, 0x000001b7, 0x00001f14, 0x00001f1c,
-	0x000010e6, 0x00001ca6, 0x000104de, 0x000104b6,
-	0x0000ab9b, 0x000013cb, 0x0000a7ca, 0x0000a7c9,
-	0x000010ed, 0x00001cad, 0x000105ac, 0x00010585,
-	0x00000572, 0x00000542, 0x00001f8e, 0x020000e5,
-	0x0000a739, 0x0000a738, 0x0001e93b, 0x0001e919,
-	0x000003c2, 0x000003a3, 0x0000ab78, 0x000013a8,
-	0x000118d3, 0x000118b3, 0x00000432, 0x00000412,
-	0x000024de, 0x000024c4, 0x00001eef, 0x00001eee,
-	0x0000006b, 0x0000004b, 0x0000ab8d, 0x000013bd,
-	0x0000ff55, 0x0000ff35, 0x00001e85, 0x00001e84,
-	0x0000a7c3, 0x0000a7c2, 0x0000fb13, 0x0200006e,
-	0x000118d5, 0x000118b5, 0x00001ed1, 0x00001ed0,
-	0x00001fa6, 0x02000042, 0x00001f76, 0x00001fda,
-	0x0000043a, 0x0000041a, 0x00001f07, 0x00001f0f,
-	0x00000157, 0x00000156, 0x00002c8b, 0x00002c8a,
-	0x0000abad, 0x000013dd, 0x00001f73, 0x00001fc9,
-	0x00002c36, 0x00002c06, 0x00002c81, 0x00002c80,
-	0x0001059e, 0x00010577, 0x00001f79, 0x00001ff9,
-	0x00001e0d, 0x00001e0c, 0x00001e39, 0x00001e38,
-	0x00002c99, 0x00002c98, 0x000104ee, 0x000104c6,
-	0x0000a7d9, 0x0000a7d8, 0x00010cd3, 0x00010c93,
-	0x0000ab8e, 0x000013be, 0x0000ff4f, 0x0000ff2f,
-	0x0001e923, 0x0001e901, 0x00000077, 0x00000057,
-	0x000010e2, 0x00001ca2, 0x00000135, 0x00000134,
-	0x00000501, 0x00000500, 0x000000ff, 0x00000178,
-	0x0001e93d, 0x0001e91b, 0x000003f8, 0x000003f7,
-	0x00010cc7, 0x00010c87, 0x000000f1, 0x000000d1,
-	0x00010cdc, 0x00010c9c, 0x000118d9, 0x000118b9,
-	0x00000446, 0x00000426, 0x00001c84, 0x00000422,
-	0x00002c85, 0x00002c84, 0x000105b4, 0x0001058d,
-	0x00002c56, 0x00002c26, 0x0000016b, 0x0000016a,
-	0x00002cad, 0x00002cac, 0x00000577, 0x00000547,
-	0x0000013c, 0x0000013b, 0x0000a7d7, 0x0000a7d6,
-	0x0000a663, 0x0000a662, 0x00002cc7, 0x00002cc6,
-	0x0000ab83, 0x000013b3, 0x000001e5, 0x000001e4,
-	0x000000fb, 0x000000db, 0x0000050b, 0x0000050a,
-	0x00001fb2, 0x02000124, 0x00001ef9, 0x00001ef8,
-	0x000000eb, 0x000000cb, 0x0000a737, 0x0000a736,
-	0x00000430, 0x00000410, 0x00001ea3, 0x00001ea2,
-	0x00000064, 0x00000044, 0x0000044b, 0x0000042b,
-	0x0000aba8, 0x000013d8, 0x0001e922, 0x0001e900,
-	0x0000a757, 0x0000a756, 0x00001c87, 0x00000462,
-	0x000024e4, 0x000024ca, 0x000003c4, 0x000003a4,
-	0x00000165, 0x00000164, 0x00000061, 0x00000041,
-	0x00002c65, 0x0000023a, 0x00001f99, 0x020000ee,
-	0x000003ba, 0x0000039a, 0x00001ff4, 0x02000133,
-	0x00000192, 0x00000191, 0x000003b5, 0x00000395,
-	0x000001df, 0x000001de, 0x000000b5, 0x0000039c,
-	0x00002d14, 0x000010b4, 0x0000fb05, 0x02000065,
-	0x00002d1a, 0x000010ba, 0x000001e9, 0x000001e8,
-	0x0000fb04, 0x03000061, 0x000003cd, 0x0000038e,
-	0x00000259, 0x0000018f, 0x0000017c, 0x0000017b,
-	0x000010e1, 0x00001ca1, 0x0001059c, 0x00010575,
-	0x000024e9, 0x000024cf, 0x00001f00, 0x00001f08,
-	0x00016e6c, 0x00016e4c, 0x00000447, 0x00000427,
-	0x00016e6f, 0x00016e4f, 0x00001e7f, 0x00001e7e,
-	0x000010f2, 0x00001cb2, 0x000004cf, 0x000004c0,
-	0x00001f80, 0x02000000, 0x00001e6f, 0x00001e6e,
-	0x000001cc, 0x000001ca, 0x0000ab96, 0x000013c6,
-	0x00001fc7, 0x0300013a, 0x00001fe6, 0x020000c9,
-	0x0000a693, 0x0000a692, 0x00002c66, 0x0000023e,
-	0x000024d6, 0x000024bc, 0x00001ee9, 0x00001ee8,
-	0x00001f8a, 0x020000d9, 0x000000ec, 0x000000cc,
-	0x000003c7, 0x000003a7, 0x00000253, 0x00000181,
-	0x00016e7d, 0x00016e5d, 0x000010db, 0x00001c9b,
-	0x00010431, 0x00010409, 0x0000029d, 0x0000a7b2,
-	0x00001f10, 0x00001f18, 0x0000ab7a, 0x000013aa,
-	0x00000441, 0x00000421, 0x00001f9d, 0x020000fa,
-	0x0000a787, 0x0000a786, 0x00010cf0, 0x00010cb0,
-	0x00002d27, 0x000010c7, 0x0000044c, 0x0000042c,
-	0x000000f9, 0x000000d9, 0x0000a641, 0x0000a640,
-	0x000004bb, 0x000004ba, 0x0001042e, 0x00010406,
-	0x00002d06, 0x000010a6, 0x0000a685, 0x0000a684,
-	0x0000abb9, 0x000013e9, 0x000004c6, 0x000004c5,
-	0x0000ab82, 0x000013b2, 0x0000a77c, 0x0000a77b,
-	0x00002cf3, 0x00002cf2, 0x000003c1, 0x000003a1,
-	0x0000024d, 0x0000024c, 0x00016e64, 0x00016e44,
-	0x000010d5, 0x00001c95, 0x0000fb02, 0x0200005a,
-	0x00001f45, 0x00001f4d, 0x0000a651, 0x0000a650,
-	0x00016e72, 0x00016e52, 0x0000043b, 0x0000041b,
-	0x00010cd4, 0x00010c94, 0x00001e37, 0x00001e36,
-	0x00000582, 0x00000552, 0x0000abac, 0x000013dc,
-	0x0000ff46, 0x0000ff26, 0x00001e63, 0x00001e62,
-	0x00000173, 0x00000172, 0x000004b5, 0x000004b4,
-	0x000024d0, 0x000024b6, 0x000024d7, 0x000024bd,
-	0x0000026c, 0x0000a7ad, 0x00010ce9, 0x00010ca9,
-	0x00001d8e, 0x0000a7c6, 0x00001edd, 0x00001edc,
-	0x0000017a, 0x00000179, 0x0000052f, 0x0000052e,
-	0x000003bb, 0x0000039b, 0x0001e930, 0x0001e90e,
-	0x0000a725, 0x0000a724, 0x00000579, 0x00000549,
-	0x000003f5, 0x00000395, 0x00001f57, 0x00001f5f,
-	0x0000a769, 0x0000a768, 0x00010597, 0x00010570,
-	0x00000435, 0x00000415, 0x00001f89, 0x020000d6,
-	0x000010ea, 0x00001caa, 0x0000a7f6, 0x0000a7f5,
-	0x00002ca5, 0x00002ca4, 0x00001fd1, 0x00001fd9,
-	0x00001fa2, 0x02000036, 0x0000a681, 0x0000a680,
-	0x000004af, 0x000004ae, 0x00002179, 0x00002169,
-	0x00001e9b, 0x00001e60, 0x00010cc5, 0x00010c85,
-	0x000004e9, 0x000004e8, 0x0000026f, 0x0000019c,
-	0x00010443, 0x0001041b, 0x000010ee, 0x00001cae,
-	0x00000529, 0x00000528, 0x0000ab90, 0x000013c0,
-	0x0001e92a, 0x0001e908, 0x000010e9, 0x00001ca9,
-	0x00016e75, 0x00016e55, 0x0000aba7, 0x000013d7,
-	0x00000121, 0x00000120, 0x00000247, 0x00000246,
-	0x00001e96, 0x0200008b, 0x00002c33, 0x00002c03,
-	0x00001f8f, 0x020000e8, 0x00001e2b, 0x00001e2a,
-	0x00000584, 0x00000554, 0x0000ab98, 0x000013c8,
-	0x00000288, 0x000001ae, 0x00001fa9, 0x02000106,
-	0x00002d10, 0x000010b0, 0x00002cd9, 0x00002cd8,
-	0x000104f4, 0x000104cc, 0x00001e91, 0x00001e90,
-	0x00000574, 0x00000544, 0x000003b2, 0x00000392,
-	0x00000373, 0x00000372, 0x00016e77, 0x00016e57,
-	0x000001ed, 0x000001ec, 0x0000043e, 0x0000041e,
-	0x000118c5, 0x000118a5, 0x0001e93c, 0x0001e91a,
-	0x0000a723, 0x0000a722, 0x0000056d, 0x0000053d,
-	0x0000019a, 0x0000023d, 0x00001eb5, 0x00001eb4,
-	0x0000a76d, 0x0000a76c, 0x00016e76, 0x00016e56,
-	0x00000185, 0x00000184, 0x00001f85, 0x0200000f,
-	0x00001e11, 0x00001e10, 0x00002d2d, 0x000010cd,
-	0x00000467, 0x00000466, 0x00001fc3, 0x0200004b,
-	0x00010ce5, 0x00010ca5, 0x000118d6, 0x000118b6,
-	0x0000abb1, 0x000013e1, 0x000105b7, 0x00010590,
-	0x000004ce, 0x000004cd, 0x000000e0, 0x000000c0,
-	0x00002d17, 0x000010b7, 0x000003af, 0x0000038a,
-	0x000003df, 0x000003de, 0x000001dc, 0x000001db,
-	0x0000ab79, 0x000013a9, 0x00002172, 0x00002162,
-	0x00001f05, 0x00001f0d, 0x000000f3, 0x000000d3,
-	0x000105b6, 0x0001058f, 0x000024d9, 0x000024bf,
-	0x000000f8, 0x000000d8, 0x00002d12, 0x000010b2,
-	0x000118c6, 0x000118a6, 0x00002c5f, 0x00002c2f,
-	0x00001f20, 0x00001f28, 0x00001e0f, 0x00001e0e,
-	0x000118c7, 0x000118a7, 0x0000045d, 0x0000040d,
-	0x00000159, 0x00000158, 0x000118cf, 0x000118af,
-	0x00010cd7, 0x00010c97, 0x00001f54, 0x030000a1,
-	0x000104e8, 0x000104c0, 0x00010cd0, 0x00010c90,
-	0x00010cc0, 0x00010c80, 0x00002d0d, 0x000010ad,
-	0x00000113, 0x00000112, 0x0001044c, 0x00010424,
-	0x0000a741, 0x0000a740, 0x00002d0c, 0x000010ac,
-	0x000105a1, 0x0001057a, 0x00001f03, 0x00001f0b,
-	0x00001fbc, 0x0200011b, 0x000105b8, 0x00010591,
-	0x0000045c, 0x0000040c, 0x00001f52, 0x0300009d,
-	0x000013f9, 0x000013f1, 0x00000493, 0x00000492,
-	0x00001f12, 0x00001f1a, 0x00001f32, 0x00001f3a,
-	0x00002c4e, 0x00002c1e, 0x0000015b, 0x0000015a,
-	0x00002c8d, 0x00002c8c, 0x00001f50, 0x0200009a,
-	0x00001e45, 0x00001e44, 0x0000aba0, 0x000013d0,
-	0x00002cd5, 0x00002cd4, 0x00001ff7, 0x0300013e,
-	0x00001e83, 0x00001e82, 0x00000079, 0x00000059,
-	0x000004d1, 0x000004d0, 0x00000201, 0x00000200,
-	0x00001ebf, 0x00001ebe, 0x0000a689, 0x0000a688,
-	0x0000217d, 0x0000216d, 0x000105b9, 0x00010592,
-	0x0001e924, 0x0001e902, 0x00016e78, 0x00016e58,
-	0x0000ab91, 0x000013c1, 0x0001059a, 0x00010573,
-	0x00001faa, 0x02000109, 0x00001e1b, 0x00001e1a,
-	0x00002c3e, 0x00002c0e, 0x00002cb3, 0x00002cb2,
-	0x00001f77, 0x00001fdb, 0x00000062, 0x00000042,
-	0x00000078, 0x00000058, 0x0000ab72, 0x000013a2,
-	0x00001fb3, 0x02000048, 0x00001e3f, 0x00001e3e,
-	0x0000a665, 0x0000a664, 0x00002c39, 0x00002c09,
-	0x0000ff59, 0x0000ff39, 0x00001e75, 0x00001e74,
-	0x000105b1, 0x0001058a, 0x00002d19, 0x000010b9,
-	0x000003b3, 0x00000393, 0x00001eb9, 0x00001eb8,
-	0x00001f44, 0x00001f4c, 0x00002cbf, 0x00002cbe,
-	0x000105a3, 0x0001057c, 0x00001fe7, 0x030000cc,
-	0x0000014b, 0x0000014a, 0x0000a794, 0x0000a7c4,
-	0x0000aba1, 0x000013d1, 0x00001f33, 0x00001f3b,
-	0x00000129, 0x00000128, 0x00002c45, 0x00002c15,
-	0x00002c47, 0x00002c17, 0x00010439, 0x00010411,
-	0x00000177, 0x00000176, 0x00016e7f, 0x00016e5f,
-	0x0000aba5, 0x000013d5, 0x00001fad, 0x02000112,
-	0x000001a3, 0x000001a2, 0x00000456, 0x00000406,
-	0x00002cc1, 0x00002cc0, 0x0001043f, 0x00010417,
-	0x000000fa, 0x000000da, 0x00002c6a, 0x00002c69,
-	0x00000521, 0x00000520, 0x0000aba2, 0x000013d2,
-	0x0000021d, 0x0000021c, 0x00001fbe, 0x00000399,
-	0x0000fb01, 0x02000057, 0x000003c3, 0x000003a3,
-	0x00000219, 0x00000218, 0x0000012b, 0x0000012a,
-	0x00002d23, 0x000010c3, 0x00016e7b, 0x00016e5b,
-	0x000001f2, 0x000001f1, 0x00010437, 0x0001040f,
-	0x0000ab95, 0x000013c5, 0x00000449, 0x00000429,
-	0x0000ab7c, 0x000013ac, 0x00001ed5, 0x00001ed4,
-	0x0000a657, 0x0000a656, 0x0000ab7d, 0x000013ad,
-	0x0000020d, 0x0000020c, 0x000001d2, 0x000001d1,
-	0x000001c5, 0x000001c4, 0x000004f3, 0x000004f2,
-	0x00000268, 0x00000197, 0x00001ec5, 0x00001ec4,
-	0x0000029e, 0x0000a7b0, 0x00002cd1, 0x00002cd0,
-	0x000104dd, 0x000104b5, 0x0000021f, 0x0000021e,
-	0x000000ee, 0x000000ce, 0x000010f4, 0x00001cb4,
-	0x00000131, 0x00000049, 0x0001e93e, 0x0001e91c,
-	0x0000006a, 0x0000004a, 0x000003d0, 0x00000392,
-	0x00000448, 0x00000428, 0x0000a73d, 0x0000a73c,
-	0x0000011f, 0x0000011e, 0x00016e6a, 0x00016e4a,
-	0x00000453, 0x00000403, 0x00010447, 0x0001041f,
-	0x00002d1e, 0x000010be, 0x00000125, 0x00000124,
-	0x0000047f, 0x0000047e, 0x00001fcc, 0x0200011e,
-	0x000000ea, 0x000000ca, 0x000104f9, 0x000104d1,
-	0x00001f8c, 0x020000df, 0x000105a7, 0x00010580,
-	0x0000ab97, 0x000013c7, 0x00002d24, 0x000010c4,
-	0x000004f9, 0x000004f8, 0x000104e4, 0x000104bc,
-	0x00000213, 0x00000212, 0x000001d0, 0x000001cf,
-	0x000001c6, 0x000001c4, 0x000001b0, 0x000001af,
-	0x00001c86, 0x0000042a, 0x000013fc, 0x000013f4,
-	0x00000573, 0x00000543, 0x000003e9, 0x000003e8,
-	0x00001f34, 0x00001f3c, 0x00000133, 0x00000132,
-	0x0000ab94, 0x000013c4, 0x0000047b, 0x0000047a,
-	0x0000ab85, 0x000013b5, 0x00000562, 0x00000532,
-	0x0000a64b, 0x0000a64a, 0x00002c57, 0x00002c27,
-	0x0001e927, 0x0001e905, 0x000001ad, 0x000001ac,
-	0x000001a8, 0x000001a7, 0x000004f5, 0x000004f4,
-	0x00001f93, 0x02000021, 0x0001059f, 0x00010578,
-	0x000010ec, 0x00001cac, 0x000004fb, 0x000004fa,
-	0x00010cd1, 0x00010c91, 0x00000227, 0x00000226,
-	0x00000225, 0x00000224, 0x0000056f, 0x0000053f,
-	0x000003b9, 0x00000399, 0x00000188, 0x00000187,
-	0x00000123, 0x00000122, 0x00016e69, 0x00016e49,
-	0x000003fb, 0x000003fa, 0x00001eaf, 0x00001eae,
-	0x000118c0, 0x000118a0, 0x0000a743, 0x0000a742,
-	0x00010cee, 0x00010cae, 0x00001f83, 0x02000009,
-	0x0000a761, 0x0000a760, 0x0000a645, 0x0000a644,
-	0x0000ab92, 0x000013c2, 0x000003d5, 0x000003a6,
-	0x00001e5f, 0x00001e5e, 0x0000ab9f, 0x000013cf,
-	0x000004ad, 0x000004ac, 0x0000abaa, 0x000013da,
-	0x00001e99, 0x02000094, 0x0000010d, 0x0000010c,
-	0x000004ef, 0x000004ee, 0x00000491, 0x00000490,
-	0x00002cb9, 0x00002cb8, 0x0000a7c1, 0x0000a7c0,
-	0x00016e73, 0x00016e53, 0x00000105, 0x00000104,
-	0x00001e7d, 0x00001e7c, 0x0000013e, 0x0000013d,
-	0x00010ce3, 0x00010ca3, 0x000003f1, 0x000003a1,
-	0x00001f53, 0x00001f5b, 0x0000a76f, 0x0000a76e,
-	0x00001f94, 0x02000024, 0x0000017f, 0x00000053,
-	0x00001f8d, 0x020000e2, 0x0000a7bb, 0x0000a7ba,
-	0x000118d0, 0x000118b0, 0x00002ca1, 0x00002ca0,
-	0x0000a7c8, 0x0000a7c7, 0x00001e47, 0x00001e46,
-	0x00010cec, 0x00010cac, 0x000004ed, 0x000004ec,
-	0x000104fa, 0x000104d2, 0x00001e97, 0x0200008e,
-	0x00000075, 0x00000055, 0x000004e5, 0x000004e4,
-	0x0000020b, 0x0000020a, 0x00001ec1, 0x00001ec0,
-	0x00002c73, 0x00002c72, 0x00000567, 0x00000537,
-	0x000003ad, 0x00000388, 0x0001e934, 0x0001e912,
-	0x0000a733, 0x0000a732, 0x00000275, 0x0000019f,
-	0x00016e71, 0x00016e51, 0x00001f51, 0x00001f59,
-	0x000024e2, 0x000024c8, 0x000118d1, 0x000118b1,
-	0x00002c5d, 0x00002c2d, 0x00001f8b, 0x020000dc,
-	0x00001e13, 0x00001e12, 0x00001fc2, 0x0200012a,
-	0x00000461, 0x00000460, 0x00001f91, 0x0200001b,
-	0x00001e53, 0x00001e52, 0x000000f0, 0x000000d0,
-	0x000004a1, 0x000004a0, 0x00001f72, 0x00001fc8,
-	0x000000f5, 0x000000d5, 0x00001fb4, 0x02000127,
-	0x00002d11, 0x000010b1, 0x000024da, 0x000024c0,
-	0x00002d0a, 0x000010aa, 0x00000076, 0x00000056,
-	0x0000057d, 0x0000054d, 0x000001f9, 0x000001f8,
-	0x0001e938, 0x0001e916, 0x0000a72d, 0x0000a72c,
-	0x000010f1, 0x00001cb1, 0x00001f24, 0x00001f2c,
-	0x00000107, 0x00000106, 0x0000a653, 0x0000a652,
-	0x000010fd, 0x00001cbd, 0x0001e935, 0x0001e913,
-	0x00001e81, 0x00001e80, 0x0000a7a7, 0x0000a7a6,
-	0x00000119, 0x00000118, 0x0000ff54, 0x0000ff34,
-	0x0000037d, 0x000003ff, 0x00001e05, 0x00001e04,
-	0x0000057a, 0x0000054a, 0x00002c5e, 0x00002c2e,
-	0x00000203, 0x00000202, 0x00002c42, 0x00002c12,
-	0x0000028c, 0x00000245, 0x00002c44, 0x00002c14,
-	0x000003b1, 0x00000391, 0x000003f2, 0x000003f9,
-	0x000118de, 0x000118be, 0x00002d03, 0x000010a3,
-	0x000003e7, 0x000003e6, 0x000004c4, 0x000004c3,
-	0x00001f7a, 0x00001fea, 0x00010ce4, 0x00010ca4,
-	0x0000aba3, 0x000013d3, 0x0000ab8a, 0x000013ba,
-	0x00002c50, 0x00002c20, 0x000003e1, 0x000003e0,
-	0x00000153, 0x00000152, 0x0000028a, 0x000001b1,
-	0x00001e0b, 0x00001e0a, 0x0000ab88, 0x000013b8,
-	0x00002c97, 0x00002c96, 0x00002d16, 0x000010b6,
-	0x00001e57, 0x00001e56, 0x0000a66b, 0x0000a66a,
-	0x00000149, 0x0200007d, 0x0000ff51, 0x0000ff31,
-	0x00001fd2, 0x030000af, 0x0000045a, 0x0000040a,
-	0x00002d09, 0x000010a9, 0x00000137, 0x00000136,
-	0x00001ebd, 0x00001ebc, 0x000118d4, 0x000118b4,
-	0x00016e6b, 0x00016e4b, 0x00001fa8, 0x02000103,
-	0x00001eff, 0x00001efe, 0x000001da, 0x000001d9,
-	0x00010cde, 0x00010c9e, 0x00010598, 0x00010571,
-	0x0001044e, 0x00010426, 0x0000a75f, 0x0000a75e,
-	0x0001043d, 0x00010415, 0x000003ac, 0x00000386,
-	0x00000115, 0x00000114, 0x00001e15, 0x00001e14,
-	0x00001ff2, 0x02000130, 0x00002cbd, 0x00002cbc,
-	0x00001fb1, 0x00001fb9, 0x00001fa1, 0x02000033,
-	0x0000a661, 0x0000a660, 0x00002c89, 0x00002c88,
-	0x00001ff3, 0x0200004e, 0x00001e59, 0x00001e58,
-	0x0000ff42, 0x0000ff22, 0x00002d13, 0x000010b3,
-	0x000003db, 0x000003da, 0x00001f27, 0x00001f2f,
-	0x000118db, 0x000118bb, 0x0001e941, 0x0001e91f,
-	0x000003b8, 0x00000398, 0x00001ed3, 0x00001ed2,
-	0x000000ed, 0x000000cd, 0x000010ff, 0x00001cbf,
-	0x00000390, 0x03000080, 0x00001e77, 0x00001e76,
-	0x0000a755, 0x0000a754, 0x00002d25, 0x000010c5,
-	0x000004a9, 0x000004a8, 0x00001f7b, 0x00001feb,
-	0x00000167, 0x00000166, 0x0000a749, 0x0000a748,
-	0x0000ab7b, 0x000013ab, 0x0000ff4e, 0x0000ff2e,
-	0x00001f75, 0x00001fcb, 0x000010d6, 0x00001c96,
-	0x0001044d, 0x00010425, 0x0000027d, 0x00002c64,
-	0x000001e1, 0x000001e0, 0x000001d8, 0x000001d7,
-	0x000004fd, 0x000004fc, 0x000001b6, 0x000001b5,
-	0x00001fa3, 0x02000039, 0x00001d7d, 0x00002c63,
-	0x00001f78, 0x00001ff8, 0x00001f06, 0x00001f0e,
-	0x0000025b, 0x00000190, 0x00000175, 0x00000174,
-	0x000010e3, 0x00001ca3, 0x00002c68, 0x00002c67,
-	0x000105ae, 0x00010587, 0x00002d00, 0x000010a0,
-	0x00001c83, 0x00000421, 0x00002c51, 0x00002c21,
-	0x00001e03, 0x00001e02, 0x0000a797, 0x0000a796,
-	0x0000015d, 0x0000015c, 0x00000495, 0x00000494,
-	0x00001fb7, 0x03000136, 0x00001e71, 0x00001e70,
-	0x0000a745, 0x0000a744, 0x00010435, 0x0001040d,
-	0x00000570, 0x00000540, 0x00001f9f, 0x02000100,
-	0x00010ccf, 0x00010c8f, 0x00002cdd, 0x00002cdc,
-	0x0001044b, 0x00010423, 0x00001eeb, 0x00001eea,
-	0x0000014d, 0x0000014c, 0x0000056b, 0x0000053b,
-	0x000003c9, 0x000003a9, 0x0000ab9d, 0x000013cd,
-	0x00000069, 0x00000049, 0x000010dd, 0x00001c9d,
-	0x00000458, 0x00000408, 0x00010442, 0x0001041a,
-	0x00001f96, 0x0200002a, 0x00000252, 0x00002c70,
-	0x00000443, 0x00000423, 0x00010441, 0x00010419,
-	0x000000e3, 0x000000c3, 0x00001c88, 0x0000a64a,
-	0x00002176, 0x00002166, 0x0000ab86, 0x000013b6,
-	0x00001e6b, 0x00001e6a, 0x0000abbb, 0x000013eb,
-	0x000004bd, 0x000004bc, 0x0000abbc, 0x000013ec,
-	0x0000ab8b, 0x000013bb, 0x0000a68f, 0x0000a68e,
-	0x000004e3, 0x000004e2, 0x00002d02, 0x000010a2,
-	0x00001ee5, 0x00001ee4, 0x00002cee, 0x00002ced,
-	0x00010ce1, 0x00010ca1, 0x0000abb2, 0x000013e2,
-	0x0000024f, 0x0000024e, 0x00000233, 0x00000232,
-	0x000010d7, 0x00001c97, 0x00002cab, 0x00002caa,
-	0x0001e92f, 0x0001e90d, 0x000003b0, 0x03000084,
-	0x0001042b, 0x00010403, 0x00002173, 0x00002163,
-	0x0000fb14, 0x02000071, 0x0000a783, 0x0000a782,
-	0x00002c32, 0x00002c02, 0x00002c3c, 0x00002c0c,
-	0x00010ceb, 0x00010cab, 0x00001e65, 0x00001e64,
-	0x00002cb1, 0x00002cb0, 0x000104f3, 0x000104cb,
-	0x000118da, 0x000118ba, 0x00001fe5, 0x00001fec,
-	0x00000568, 0x00000538, 0x00010444, 0x0001041c,
-	0x000024dd, 0x000024c3, 0x00001edf, 0x00001ede,
-	0x00002178, 0x00002168, 0x00002cb7, 0x00002cb6,
-	0x000003bd, 0x0000039d, 0x00000287, 0x0000a7b1,
-	0x000105bc, 0x00010595, 0x000010d1, 0x00001c91,
-	0x00010440, 0x00010418, 0x00002cec, 0x00002ceb,
-	0x00001f60, 0x00001f68, 0x00002c3d, 0x00002c0d,
-	0x00000437, 0x00000417, 0x0000ab89, 0x000013b9,
-	0x000000e8, 0x000000c8, 0x000001c9, 0x000001c7,
-	0x00000469, 0x00000468, 0x00001fd3, 0x030000b3,
-	0x0000a7a3, 0x0000a7a2, 0x0000a683, 0x0000a682,
-	0x000004b1, 0x000004b0, 0x0000ff47, 0x0000ff27,
-	0x00000249, 0x00000248, 0x0000014f, 0x0000014e,
-	0x000004ff, 0x000004fe, 0x0000037b, 0x000003fd,
-	0x00000215, 0x00000214, 0x000004c8, 0x000004c7,
-	0x0000052b, 0x0000052a, 0x000104da, 0x000104b2,
-	0x0001e92c, 0x0001e90a, 0x0000015f, 0x0000015e,
-	0x00016e74, 0x00016e54, 0x0000048f, 0x0000048e,
-	0x000104e0, 0x000104b8, 0x000104ed, 0x000104c5,
-	0x00010ce6, 0x00010ca6, 0x0000214e, 0x00002132,
-	0x00000578, 0x00000548, 0x00001e19, 0x00001e18,
-	0x00000071, 0x00000051, 0x0000046f, 0x0000046e,
-	0x0000ab76, 0x000013a6, 0x00000063, 0x00000043,
-	0x000003c8, 0x000003a8, 0x0001042f, 0x00010407,
-	0x000104f6, 0x000104ce, 0x0000011d, 0x0000011c,
-	0x00001f26, 0x00001f2e, 0x00002d1f, 0x000010bf,
-	0x00000371, 0x00000370, 0x00001ecb, 0x00001eca,
-	0x0000044d, 0x0000042d, 0x0000ab53, 0x0000a7b3,
-	0x00000205, 0x00000204, 0x0000026b, 0x00002c62,
-	0x0000a729, 0x0000a728, 0x00000563, 0x00000533,
-	0x00002c4a, 0x00002c1a, 0x0001e92b, 0x0001e909,
-	0x000003c6, 0x000003a6, 0x000118dc, 0x000118bc,
-	0x0000ab71, 0x000013a1, 0x000003d6, 0x000003a0,
-	0x00001e17, 0x00001e16, 0x000118cc, 0x000118ac,
-	0x00000465, 0x00000464, 0x00001ec9, 0x00001ec8,
-	0x00001e55, 0x00001e54, 0x0000044e, 0x0000042e,
-	0x000004a3, 0x000004a2, 0x000104f0, 0x000104c8,
-	0x00001e95, 0x00001e94, 0x00002d0e, 0x000010ae,
-	0x00002d15, 0x000010b5, 0x000000df, 0x02000051,
-	0x000001c8, 0x000001c7, 0x00010ced, 0x00010cad,
-	0x000001b4, 0x000001b3, 0x0000ab9e, 0x000013ce,
-	0x000105a9, 0x00010582, 0x00000434, 0x00000414,
-	0x00002c83, 0x00002c82, 0x000003e5, 0x000003e4,
-	0x00001f74, 0x00001fca, 0x00010ccc, 0x00010c8c,
-	0x000010f9, 0x00001cb9, 0x000003c0, 0x000003a0,
-	0x0000ff43, 0x0000ff23, 0x0000a7a5, 0x0000a7a4,
-	0x00000066, 0x00000046, 0x00002c95, 0x00002c94,
-	0x00001f97, 0x0200002d, 0x00001f43, 0x00001f4b,
-	0x0000a667, 0x0000a666, 0x00002c46, 0x00002c16,
-	0x000104ea, 0x000104c2, 0x00001e8b, 0x00001e8a,
-	0x0000a7bf, 0x0000a7be, 0x000004d9, 0x000004d8,
-	0x00000171, 0x00000170, 0x0001059d, 0x00010576,
-	0x00000195, 0x000001f6, 0x000010f8, 0x00001cb8,
-	0x000105ad, 0x00010586, 0x0000025c, 0x0000a7ab,
-	0x00000436, 0x00000416, 0x00016e60, 0x00016e40,
-	0x00002c4c, 0x00002c1c, 0x00001e4f, 0x00001e4e,
-	0x000118cd, 0x000118ad, 0x0000049d, 0x0000049c,
-	0x00002d22, 0x000010c2, 0x00002c34, 0x00002c04,
-	0x000118c2, 0x000118a2, 0x0000056e, 0x0000053e,
-	0x00002c93, 0x00002c92, 0x000118d7, 0x000118b7,
-	0x000105a5, 0x0001057e, 0x00002c30, 0x00002c00,
-	0x00002171, 0x00002161, 0x0000ff53, 0x0000ff33,
-	0x000000fc, 0x000000dc, 0x000000e7, 0x000000c7,
-	0x000004d7, 0x000004d6, 0x0000022d, 0x0000022c,
-	0x00000068, 0x00000048, 0x00000207, 0x00000206,
-	0x0000abbf, 0x000013ef, 0x0000ab9a, 0x000013ca,
-	0x00010446, 0x0001041e, 0x0000006d, 0x0000004d,
-	0x00000457, 0x00000407, 0x00000517, 0x00000516,
-	0x0001e942, 0x0001e920, 0x0000a759, 0x0000a758,
-	0x00001c81, 0x00000414, 0x00002c4f, 0x00002c1f,
-	0x00000073, 0x00000053, 0x0000a799, 0x0000a798,
-	0x00000580, 0x00000550, 0x0000abba, 0x000013ea,
-	0x000024d5, 0x000024bb, 0x00001e41, 0x00001e40,
-	0x000001cb, 0x000001ca, 0x00002cc9, 0x00002cc8,
-	0x00000183, 0x00000182, 0x000024d3, 0x000024b9,
-	0x00001f82, 0x02000006, 0x00002d07, 0x000010a7,
-	0x0000217f, 0x0000216f, 0x00001ebb, 0x00001eba,
-	0x00000265, 0x0000a78d, 0x0000050d, 0x0000050c,
-	0x000010de, 0x00001c9e, 0x000010f0, 0x00001cb0,
-	0x000001f5, 0x000001f4, 0x0000a64d, 0x0000a64c,
-	0x00000566, 0x00000536, 0x00001f35, 0x00001f3d,
-	0x0000a753, 0x0000a752, 0x00000587, 0x0200006b,
-	0x00002c49, 0x00002c19, 0x000024df, 0x000024c5,
-	0x00001e33, 0x00001e32, 0x00000266, 0x0000a7aa,
-	0x00002c9f, 0x00002c9e, 0x00001faf, 0x02000118,
-	0x0000aba4, 0x000013d4, 0x0000a65d, 0x0000a65c,
-	0x00002cc3, 0x00002cc2, 0x00001fb0, 0x00001fb8,
-	0x00001e23, 0x00001e22, 0x00001ffc, 0x02000121,
-	0x00010cc6, 0x00010c86, 0x0001042a, 0x00010402,
-	0x00001f92, 0x0200001e, 0x000010e8, 0x00001ca8,
-	0x00000452, 0x00000402, 0x00001e98, 0x02000091,
-	0x0001e937, 0x0001e915, 0x00002cb5, 0x00002cb4,
-	0x00000242, 0x00000241, 0x00010cf1, 0x00010cb1,
-	0x0001e92d, 0x0001e90b, 0x0000a751, 0x0000a750,
-	0x00000581, 0x00000551, 0x00002c5b, 0x00002c2b,
-	0x00001e79, 0x00001e78, 0x0000a79d, 0x0000a79c,
-	0x00010cd2, 0x00010c92, 0x0000049f, 0x0000049e,
-	0x00000144, 0x00000143, 0x00001fc4, 0x0200012d,
-	0x00000140, 0x0000013f, 0x00001f62, 0x00001f6a,
-	0x00001fac, 0x0200010f, 0x00000505, 0x00000504,
-	0x00000111, 0x00000110, 0x00000519, 0x00000518,
-	0x00010445, 0x0001041d, 0x0000a73f, 0x0000a73e,
-	0x000001f0, 0x02000088, 0x00001f9e, 0x020000fd,
-	0x000118dd, 0x000118bd, 0x00000211, 0x00000210,
-	0x0000018c, 0x0000018b, 0x00000513, 0x00000512,
-	0x000104ef, 0x000104c7, 0x0000a7b9, 0x0000a7b8,
-	0x0000a75b, 0x0000a75a, 0x0000057c, 0x0000054c,
-	0x00002c55, 0x00002c25, 0x0000028b, 0x000001b2,
-	0x00001e2f, 0x00001e2e, 0x0001e925, 0x0001e903,
-	0x0000ab8c, 0x000013bc, 0x00001f30, 0x00001f38,
-	0x00001e4d, 0x00001e4c, 0x0001e93f, 0x0001e91d,
-	0x0000049b, 0x0000049a, 0x0000ff50, 0x0000ff30,
-	0x00001ea9, 0x00001ea8, 0x00002175, 0x00002165,
-	0x00002ca7, 0x00002ca6, 0x000024e1, 0x000024c7,
-	0x00000280, 0x000001a6, 0x000118d8, 0x000118b8,
-	0x00002c38, 0x00002c08, 0x0000ab7f, 0x000013af,
-	0x00001f23, 0x00001f2b, 0x00002d1c, 0x000010bc,
-	0x000010d9, 0x00001c99, 0x0000037c, 0x000003fe,
-	0x00001fb6, 0x020000a9, 0x0000a7a1, 0x0000a7a0,
-	0x00016e66, 0x00016e46, 0x000104e7, 0x000104bf,
-	0x0000abb6, 0x000013e6, 0x000000e4, 0x000000c4,
-	0x00010cdb, 0x00010c9b, 0x00002c61, 0x00002c60,
-	0x0000ab70, 0x000013a0, 0x0000a727, 0x0000a726,
-	0x00010434, 0x0001040c, 0x000004a5, 0x000004a4,
-	0x000104dc, 0x000104b4, 0x00001ea1, 0x00001ea0,
-	0x0000a699, 0x0000a698, 0x00002ca9, 0x00002ca8,
-	0x00002177, 0x00002167, 0x0000024b, 0x0000024a,
-	0x0000012d, 0x0000012c, 0x00000565, 0x00000535,
-	0x0000fb15, 0x02000074, 0x00001f98, 0x020000eb,
-	0x00001c80, 0x00000412, 0x000010e0, 0x00001ca0,
-	0x000104eb, 0x000104c3, 0x00002c3f, 0x00002c0f,
-	0x0000abae, 0x000013de, 0x0000fb00, 0x02000054,
-	0x00000473, 0x00000472, 0x00001f95, 0x02000027,
-	0x00001e4b, 0x00001e4a, 0x0000a647, 0x0000a646,
-	0x00000463, 0x00000462, 0x00000250, 0x00002c6f,
-	0x0000a79f, 0x0000a79e, 0x0000048b, 0x0000048a,
-	0x000004ab, 0x000004aa, 0x000104df, 0x000104b7,
-	0x0000a7b7, 0x0000a7b6, 0x00001fe2, 0x030000be,
-	0x0000fb17, 0x0200007a, 0x00002c5c, 0x00002c2c,
-	0x000013f8, 0x000013f0, 0x000010f6, 0x00001cb6,
-	0x000003cc, 0x0000038c, 0x00000065, 0x00000045,
-	0x0001e92e, 0x0001e90c, 0x0000ab99, 0x000013c9,
-	0x00000438, 0x00000418, 0x00002c41, 0x00002c11,
-	0x000104d9, 0x000104b1, 0x00000070, 0x00000050,
-	0x00010599, 0x00010572, 0x00000433, 0x00000413,
-	0x00001fa7, 0x02000045, 0x00001e1f, 0x00001e1e,
-	0x0000abb0, 0x000013e0, 0x0000046d, 0x0000046c,
-	0x00001e35, 0x00001e34, 0x00001e49, 0x00001e48,
-	0x0000a747, 0x0000a746, 0x00002ce3, 0x00002ce2,
-	0x00001fe0, 0x00001fe8, 0x00010432, 0x0001040a,
-	0x000000f4, 0x000000d4, 0x00002d1d, 0x000010bd,
-	0x00000377, 0x00000376, 0x00001ec3, 0x00001ec2,
-	0x00000146, 0x00000145, 0x00000527, 0x00000526,
-	0x00001f66, 0x00001f6e, 0x00001f13, 0x00001f1b,
-	0x00000067, 0x00000047, 0x00000561, 0x00000531,
-	0x0000ff4c, 0x0000ff2c, 0x0001043a, 0x00010412,
-	0x000003bc, 0x0000039c, 0x00016e62, 0x00016e42,
-	0x00000431, 0x00000411, 0x00001fe3, 0x030000c2,
-	0x000000e1, 0x000000c1, 0x00000209, 0x00000208,
-	0x0000046b, 0x0000046a, 0x00001fae, 0x02000115,
-	0x0000057b, 0x0000054b, 0x0000a66d, 0x0000a66c,
-	0x00002ccb, 0x00002cca, 0x00000263, 0x00000194,
-	0x0000a7b5, 0x0000a7b4, 0x000001d6, 0x000001d5,
-	0x00002d1b, 0x000010bb, 0x00002c3a, 0x00002c0a,
-	0x00001ed7, 0x00001ed6, 0x000003ae, 0x00000389,
-	0x0000050f, 0x0000050e, 0x00000564, 0x00000534,
-	0x00001f01, 0x00001f09, 0x0000a72f, 0x0000a72e,
-	0x0000017e, 0x0000017d, 0x000105a8, 0x00010581,
-	0x0001e936, 0x0001e914, 0x0000012f, 0x0000012e,
-	0x000010f7, 0x00001cb7, 0x00000471, 0x00000470,
-	0x000003be, 0x0000039e, 0x0000a7a9, 0x0000a7a8,
-	0x000118ca, 0x000118aa, 0x0000ab93, 0x000013c3,
-	0x000001fb, 0x000001fa, 0x000001d4, 0x000001d3,
-	0x00000142, 0x00000141, 0x00002cd7, 0x00002cd6,
-	0x00001f67, 0x00001f6f, 0x00001e8d, 0x00001e8c,
-	0x00000272, 0x0000019d, 0x000004db, 0x000004da,
-	0x000024e5, 0x000024cb, 0x00000223, 0x00000222,
-	0x000010d8, 0x00001c98, 0x0000051b, 0x0000051a,
-	0x00001fe1, 0x00001fe9, 0x00001e07, 0x00001e06,
-	0x000010d2, 0x00001c92, 0x00000283, 0x000001a9,
-	0x000105a0, 0x00010579, 0x00001e7b, 0x00001e7a,
-	0x0000a767, 0x0000a766, 0x000010f5, 0x00001cb5,
-	0x00002d21, 0x000010c1, 0x000010d0, 0x00001c90,
-	0x0000a73b, 0x0000a73a
+	0x0000012b, 0x0000012a, 0x00000271, 0x00002c6e,
+	0x0000a687, 0x0000a686, 0x000013fb, 0x000013f3,
+	0x0000050d, 0x0000050c, 0x00002cee, 0x00002ced,
+	0x00001fa7, 0x02000045, 0x00001e8b, 0x00001e8a,
+	0x00001f94, 0x02000024, 0x00002c44, 0x00002c14,
+	0x0000a691, 0x0000a690, 0x00001f62, 0x00001f6a,
+	0x000105b4, 0x0001058d, 0x00001e47, 0x00001e46,
+	0x0000abab, 0x000013db, 0x0000024f, 0x0000024e,
+	0x00001c81, 0x00000414, 0x0000a741, 0x0000a740,
+	0x0000ab82, 0x000013b2, 0x00000078, 0x00000058,
+	0x000010ed, 0x00001cad, 0x00010ce4, 0x00010ca4,
+	0x00000493, 0x00000492, 0x00000430, 0x00000410,
+	0x0000a72d, 0x0000a72c, 0x00000205, 0x00000204,
+	0x0000abb2, 0x000013e2, 0x000001dd, 0x0000018e,
+	0x000010f5, 0x00001cb5, 0x000104fa, 0x000104d2,
+	0x0000049b, 0x0000049a, 0x000024da, 0x000024c0,
+	0x00001e0b, 0x00001e0a, 0x00001fab, 0x0200010c,
+	0x00001e9a, 0x02000097, 0x00002178, 0x00002168,
+	0x0000a695, 0x0000a694, 0x00016e63, 0x00016e43,
+	0x00002cb9, 0x00002cb8, 0x00000185, 0x00000184,
+	0x00001e0d, 0x00001e0c, 0x00000142, 0x00000141,
+	0x00010d70, 0x00010d50, 0x0000aba2, 0x000013d2,
+	0x00001ec7, 0x00001ec6, 0x00001ecf, 0x00001ece,
+	0x000000eb, 0x000000cb, 0x0000019b, 0x0000a7dc,
+	0x00010d81, 0x00010d61, 0x00001ffc, 0x02000121,
+	0x0000056d, 0x0000053d, 0x00010cd1, 0x00010c91,
+	0x0001e92d, 0x0001e90b, 0x00000161, 0x00000160,
+	0x0001043c, 0x00010414, 0x00000269, 0x00000196,
+	0x0000a7db, 0x0000a7da, 0x0000a745, 0x0000a744,
+	0x00002c5f, 0x00002c2f, 0x0000ab83, 0x000013b3,
+	0x00000252, 0x00002c70, 0x00000242, 0x00000241,
+	0x00000573, 0x00000543, 0x0000a7d9, 0x0000a7d8,
+	0x00001f86, 0x02000012, 0x00001f02, 0x00001f0a,
+	0x0000014d, 0x0000014c, 0x000104f2, 0x000104ca,
+	0x0000a65b, 0x0000a65a, 0x000004bf, 0x000004be,
+	0x00001f23, 0x00001f2b, 0x0000aba1, 0x000013d1,
+	0x000001c9, 0x000001c7, 0x0000ab77, 0x000013a7,
+	0x000104e4, 0x000104bc, 0x00000473, 0x00000472,
+	0x00000390, 0x03000080, 0x00002cb7, 0x00002cb6,
+	0x00000209, 0x00000208, 0x00001ef1, 0x00001ef0,
+	0x0000217f, 0x0000216f, 0x00010cda, 0x00010c9a,
+	0x00001fe2, 0x030000be, 0x00001ef5, 0x00001ef4,
+	0x0000057a, 0x0000054a, 0x00010443, 0x0001041b,
+	0x000001a3, 0x000001a2, 0x0000a781, 0x0000a780,
+	0x000004e3, 0x000004e2, 0x0000a757, 0x0000a756,
+	0x00010ced, 0x00010cad, 0x00002ccb, 0x00002cca,
+	0x00001f32, 0x00001f3a, 0x0001059b, 0x00010574,
+	0x000004cf, 0x000004c0, 0x0000a74f, 0x0000a74e,
+	0x00001f11, 0x00001f19, 0x00000061, 0x00000041,
+	0x0000a64f, 0x0000a64e, 0x00000477, 0x00000476,
+	0x00010d7a, 0x00010d5a, 0x00002c68, 0x00002c67,
+	0x000004f7, 0x000004f6, 0x00002d05, 0x000010a5,
+	0x00000127, 0x00000126, 0x0001043a, 0x00010412,
+	0x000010f2, 0x00001cb2, 0x000003ed, 0x000003ec,
+	0x000104dd, 0x000104b5, 0x00001e71, 0x00001e70,
+	0x000000e1, 0x000000c1, 0x000003f5, 0x00000395,
+	0x000010d1, 0x00001c91, 0x0000013e, 0x0000013d,
+	0x0000a7a7, 0x0000a7a6, 0x0000ff52, 0x0000ff32,
+	0x000024e4, 0x000024ca, 0x0000051d, 0x0000051c,
+	0x00000283, 0x000001a9, 0x000010d9, 0x00001c99,
+	0x0000ff59, 0x0000ff39, 0x000003b0, 0x03000084,
+	0x00001efb, 0x00001efa, 0x000118c2, 0x000118a2,
+	0x0000ab72, 0x000013a2, 0x00001f35, 0x00001f3d,
+	0x0000028b, 0x000001b2, 0x0000a69b, 0x0000a69a,
+	0x000003cc, 0x0000038c, 0x00016e68, 0x00016e48,
+	0x000003f0, 0x0000039a, 0x0000016b, 0x0000016a,
+	0x00000272, 0x0000019d, 0x0000a661, 0x0000a660,
+	0x000001cc, 0x000001ca, 0x00000451, 0x00000401,
+	0x00001e07, 0x00001e06, 0x00001f37, 0x00001f3f,
+	0x0001044a, 0x00010422, 0x0001e930, 0x0001e90e,
+	0x000004fb, 0x000004fa, 0x000004d3, 0x000004d2,
+	0x00002c9f, 0x00002c9e, 0x00000111, 0x00000110,
+	0x00002c30, 0x00002c00, 0x00001fa6, 0x02000042,
+	0x000000f0, 0x000000d0, 0x000104e2, 0x000104ba,
+	0x00002d24, 0x000010c4, 0x00001ee7, 0x00001ee6,
+	0x0000020b, 0x0000020a, 0x00002c89, 0x00002c88,
+	0x000003c6, 0x000003a6, 0x0000a747, 0x0000a746,
+	0x0000a76b, 0x0000a76a, 0x000004f5, 0x000004f4,
+	0x0000ff5a, 0x0000ff3a, 0x0000ab75, 0x000013a5,
+	0x000003af, 0x0000038a, 0x00001efd, 0x00001efc,
+	0x00000101, 0x00000100, 0x0000a693, 0x0000a692,
+	0x00001f9a, 0x020000f1, 0x000010dd, 0x00001c9d,
+	0x00001f52, 0x0300009d, 0x000000df, 0x02000051,
+	0x00000503, 0x00000502, 0x00010d7b, 0x00010d5b,
+	0x0000fb01, 0x02000057, 0x000003c2, 0x000003a3,
+	0x0000016d, 0x0000016c, 0x00000263, 0x00000194,
+	0x0001044b, 0x00010423, 0x00000465, 0x00000464,
+	0x000003ad, 0x00000388, 0x00001fb4, 0x02000127,
+	0x0000abb1, 0x000013e1, 0x00001e25, 0x00001e24,
+	0x00000148, 0x00000147, 0x0001e93c, 0x0001e91a,
+	0x000000ee, 0x000000ce, 0x0000023f, 0x00002c7e,
+	0x0000abba, 0x000013ea, 0x00001f00, 0x00001f08,
+	0x00010d79, 0x00010d59, 0x000003cd, 0x0000038e,
+	0x0000a651, 0x0000a650, 0x0000ab84, 0x000013b4,
+	0x00002c58, 0x00002c28, 0x0000057b, 0x0000054b,
+	0x000010fa, 0x00001cba, 0x00010ce8, 0x00010ca8,
+	0x000004a1, 0x000004a0, 0x00002c95, 0x00002c94,
+	0x00000567, 0x00000537, 0x0000a657, 0x0000a656,
+	0x000000ed, 0x000000cd, 0x00001f8f, 0x020000e8,
+	0x000000e4, 0x000000c4, 0x00001f9e, 0x020000fd,
+	0x00001c86, 0x0000042a, 0x000118c8, 0x000118a8,
+	0x0000a68f, 0x0000a68e, 0x0000011b, 0x0000011a,
+	0x0000a77a, 0x0000a779, 0x0000015b, 0x0000015a,
+	0x000001f2, 0x000001f1, 0x00010ce5, 0x00010ca5,
+	0x00001e6b, 0x00001e6a, 0x00001f51, 0x00001f59,
+	0x00001f12, 0x00001f1a, 0x0000a66b, 0x0000a66a,
+	0x000104e9, 0x000104c1, 0x000024d4, 0x000024ba,
+	0x00000073, 0x00000053, 0x00001f95, 0x02000027,
+	0x00002c76, 0x00002c75, 0x0000a65d, 0x0000a65c,
+	0x0000026b, 0x00002c62, 0x00000455, 0x00000405,
+	0x00001ff6, 0x020000d0, 0x00001f70, 0x00001fba,
+	0x0001042a, 0x00010402, 0x000013f8, 0x000013f0,
+	0x000001e1, 0x000001e0, 0x00016e72, 0x00016e52,
+	0x00002d0a, 0x000010aa, 0x00001e01, 0x00001e00,
+	0x00000062, 0x00000042, 0x0000ab93, 0x000013c3,
+	0x00001fc7, 0x0300013a, 0x000004d1, 0x000004d0,
+	0x00000575, 0x00000545, 0x0000abbf, 0x000013ef,
+	0x000118de, 0x000118be, 0x000010d5, 0x00001c95,
+	0x00002d11, 0x000010b1, 0x0000047f, 0x0000047e,
+	0x0000217b, 0x0000216b, 0x000105b7, 0x00010590,
+	0x000118d0, 0x000118b0, 0x00001ead, 0x00001eac,
+	0x00001f87, 0x02000015, 0x00002cbf, 0x00002cbe,
+	0x0001043d, 0x00010415, 0x000000fd, 0x000000dd,
+	0x000004d7, 0x000004d6, 0x00001e65, 0x00001e64,
+	0x000118d8, 0x000118b8, 0x00002d02, 0x000010a2,
+	0x0000a66d, 0x0000a66c, 0x0000a763, 0x0000a762,
+	0x000004cc, 0x000004cb, 0x00001eed, 0x00001eec,
+	0x00000153, 0x00000152, 0x00001e7b, 0x00001e7a,
+	0x000104fb, 0x000104d3, 0x00002c5c, 0x00002c2c,
+	0x000004e7, 0x000004e6, 0x0000ab78, 0x000013a8,
+	0x00002d03, 0x000010a3, 0x00001e41, 0x00001e40,
+	0x0001e92c, 0x0001e90a, 0x0000a72f, 0x0000a72e,
+	0x000004b9, 0x000004b8, 0x000001fb, 0x000001fa,
+	0x00016e61, 0x00016e41, 0x000001d2, 0x000001d1,
+	0x0000ab7d, 0x000013ad, 0x000003b1, 0x00000391,
+	0x0001e93d, 0x0001e91b, 0x000104e7, 0x000104bf,
+	0x00001ec9, 0x00001ec8, 0x0000006e, 0x0000004e,
+	0x00001fa9, 0x02000106, 0x000118df, 0x000118bf,
+	0x000104f0, 0x000104c8, 0x00001c88, 0x0000a64a,
+	0x000105b9, 0x00010592, 0x00001e19, 0x00001e18,
+	0x00001ea9, 0x00001ea8, 0x000001bd, 0x000001bc,
+	0x0001e92e, 0x0001e90c, 0x0001e93f, 0x0001e91d,
+	0x0000046d, 0x0000046c, 0x000003ce, 0x0000038f,
+	0x00001ee9, 0x00001ee8, 0x00000183, 0x00000182,
+	0x0000ab95, 0x000013c5, 0x0000ff43, 0x0000ff23,
+	0x0000a647, 0x0000a646, 0x0000a767, 0x0000a766,
+	0x000104e3, 0x000104bb, 0x00002d09, 0x000010a9,
+	0x00001e83, 0x00001e82, 0x00001f85, 0x0200000f,
+	0x00002c91, 0x00002c90, 0x000004c6, 0x000004c5,
+	0x000013fd, 0x000013f5, 0x000118cd, 0x000118ad,
+	0x000003e5, 0x000003e4, 0x0000ab8f, 0x000013bf,
+	0x000003db, 0x000003da, 0x0000049d, 0x0000049c,
+	0x00001fa2, 0x02000036, 0x0000abbb, 0x000013eb,
+	0x00001e9b, 0x00001e60, 0x000010eb, 0x00001cab,
+	0x00010431, 0x00010409, 0x0000a655, 0x0000a654,
+	0x000001eb, 0x000001ea, 0x0000ff4c, 0x0000ff2c,
+	0x00001e51, 0x00001e50, 0x000024de, 0x000024c4,
+	0x000118cb, 0x000118ab, 0x00010440, 0x00010418,
+	0x000003b5, 0x00000395, 0x0000051f, 0x0000051e,
+	0x000024db, 0x000024c1, 0x000000e7, 0x000000c7,
+	0x000003f1, 0x000003a1, 0x0001e925, 0x0001e903,
+	0x00002c40, 0x00002c10, 0x0001044c, 0x00010424,
+	0x0000fb02, 0x0200005a, 0x00001fb0, 0x00001fb8,
+	0x0000fb13, 0x0200006e, 0x00001ea3, 0x00001ea2,
+	0x00002d0f, 0x000010af, 0x00010d7c, 0x00010d5c,
+	0x00000505, 0x00000504, 0x00001e5b, 0x00001e5a,
+	0x000118c3, 0x000118a3, 0x0000026f, 0x0000019c,
+	0x0000ab9f, 0x000013cf, 0x0000011f, 0x0000011e,
+	0x000004d5, 0x000004d4, 0x00000140, 0x0000013f,
+	0x00001f42, 0x00001f4a, 0x00001e4b, 0x00001e4a,
+	0x00000173, 0x00000172, 0x00010d74, 0x00010d54,
+	0x00000444, 0x00000424, 0x0000a7a5, 0x0000a7a4,
+	0x00001e21, 0x00001e20, 0x00001e3d, 0x00001e3c,
+	0x0001e93a, 0x0001e918, 0x00010cec, 0x00010cac,
+	0x00000495, 0x00000494, 0x0000a755, 0x0000a754,
+	0x00002c36, 0x00002c06, 0x00001fad, 0x02000112,
+	0x00000521, 0x00000520, 0x00001f73, 0x00001fc9,
+	0x000010f7, 0x00001cb7, 0x000003bd, 0x0000039d,
+	0x00002d04, 0x000010a4, 0x00002d08, 0x000010a8,
+	0x000000e3, 0x000000c3, 0x00001e09, 0x00001e08,
+	0x000000f1, 0x000000d1, 0x0000214e, 0x00002132,
+	0x00000525, 0x00000524, 0x00010435, 0x0001040d,
+	0x000003ba, 0x0000039a, 0x00000440, 0x00000420,
+	0x00001e7f, 0x00001e7e, 0x0000217c, 0x0000216c,
+	0x00002c38, 0x00002c08, 0x00010599, 0x00010572,
+	0x0000044b, 0x0000042b, 0x000004c8, 0x000004c7,
+	0x00001e93, 0x00001e92, 0x000003ae, 0x00000389,
+	0x000004a7, 0x000004a6, 0x0000a685, 0x0000a684,
+	0x00001e1b, 0x00001e1a, 0x000118db, 0x000118bb,
+	0x00001e4d, 0x00001e4c, 0x00001f43, 0x00001f4b,
+	0x000001e7, 0x000001e6, 0x00002d0e, 0x000010ae,
+	0x00000450, 0x00000400, 0x000004dd, 0x000004dc,
+	0x00001f90, 0x02000018, 0x000010f1, 0x00001cb1,
+	0x00010ce6, 0x00010ca6, 0x0000a735, 0x0000a734,
+	0x0000052d, 0x0000052c, 0x00016e70, 0x00016e50,
+	0x00000203, 0x00000202, 0x00002d13, 0x000010b3,
+	0x00010439, 0x00010411, 0x0000a64d, 0x0000a64c,
+	0x000000fb, 0x000000db, 0x00001e1f, 0x00001e1e,
+	0x000004ed, 0x000004ec, 0x0000abb6, 0x000013e6,
+	0x000001cb, 0x000001ca, 0x000024e6, 0x000024cc,
+	0x00002d01, 0x000010a1, 0x00001eb1, 0x00001eb0,
+	0x00000569, 0x00000539, 0x00002cbb, 0x00002cba,
+	0x0000fb03, 0x0300005d, 0x00000233, 0x00000232,
+	0x0000043a, 0x0000041a, 0x00010445, 0x0001041d,
+	0x0000057c, 0x0000054c, 0x00001ee5, 0x00001ee4,
+	0x0000ab8b, 0x000013bb, 0x00001ebd, 0x00001ebc,
+	0x000001a5, 0x000001a4, 0x000001ef, 0x000001ee,
+	0x000001f5, 0x000001f4, 0x00001e8f, 0x00001e8e,
+	0x0000ab98, 0x000013c8, 0x00002d00, 0x000010a0,
+	0x00000149, 0x0200007d, 0x00010d83, 0x00010d63,
+	0x00016e6e, 0x00016e4e, 0x00016e77, 0x00016e57,
+	0x000003e3, 0x000003e2, 0x00000070, 0x00000050,
+	0x00000155, 0x00000154, 0x0000a79f, 0x0000a79e,
+	0x0000217e, 0x0000216e, 0x0000ff47, 0x0000ff27,
+	0x000004df, 0x000004de, 0x00001f84, 0x0200000c,
+	0x00001e5d, 0x00001e5c, 0x00001e37, 0x00001e36,
+	0x000000e8, 0x000000c8, 0x00002173, 0x00002163,
+	0x0000a7d7, 0x0000a7d6, 0x00010429, 0x00010401,
+	0x00002cc3, 0x00002cc2, 0x00000207, 0x00000206,
+	0x0001e922, 0x0001e900, 0x00002170, 0x00002160,
+	0x0000a7a9, 0x0000a7a8, 0x00010cdd, 0x00010c9d,
+	0x00002d07, 0x000010a7, 0x00002d10, 0x000010b0,
+	0x00001e79, 0x00001e78, 0x00000377, 0x00000376,
+	0x00010447, 0x0001041f, 0x00016e67, 0x00016e47,
+	0x0000a791, 0x0000a790, 0x00001f04, 0x00001f0c,
+	0x00001e2d, 0x00001e2c, 0x000001ad, 0x000001ac,
+	0x000104f9, 0x000104d1, 0x0000045b, 0x0000040b,
+	0x00000109, 0x00000108, 0x00001f92, 0x0200001e,
+	0x00002c81, 0x00002c80, 0x0001e92b, 0x0001e909,
+	0x00010cdf, 0x00010c9f, 0x0001044f, 0x00010427,
+	0x0000a75d, 0x0000a75c, 0x00010cce, 0x00010c8e,
+	0x00001e33, 0x00001e32, 0x0000abad, 0x000013dd,
+	0x000001e9, 0x000001e8, 0x0000017c, 0x0000017b,
+	0x00010cee, 0x00010cae, 0x0000047d, 0x0000047c,
+	0x00002c3d, 0x00002c0d, 0x0000019e, 0x00000220,
+	0x00001fd3, 0x030000b3, 0x000003c5, 0x000003a5,
+	0x00010ce2, 0x00010ca2, 0x000010d8, 0x00001c98,
+	0x0001059e, 0x00010577, 0x0000056a, 0x0000053a,
+	0x0000ff56, 0x0000ff36, 0x0000a7bf, 0x0000a7be,
+	0x00001fd1, 0x00001fd9, 0x00000229, 0x00000228,
+	0x00001f01, 0x00001f09, 0x00001c80, 0x00000412,
+	0x0000fb05, 0x02000065, 0x00002c53, 0x00002c23,
+	0x00001f8c, 0x020000df, 0x0000ff58, 0x0000ff38,
+	0x0000037c, 0x000003fe, 0x00001fe5, 0x00001fec,
+	0x00001fe1, 0x00001fe9, 0x00002cad, 0x00002cac,
+	0x000010fe, 0x00001cbe, 0x00010448, 0x00010420,
+	0x000003ef, 0x000003ee, 0x000001ed, 0x000001ec,
+	0x000024e0, 0x000024c6, 0x00001e63, 0x00001e62,
+	0x00001f71, 0x00001fbb, 0x0000a79b, 0x0000a79a,
+	0x0000a649, 0x0000a648, 0x000003b2, 0x00000392,
+	0x00010ccd, 0x00010c8d, 0x000010dc, 0x00001c9c,
+	0x00001f54, 0x030000a1, 0x00001fa8, 0x02000103,
+	0x0000043c, 0x0000041c, 0x00001edb, 0x00001eda,
+	0x00010ce9, 0x00010ca9, 0x000104d9, 0x000104b1,
+	0x00002d15, 0x000010b5, 0x00000075, 0x00000055,
+	0x00002ce3, 0x00002ce2, 0x000001e3, 0x000001e2,
+	0x00016e7e, 0x00016e5e, 0x00000583, 0x00000553,
+	0x00000576, 0x00000546, 0x00001f15, 0x00001f1d,
+	0x000010d0, 0x00001c90, 0x00001f8e, 0x020000e5,
+	0x00002d1c, 0x000010bc, 0x00010cd9, 0x00010c99,
+	0x000104db, 0x000104b3, 0x000118da, 0x000118ba,
+	0x000000e5, 0x000000c5, 0x000105bc, 0x00010595,
+	0x000024e5, 0x000024cb, 0x00010cd2, 0x00010c92,
+	0x00001e7d, 0x00001e7c, 0x000118ce, 0x000118ae,
+	0x00002cdb, 0x00002cda, 0x00001f63, 0x00001f6b,
+	0x00010cd8, 0x00010c98, 0x00000457, 0x00000407,
+	0x000000fe, 0x000000de, 0x000003f2, 0x000003f9,
+	0x00001e61, 0x00001e60, 0x0000ab97, 0x000013c7,
+	0x0000006c, 0x0000004c, 0x0000a725, 0x0000a724,
+	0x00010ce7, 0x00010ca7, 0x00002c8f, 0x00002c8e,
+	0x0000ab9a, 0x000013ca, 0x00001ef7, 0x00001ef6,
+	0x00001ee1, 0x00001ee0, 0x00001faa, 0x02000109,
+	0x00010449, 0x00010421, 0x00000437, 0x00000417,
+	0x00001fc4, 0x0200012d, 0x00002d12, 0x000010b2,
+	0x00001e53, 0x00001e52, 0x0000024b, 0x0000024a,
+	0x00002c59, 0x00002c29, 0x00016e74, 0x00016e54,
+	0x0000a739, 0x0000a738, 0x00000447, 0x00000427,
+	0x00000105, 0x00000104, 0x0000ab73, 0x000013a3,
+	0x00010cde, 0x00010c9e, 0x00000433, 0x00000413,
+	0x0001044d, 0x00010425, 0x00001ec5, 0x00001ec4,
+	0x00001f9d, 0x020000fa, 0x0000aba3, 0x000013d3,
+	0x00001fb7, 0x03000136, 0x000004a5, 0x000004a4,
+	0x0000a749, 0x0000a748, 0x0000ab8c, 0x000013bc,
+	0x00001f7c, 0x00001ffa, 0x00002cd5, 0x00002cd4,
+	0x00001f89, 0x020000d6, 0x0001e92a, 0x0001e908,
+	0x000003b4, 0x00000394, 0x00000463, 0x00000462,
+	0x00010cf1, 0x00010cb1, 0x00002c9b, 0x00002c9a,
+	0x00000195, 0x000001f6, 0x00000439, 0x00000419,
+	0x0001e939, 0x0001e917, 0x0000a783, 0x0000a782,
+	0x00000570, 0x00000540, 0x000003e9, 0x000003e8,
+	0x0000010d, 0x0000010c, 0x00001e6d, 0x00001e6c,
+	0x00002174, 0x00002164, 0x0000a737, 0x0000a736,
+	0x00002c4a, 0x00002c1a, 0x0000ff50, 0x0000ff30,
+	0x00002c55, 0x00002c25, 0x00010432, 0x0001040a,
+	0x0000aba5, 0x000013d5, 0x0000a7c3, 0x0000a7c2,
+	0x000004bb, 0x000004ba, 0x0000021d, 0x0000021c,
+	0x00010cc7, 0x00010c87, 0x000000f9, 0x000000d9,
+	0x000010ef, 0x00001caf, 0x00000121, 0x00000120,
+	0x0000048d, 0x0000048c, 0x000105a0, 0x00010579,
+	0x00001f7a, 0x00001fea, 0x00000067, 0x00000047,
+	0x0001e929, 0x0001e907, 0x00001f96, 0x0200002a,
+	0x000105a6, 0x0001057f, 0x000105bb, 0x00010594,
+	0x00000436, 0x00000416, 0x00016e7b, 0x00016e5b,
+	0x00001eab, 0x00001eaa, 0x0000abac, 0x000013dc,
+	0x0000a7bd, 0x0000a7bc, 0x00002c6a, 0x00002c69,
+	0x0000043e, 0x0000041e, 0x00000445, 0x00000425,
+	0x000003c4, 0x000003a4, 0x00001f13, 0x00001f1b,
+	0x000010e4, 0x00001ca4, 0x00010cd0, 0x00010c90,
+	0x000004c4, 0x000004c3, 0x00010cc3, 0x00010c83,
+	0x00001fbe, 0x00000399, 0x00000446, 0x00000426,
+	0x00001e85, 0x00001e84, 0x000024e2, 0x000024c8,
+	0x0000ff44, 0x0000ff24, 0x0000a683, 0x0000a682,
+	0x00000571, 0x00000541, 0x00001f7b, 0x00001feb,
+	0x0000013c, 0x0000013b, 0x0000017f, 0x00000053,
+	0x000003c3, 0x000003a3, 0x0000ff4e, 0x0000ff2e,
+	0x00010cd6, 0x00010c96, 0x0000ab94, 0x000013c4,
+	0x00001e35, 0x00001e34, 0x0000ab79, 0x000013a9,
+	0x00002c47, 0x00002c17, 0x000001da, 0x000001d9,
+	0x00010cd5, 0x00010c95, 0x00001fa3, 0x02000039,
+	0x0000ff42, 0x0000ff22, 0x00000177, 0x00000176,
+	0x00000151, 0x00000150, 0x00010d82, 0x00010d62,
+	0x000003b7, 0x00000397, 0x0000a76d, 0x0000a76c,
+	0x0000ab86, 0x000013b6, 0x00002cdd, 0x00002cdc,
+	0x00000529, 0x00000528, 0x000010e9, 0x00001ca9,
+	0x0000a641, 0x0000a640, 0x00000469, 0x00000468,
+	0x00000572, 0x00000542, 0x00000264, 0x0000a7cb,
+	0x0000fb15, 0x02000074, 0x00000275, 0x0000019f,
+	0x00010d75, 0x00010d55, 0x0000ff4b, 0x0000ff2b,
+	0x00001e91, 0x00001e90, 0x0000a645, 0x0000a644,
+	0x000004ca, 0x000004c9, 0x00001e8d, 0x00001e8c,
+	0x00002c3e, 0x00002c0e, 0x00000443, 0x00000423,
+	0x0000a681, 0x0000a680, 0x00000448, 0x00000428,
+	0x00001d79, 0x0000a77d, 0x00001f05, 0x00001f0d,
+	0x0000013a, 0x00000139, 0x00000253, 0x00000181,
+	0x0000057e, 0x0000054e, 0x0000a76f, 0x0000a76e,
+	0x0000ab96, 0x000013c6, 0x00001e57, 0x00001e56,
+	0x0000ab81, 0x000013b1, 0x00010cc6, 0x00010c86,
+	0x00001c8a, 0x00001c89, 0x00002c66, 0x0000023e,
+	0x00000266, 0x0000a7aa, 0x00000066, 0x00000046,
+	0x00001f64, 0x00001f6c, 0x00010446, 0x0001041e,
+	0x000010f9, 0x00001cb9, 0x000010ea, 0x00001caa,
+	0x00000438, 0x00000418, 0x00001f26, 0x00001f2e,
+	0x0000abb8, 0x000013e8, 0x00001fc3, 0x0200004b,
+	0x0000028a, 0x000001b1, 0x0000217d, 0x0000216d,
+	0x00000471, 0x00000470, 0x0000a659, 0x0000a658,
+	0x00002c99, 0x00002c98, 0x00001ff3, 0x0200004e,
+	0x0000027d, 0x00002c64, 0x0001e932, 0x0001e910,
+	0x0000ff53, 0x0000ff33, 0x00000479, 0x00000478,
+	0x00000561, 0x00000531, 0x00000268, 0x00000197,
+	0x00002cbd, 0x00002cbc, 0x0000ab85, 0x000013b5,
+	0x0000ff48, 0x0000ff28, 0x00002cc9, 0x00002cc8,
+	0x0000056f, 0x0000053f, 0x000118c5, 0x000118a5,
+	0x000000b5, 0x0000039c, 0x00000163, 0x00000162,
+	0x00010433, 0x0001040b, 0x0001e92f, 0x0001e90d,
+	0x000024e3, 0x000024c9, 0x00010ce1, 0x00010ca1,
+	0x00000063, 0x00000043, 0x00001f57, 0x00001f5f,
+	0x00002c41, 0x00002c11, 0x00001e23, 0x00001e22,
+	0x000104da, 0x000104b2, 0x000010d4, 0x00001c94,
+	0x00000180, 0x00000243, 0x00001f76, 0x00001fda,
+	0x0000014f, 0x0000014e, 0x0000028c, 0x00000245,
+	0x00010cd4, 0x00010c94, 0x00010d78, 0x00010d58,
+	0x000105a4, 0x0001057d, 0x00002ccf, 0x00002cce,
+	0x000118c7, 0x000118a7, 0x0001e933, 0x0001e911,
+	0x00001ecb, 0x00001eca, 0x0000045d, 0x0000040d,
+	0x00016e69, 0x00016e49, 0x00001fc2, 0x0200012a,
+	0x000118c1, 0x000118a1, 0x0000ab7c, 0x000013ac,
+	0x00001faf, 0x02000118, 0x00002d22, 0x000010c2,
+	0x0000ab9c, 0x000013cc, 0x00016e79, 0x00016e59,
+	0x000118c0, 0x000118a0, 0x0000abb3, 0x000013e3,
+	0x00002c5b, 0x00002c2b, 0x000003bc, 0x0000039c,
+	0x0000045a, 0x0000040a, 0x0000a733, 0x0000a732,
+	0x000118dc, 0x000118bc, 0x0000ab89, 0x000013b9,
+	0x0000abbd, 0x000013ed, 0x00000259, 0x0000018f,
+	0x00016e60, 0x00016e40, 0x0000a753, 0x0000a752,
+	0x0000020d, 0x0000020c, 0x00000065, 0x00000045,
+	0x0000abaa, 0x000013da, 0x000001e5, 0x000001e4,
+	0x0001e934, 0x0001e912, 0x0000a793, 0x0000a792,
+	0x00001fc6, 0x020000ac, 0x00001e4f, 0x00001e4e,
+	0x00001f36, 0x00001f3e, 0x000001b9, 0x000001b8,
+	0x00002c57, 0x00002c27, 0x000000f5, 0x000000d5,
+	0x000004ad, 0x000004ac, 0x0000a643, 0x0000a642,
+	0x0000057d, 0x0000054d, 0x00000076, 0x00000056,
+	0x0001e924, 0x0001e902, 0x0001059a, 0x00010573,
+	0x0000ff4f, 0x0000ff2f, 0x00010cdc, 0x00010c9c,
+	0x00002d0c, 0x000010ac, 0x00010cd7, 0x00010c97,
+	0x00002cc5, 0x00002cc4, 0x0000037b, 0x000003fd,
+	0x000105b5, 0x0001058e, 0x000003c8, 0x000003a8,
+	0x00001ee3, 0x00001ee2, 0x000024d3, 0x000024b9,
+	0x00002ca5, 0x00002ca4, 0x0000abb9, 0x000013e9,
+	0x00000282, 0x0000a7c5, 0x00002176, 0x00002166,
+	0x0000a785, 0x0000a784, 0x00001f10, 0x00001f18,
+	0x00001e75, 0x00001e74, 0x00010cdb, 0x00010c9b,
+	0x00000261, 0x0000a7ac, 0x0000a663, 0x0000a662,
+	0x00010cc1, 0x00010c81, 0x000105a7, 0x00010580,
+	0x0000006d, 0x0000004d, 0x00001f56, 0x030000a5,
+	0x000104e8, 0x000104c0, 0x0001e935, 0x0001e913,
+	0x0000043d, 0x0000041d, 0x0000021f, 0x0000021e,
+	0x00002c35, 0x00002c05, 0x0000019a, 0x0000023d,
+	0x0001042c, 0x00010404, 0x00002ce1, 0x00002ce0,
+	0x00010cea, 0x00010caa, 0x0000a78c, 0x0000a78b,
+	0x000105af, 0x00010588, 0x00002c49, 0x00002c19,
+	0x00001e29, 0x00001e28, 0x000010f8, 0x00001cb8,
+	0x000000ea, 0x000000ca, 0x00002c4d, 0x00002c1d,
+	0x000104f3, 0x000104cb, 0x00000454, 0x00000404,
+	0x000118d9, 0x000118b9, 0x000001ce, 0x000001cd,
+	0x0000037d, 0x000003ff, 0x000000f6, 0x000000d6,
+	0x00002175, 0x00002165, 0x00001e59, 0x00001e58,
+	0x000118ca, 0x000118aa, 0x00002cc7, 0x00002cc6,
+	0x00001fa5, 0x0200003f, 0x000024e1, 0x000024c7,
+	0x000003cb, 0x000003ab, 0x00001fbc, 0x0200011b,
+	0x000010d6, 0x00001c96, 0x00002c85, 0x00002c84,
+	0x00001f53, 0x00001f5b, 0x0000024d, 0x0000024c,
+	0x00000171, 0x00000170, 0x0000a759, 0x0000a758,
+	0x00002c6c, 0x00002c6b, 0x0000ab9e, 0x000013ce,
+	0x00001fb2, 0x02000124, 0x00001e67, 0x00001e66,
+	0x0000a77c, 0x0000a77b, 0x0000a7cd, 0x0000a7cc,
+	0x000004e1, 0x000004e0, 0x00002c3f, 0x00002c0f,
+	0x00002d17, 0x000010b7, 0x00001e5f, 0x00001e5e,
+	0x00001f99, 0x020000ee, 0x0000044f, 0x0000042f,
+	0x00016e78, 0x00016e58, 0x00000585, 0x00000555,
+	0x0000044d, 0x0000042d, 0x00001eff, 0x00001efe,
+	0x00000133, 0x00000132, 0x0000025c, 0x0000a7ab,
+	0x0000a699, 0x0000a698, 0x0000056b, 0x0000053b,
+	0x00000458, 0x00000408, 0x0000a7ca, 0x0000a7c9,
+	0x000010ff, 0x00001cbf, 0x00000199, 0x00000198,
+	0x000104ee, 0x000104c6, 0x00001ed1, 0x00001ed0,
+	0x0000044a, 0x0000042a, 0x00010d7d, 0x00010d5d,
+	0x00002cd1, 0x00002cd0, 0x00001d8e, 0x0000a7c6,
+	0x0000029d, 0x0000a7b2, 0x00000225, 0x00000224,
+	0x0000047b, 0x0000047a, 0x000104e5, 0x000104bd,
+	0x000003b6, 0x00000396, 0x00001f55, 0x00001f5d,
+	0x000104ed, 0x000104c5, 0x000003e7, 0x000003e6,
+	0x0000a761, 0x0000a760, 0x000004ab, 0x000004aa,
+	0x00002c65, 0x0000023a, 0x000010d7, 0x00001c97,
+	0x00001e6f, 0x00001e6e, 0x00000213, 0x00000212,
+	0x0000a73b, 0x0000a73a, 0x0000a7c8, 0x0000a7c7,
+	0x000004eb, 0x000004ea, 0x00002d1f, 0x000010bf,
+	0x00000072, 0x00000052, 0x00001f33, 0x00001f3b,
+	0x000003d5, 0x000003a6, 0x00016e76, 0x00016e56,
+	0x0000a77f, 0x0000a77e, 0x000024e7, 0x000024cd,
+	0x00002c43, 0x00002c13, 0x000010e1, 0x00001ca1,
+	0x00010436, 0x0001040e, 0x0000048b, 0x0000048a,
+	0x000104df, 0x000104b7, 0x0000a74b, 0x0000a74a,
+	0x00000453, 0x00000403, 0x00000137, 0x00000136,
+	0x000001b6, 0x000001b5, 0x000104e6, 0x000104be,
+	0x0000052f, 0x0000052e, 0x00002c54, 0x00002c24,
+	0x000024d5, 0x000024bb, 0x00002cd7, 0x00002cd6,
+	0x00001f8b, 0x020000dc, 0x00000249, 0x00000248,
+	0x00002c51, 0x00002c21, 0x0000a7b7, 0x0000a7b6,
+	0x00002c97, 0x00002c96, 0x0000ab9d, 0x000013cd,
+	0x000118d1, 0x000118b1, 0x0000ab53, 0x0000a7b3,
+	0x000010f4, 0x00001cb4, 0x0000a74d, 0x0000a74c,
+	0x00010cef, 0x00010caf, 0x000104f1, 0x000104c9,
+	0x0000abae, 0x000013de, 0x0001042d, 0x00010405,
+	0x00001f65, 0x00001f6d, 0x00001ecd, 0x00001ecc,
+	0x0000044e, 0x0000042e, 0x00001fd2, 0x030000af,
+	0x000003c1, 0x000003a1, 0x00001e43, 0x00001e42,
+	0x0000aba7, 0x000013d7, 0x00002184, 0x00002183,
+	0x000004bd, 0x000004bc, 0x0000a73d, 0x0000a73c,
+	0x000004ef, 0x000004ee, 0x00001e17, 0x00001e16,
+	0x00000131, 0x00000049, 0x0001042f, 0x00010407,
+	0x0000ff54, 0x0000ff34, 0x000001f3, 0x000001f1,
+	0x00001f06, 0x00001f0e, 0x000105b3, 0x0001058c,
+	0x00001f20, 0x00001f28, 0x000010de, 0x00001c9e,
+	0x00010444, 0x0001041c, 0x00000565, 0x00000535,
+	0x00000497, 0x00000496, 0x00000523, 0x00000522,
+	0x00002cdf, 0x00002cde, 0x00001e98, 0x02000091,
+	0x0000a7bb, 0x0000a7ba, 0x00002c45, 0x00002c15,
+	0x0000a79d, 0x0000a79c, 0x00000579, 0x00000549,
+	0x00002c83, 0x00002c82, 0x0000fb16, 0x02000077,
+	0x00001ef9, 0x00001ef8, 0x00000217, 0x00000216,
+	0x00002d18, 0x000010b8, 0x0000017e, 0x0000017d,
+	0x00000441, 0x00000421, 0x0000057f, 0x0000054f,
+	0x00001e87, 0x00001e86, 0x00000103, 0x00000102,
+	0x00002c4e, 0x00002c1e, 0x0000a68b, 0x0000a68a,
+	0x0000abbc, 0x000013ec, 0x000003ac, 0x00000386,
+	0x00002c8b, 0x00002c8a, 0x00000159, 0x00000158,
+	0x0000015d, 0x0000015c, 0x0001e938, 0x0001e916,
+	0x00000584, 0x00000554, 0x000004b3, 0x000004b2,
+	0x0000007a, 0x0000005a, 0x0000ab7f, 0x000013af,
+	0x00010ce0, 0x00010ca0, 0x00000491, 0x00000490,
+	0x00001ed7, 0x00001ed6, 0x0001059d, 0x00010576,
+	0x00002cab, 0x00002caa, 0x00001e99, 0x02000094,
+	0x00001f77, 0x00001fdb, 0x00010d84, 0x00010d64,
+	0x000003b9, 0x00000399, 0x0000a799, 0x0000a798,
+	0x00001fe7, 0x030000cc, 0x0000ab99, 0x000013c9,
+	0x000001c5, 0x000001c4, 0x000104f4, 0x000104cc,
+	0x0000217a, 0x0000216a, 0x0000046f, 0x0000046e,
+	0x00000146, 0x00000145, 0x00002cb3, 0x00002cb2,
+	0x0000fb17, 0x0200007a, 0x0000ab8d, 0x000013bd,
+	0x0001e931, 0x0001e90f, 0x00002c3c, 0x00002c0c,
+	0x000104ef, 0x000104c7, 0x0000020f, 0x0000020e,
+	0x00002d06, 0x000010a6, 0x0001043b, 0x00010413,
+	0x000010db, 0x00001c9b, 0x00000475, 0x00000474,
+	0x000004b1, 0x000004b0, 0x000105a3, 0x0001057c,
+	0x00010598, 0x00010571, 0x0000ab8e, 0x000013be,
+	0x00001f41, 0x00001f49, 0x000104d8, 0x000104b0,
+	0x000010d2, 0x00001c92, 0x00001eb9, 0x00001eb8,
+	0x00001eb3, 0x00001eb2, 0x00016e6d, 0x00016e4d,
+	0x000010f3, 0x00001cb3, 0x00001fa1, 0x02000033,
+	0x00002cc1, 0x00002cc0, 0x0000006a, 0x0000004a,
+	0x0000051b, 0x0000051a, 0x000001dc, 0x000001db,
+	0x00001f78, 0x00001ff8, 0x00010437, 0x0001040f,
+	0x00010cc8, 0x00010c88, 0x000000e2, 0x000000c2,
+	0x0000a7d1, 0x0000a7d0, 0x00000434, 0x00000414,
+	0x00001e27, 0x00001e26, 0x00016e66, 0x00016e46,
+	0x000010e2, 0x00001ca2, 0x000003c9, 0x000003a9,
+	0x00010cca, 0x00010c8a, 0x000004fd, 0x000004fc,
+	0x0000056c, 0x0000053c, 0x000118c6, 0x000118a6,
+	0x00000250, 0x00002c6f, 0x00002c48, 0x00002c18,
+	0x0000ff55, 0x0000ff35, 0x00001f9f, 0x02000100,
+	0x00016e6f, 0x00016e4f, 0x0000a729, 0x0000a728,
+	0x00001e31, 0x00001e30, 0x0001e942, 0x0001e920,
+	0x00000287, 0x0000a7b1, 0x000104eb, 0x000104c3,
+	0x00001c83, 0x00000421, 0x000104dc, 0x000104b4,
+	0x00000527, 0x00000526, 0x00000165, 0x00000164,
+	0x0000011d, 0x0000011c, 0x00016e6c, 0x00016e4c,
+	0x000001fd, 0x000001fc, 0x000105aa, 0x00010583,
+	0x00016e75, 0x00016e55, 0x0000014b, 0x0000014a,
+	0x00000578, 0x00000548, 0x00010d77, 0x00010d57,
+	0x00000566, 0x00000536, 0x000003e1, 0x000003e0,
+	0x00002c9d, 0x00002c9c, 0x000004f1, 0x000004f0,
+	0x0000ab76, 0x000013a6, 0x00010d73, 0x00010d53,
+	0x00010cf0, 0x00010cb0, 0x000105ac, 0x00010585,
+	0x000105a5, 0x0001057e, 0x000004af, 0x000004ae,
+	0x00001e13, 0x00001e12, 0x000010d3, 0x00001c93,
+	0x00010cc4, 0x00010c84, 0x000013fa, 0x000013f2,
+	0x0000050b, 0x0000050a, 0x000003bf, 0x0000039f,
+	0x00002ca1, 0x00002ca0, 0x000010ee, 0x00001cae,
+	0x00002c42, 0x00002c12, 0x000024e9, 0x000024cf,
+	0x00016e6a, 0x00016e4a, 0x00001fd6, 0x020000b7,
+	0x0000aba4, 0x000013d4, 0x00002c87, 0x00002c86,
+	0x00001f7d, 0x00001ffb, 0x00000563, 0x00000533,
+	0x000001f0, 0x02000088, 0x00001f44, 0x00001f4c,
+	0x00001fa4, 0x0200003c, 0x00001f22, 0x00001f2a,
+	0x0001e93e, 0x0001e91c, 0x00000211, 0x00000210,
+	0x0000a653, 0x0000a652, 0x00000519, 0x00000518,
+	0x000104f5, 0x000104cd, 0x0000006b, 0x0000004b,
+	0x0000ab80, 0x000013b0, 0x00001ef3, 0x00001ef2,
+	0x000010e8, 0x00001ca8, 0x000105a9, 0x00010582,
+	0x0001059f, 0x00010578, 0x00002d1e, 0x000010be,
+	0x0000010f, 0x0000010e, 0x00000265, 0x0000a78d,
+	0x000000fc, 0x000000dc, 0x000000ff, 0x00000178,
+	0x0001e937, 0x0001e915, 0x000105a1, 0x0001057a,
+	0x000004ce, 0x000004cd, 0x000001ff, 0x000001fe,
+	0x0001e926, 0x0001e904, 0x0000ab87, 0x000013b7,
+	0x00001fd7, 0x030000ba, 0x00010ccb, 0x00010c8b,
+	0x0000ab90, 0x000013c0, 0x00001f21, 0x00001f29,
+	0x00001e96, 0x0200008b, 0x00001f8a, 0x020000d9,
+	0x0000ff41, 0x0000ff21, 0x0000a697, 0x0000a696,
+	0x0000a7b5, 0x0000a7b4, 0x00001f83, 0x02000009,
+	0x00001e2f, 0x00001e2e, 0x00001f34, 0x00001f3c,
+	0x00010d72, 0x00010d52, 0x0000050f, 0x0000050e,
+	0x0000a787, 0x0000a786, 0x000105b8, 0x00010591,
+	0x000118dd, 0x000118bd, 0x0000ab92, 0x000013c2,
+	0x00001f14, 0x00001f1c, 0x0000a665, 0x0000a664,
+	0x00001ebb, 0x00001eba, 0x00002c93, 0x00002c92,
+	0x00001eef, 0x00001eee, 0x00001f45, 0x00001f4d,
+	0x0001e923, 0x0001e901, 0x0000a64b, 0x0000a64a,
+	0x000105ab, 0x00010584, 0x0000022b, 0x0000022a,
+	0x000104e0, 0x000104b8, 0x00002d1d, 0x000010bd,
+	0x00000077, 0x00000057, 0x0000abb4, 0x000013e4,
+	0x00001c84, 0x00000422, 0x00000586, 0x00000556,
+	0x00016e7d, 0x00016e5d, 0x00001f24, 0x00001f2c,
+	0x00001e11, 0x00001e10, 0x0000ab7e, 0x000013ae,
+	0x00001f91, 0x0200001b, 0x00001fe6, 0x020000c9,
+	0x00002c56, 0x00002c26, 0x000003f8, 0x000003f7,
+	0x0000017a, 0x00000179, 0x0000ab74, 0x000013a4,
+	0x00001fb1, 0x00001fb9, 0x0000015f, 0x0000015e,
+	0x00002177, 0x00002167, 0x0000a794, 0x0000a7c4,
+	0x000004f9, 0x000004f8, 0x00002cb1, 0x00002cb0,
+	0x00000068, 0x00000048, 0x00000280, 0x000001a6,
+	0x00000509, 0x00000508, 0x000000f4, 0x000000d4,
+	0x00000517, 0x00000516, 0x00000188, 0x00000187,
+	0x000118d4, 0x000118b4, 0x0000a7a3, 0x0000a7a2,
+	0x00000113, 0x00000112, 0x0000a75f, 0x0000a75e,
+	0x00000513, 0x00000512, 0x00000071, 0x00000051,
+	0x00000175, 0x00000174, 0x00001e69, 0x00001e68,
+	0x000003d6, 0x000003a0, 0x000000e6, 0x000000c6,
+	0x000010e0, 0x00001ca0, 0x00002c73, 0x00002c72,
+	0x00002d19, 0x000010b9, 0x00010428, 0x00010400,
+	0x0000ab9b, 0x000013cb, 0x00000192, 0x00000191,
+	0x0000a7a1, 0x0000a7a0, 0x00000587, 0x0200006b,
+	0x0000ff4d, 0x0000ff2d, 0x00001eb7, 0x00001eb6,
+	0x0000ab71, 0x000013a1, 0x000105ad, 0x00010586,
+	0x0000048f, 0x0000048e, 0x00000582, 0x00000552,
+	0x000024d6, 0x000024bc, 0x0000026c, 0x0000a7ad,
+	0x00002cf3, 0x00002cf2, 0x00001e95, 0x00001e94,
+	0x00002d20, 0x000010c0, 0x0001e941, 0x0001e91f,
+	0x000010da, 0x00001c9a, 0x000118d2, 0x000118b2,
+	0x00001ea5, 0x00001ea4, 0x000001a1, 0x000001a0,
+	0x00000201, 0x00000200, 0x00002c32, 0x00002c02,
+	0x00000461, 0x00000460, 0x0000fb00, 0x02000054,
+	0x00001e55, 0x00001e54, 0x00001f74, 0x00001fca,
+	0x00000260, 0x00000193, 0x00000345, 0x00000399,
+	0x000013f9, 0x000013f1, 0x00002cec, 0x00002ceb,
+	0x0000fb06, 0x02000068, 0x0000aba0, 0x000013d0,
+	0x000104ea, 0x000104c2, 0x00002c8d, 0x00002c8c,
+	0x00001eb5, 0x00001eb4, 0x0000a689, 0x0000a688,
+	0x000001c8, 0x000001c7, 0x00002d1a, 0x000010ba,
+	0x00010430, 0x00010408, 0x00000227, 0x00000226,
+	0x000003d7, 0x000003cf, 0x00016e7a, 0x00016e5a,
+	0x00010cc5, 0x00010c85, 0x00001f80, 0x02000000,
+	0x000003fb, 0x000003fa, 0x000010f0, 0x00001cb0,
+	0x00010438, 0x00010410, 0x00001fcc, 0x0200011e,
+	0x00001c87, 0x00000462, 0x0000018c, 0x0000018b,
+	0x00001f9c, 0x020000f7, 0x0001e927, 0x0001e905,
+	0x0001044e, 0x00010426, 0x0000043b, 0x0000041b,
+	0x00000580, 0x00000550, 0x000105b0, 0x00010589,
+	0x000024d7, 0x000024bd, 0x00002cd9, 0x00002cd8,
+	0x00001f8d, 0x020000e2, 0x00010442, 0x0001041a,
+	0x00000107, 0x00000106, 0x0000a7c1, 0x0000a7c0,
+	0x0000abbe, 0x000013ee, 0x00002ca9, 0x00002ca8,
+	0x0000012f, 0x0000012e, 0x0000ab91, 0x000013c1,
+	0x00002c39, 0x00002c09, 0x0000ff51, 0x0000ff31,
+	0x00001ed5, 0x00001ed4, 0x00002c61, 0x00002c60,
+	0x00010cd3, 0x00010c93, 0x000003c0, 0x000003a0,
+	0x00001f67, 0x00001f6f, 0x0001043f, 0x00010417,
+	0x00001ff2, 0x02000130, 0x000000ec, 0x000000cc,
+	0x00001ff7, 0x0300013e, 0x00001e45, 0x00001e44,
+	0x0000aba9, 0x000013d9, 0x000003df, 0x000003de,
+	0x00016e7c, 0x00016e5c, 0x0000ff46, 0x0000ff26,
+	0x00001e05, 0x00001e04, 0x00001e2b, 0x00001e2a,
+	0x0000ab7b, 0x000013ab, 0x00000254, 0x00000186,
+	0x00016e62, 0x00016e42, 0x000004db, 0x000004da,
+	0x0000052b, 0x0000052a, 0x00000215, 0x00000214,
+	0x000001c6, 0x000001c4, 0x00001f88, 0x020000d3,
+	0x000024dc, 0x000024c2, 0x000003bb, 0x0000039b,
+	0x00000499, 0x00000498, 0x000024df, 0x000024c5,
+	0x00001e0f, 0x00001e0e, 0x00001f25, 0x00001f2d,
+	0x00002c50, 0x00002c20, 0x00002c4f, 0x00002c1f,
+	0x0000046b, 0x0000046a, 0x000001d6, 0x000001d5,
+	0x00001ec1, 0x00001ec0, 0x000118d5, 0x000118b5,
+	0x0000010b, 0x0000010a, 0x0000016f, 0x0000016e,
+	0x00010d7e, 0x00010d5e, 0x0000045c, 0x0000040c,
+	0x000013fc, 0x000013f4, 0x00001c85, 0x00000422,
+	0x00001e89, 0x00001e88, 0x00001f97, 0x0200002d,
+	0x0001042b, 0x00010403, 0x000000f8, 0x000000d8,
+	0x00000564, 0x00000534, 0x000118c4, 0x000118a4,
+	0x00002ccd, 0x00002ccc, 0x000105b6, 0x0001058f,
+	0x00000251, 0x00002c6d, 0x00002d21, 0x000010c1,
+	0x000004d9, 0x000004d8, 0x00001f82, 0x02000006,
+	0x00001e3f, 0x00001e3e, 0x00000135, 0x00000134,
+	0x00002c34, 0x00002c04, 0x0000a769, 0x0000a768,
+	0x000000fa, 0x000000da, 0x0000ab88, 0x000013b8,
+	0x0000021b, 0x0000021a, 0x00002d2d, 0x000010cd,
+	0x00001f81, 0x02000003, 0x000010df, 0x00001c9f,
+	0x00000240, 0x00002c7f, 0x00002c5e, 0x00002c2e,
+	0x00000431, 0x00000411, 0x000000ef, 0x000000cf,
+	0x00002d0b, 0x000010ab, 0x00000288, 0x000001ae,
+	0x00000256, 0x00000189, 0x00016e64, 0x00016e44,
+	0x000001d8, 0x000001d7, 0x00002cb5, 0x00002cb4,
+	0x0000012d, 0x0000012c, 0x00000257, 0x0000018a,
+	0x00001e97, 0x0200008e, 0x0001e943, 0x0001e921,
+	0x000104e1, 0x000104b9, 0x000105ae, 0x00010587,
+	0x00016e65, 0x00016e45, 0x00002ca7, 0x00002ca6,
+	0x0000abaf, 0x000013df, 0x000004a3, 0x000004a2,
+	0x000000f2, 0x000000d2, 0x00001fa0, 0x02000030,
+	0x00001d7d, 0x00002c63, 0x00000574, 0x00000544,
+	0x00000169, 0x00000168, 0x00016e6b, 0x00016e4b,
+	0x000010ec, 0x00001cac, 0x00010cc9, 0x00010c89,
+	0x0000026a, 0x0000a7ae, 0x00001e77, 0x00001e76,
+	0x000001df, 0x000001de, 0x00000117, 0x00000116,
+	0x000024d8, 0x000024be, 0x00000577, 0x00000547,
+	0x0000049f, 0x0000049e, 0x000001b0, 0x000001af,
+	0x00000115, 0x00000114, 0x00001f9b, 0x020000f4,
+	0x00002c52, 0x00002c22, 0x000003b8, 0x00000398,
+	0x00002c5a, 0x00002c2a, 0x00010ccf, 0x00010c8f,
+	0x000000e9, 0x000000c9, 0x00001e39, 0x00001e38,
+	0x0000ab70, 0x000013a0, 0x00001ed3, 0x00001ed2,
+	0x00002d25, 0x000010c5, 0x00001e3b, 0x00001e3a,
+	0x00002ca3, 0x00002ca2, 0x00002d27, 0x000010c7,
+	0x000000f3, 0x000000d3, 0x00000373, 0x00000372,
+	0x0000ff57, 0x0000ff37, 0x00000449, 0x00000429,
+	0x00010597, 0x00010570, 0x0000a68d, 0x0000a68c,
+	0x0000abb7, 0x000013e7, 0x00001f60, 0x00001f68,
+	0x00000289, 0x00000244, 0x000004a9, 0x000004a8,
+	0x000003c7, 0x000003a7, 0x00001e1d, 0x00001e1c,
+	0x00001ea1, 0x00001ea0, 0x00000167, 0x00000166,
+	0x0000025b, 0x00000190, 0x000004e9, 0x000004e8,
+	0x0000a751, 0x0000a750, 0x00010cf2, 0x00010cb2,
+	0x0000006f, 0x0000004f, 0x0000aba8, 0x000013d8,
+	0x000104ec, 0x000104c4, 0x00000125, 0x00000124,
+	0x0000a797, 0x0000a796, 0x0000043f, 0x0000041f,
+	0x00000511, 0x00000510, 0x00002d0d, 0x000010ad,
+	0x0001043e, 0x00010416, 0x0000aba6, 0x000013d6,
+	0x000003be, 0x0000039e, 0x000004f3, 0x000004f2,
+	0x00001e73, 0x00001e72, 0x00002cd3, 0x00002cd2,
+	0x00001fd0, 0x00001fd8, 0x00001edf, 0x00001ede,
+	0x000118d3, 0x000118b3, 0x000024d2, 0x000024b8,
+	0x0000ff45, 0x0000ff25, 0x00002d14, 0x000010b4,
+	0x00000064, 0x00000044, 0x000010e7, 0x00001ca7,
+	0x00001fb3, 0x02000048, 0x00000467, 0x00000466,
+	0x0000ab8a, 0x000013ba, 0x00001ff4, 0x02000133,
+	0x000118cc, 0x000118ac, 0x00001e81, 0x00001e80,
+	0x000001d0, 0x000001cf, 0x000001d4, 0x000001d3,
+	0x00016e71, 0x00016e51, 0x00000432, 0x00000412,
+	0x000003ca, 0x000003aa, 0x00010ceb, 0x00010cab,
+	0x00001f40, 0x00001f48, 0x0000023c, 0x0000023b,
+	0x0000a669, 0x0000a668, 0x00002c3a, 0x00002c0a,
+	0x000105b1, 0x0001058a, 0x00000562, 0x00000532,
+	0x00001f30, 0x00001f38, 0x00010434, 0x0001040c,
+	0x000003d1, 0x00000398, 0x0000a743, 0x0000a742,
+	0x0000a7f6, 0x0000a7f5, 0x0000a72b, 0x0000a72a,
+	0x000000e0, 0x000000c0, 0x00001f07, 0x00001f0f,
+	0x0001059c, 0x00010575, 0x00010cc2, 0x00010c82,
+	0x0000a65f, 0x0000a65e, 0x00000581, 0x00000551,
+	0x00001eeb, 0x00001eea, 0x00000069, 0x00000049,
+	0x0001e928, 0x0001e906, 0x00001c82, 0x0000041e,
+	0x00010d71, 0x00010d51, 0x0000a765, 0x0000a764,
+	0x000024d1, 0x000024b7, 0x000118d7, 0x000118b7,
+	0x00010d7f, 0x00010d5f, 0x000003f3, 0x0000037f,
+	0x00000119, 0x00000118, 0x00002171, 0x00002161,
+	0x00001fe0, 0x00001fe8, 0x00001f98, 0x020000eb,
+	0x00002caf, 0x00002cae, 0x000001a8, 0x000001a7,
+	0x000024e8, 0x000024ce, 0x0001e940, 0x0001e91e,
+	0x0000022d, 0x0000022c, 0x00001fac, 0x0200010f,
+	0x00001fae, 0x02000115, 0x00001f66, 0x00001f6e,
+	0x00002c4c, 0x00002c1c, 0x0000a667, 0x0000a666,
+	0x0000a75b, 0x0000a75a, 0x0000056e, 0x0000053e,
+	0x00000231, 0x00000230, 0x000001f9, 0x000001f8,
+	0x00000442, 0x00000422, 0x00000247, 0x00000246,
+	0x00002c37, 0x00002c07, 0x000004e5, 0x000004e4,
+	0x00002c33, 0x00002c03, 0x00000129, 0x00000128,
+	0x00000079, 0x00000059, 0x00001f79, 0x00001ff9,
+	0x00001edd, 0x00001edc, 0x00002172, 0x00002162,
+	0x00010ce3, 0x00010ca3, 0x0000abb0, 0x000013e0,
+	0x00002c31, 0x00002c01, 0x000010fd, 0x00001cbd,
+	0x00001fe3, 0x030000c2, 0x00000481, 0x00000480,
+	0x0000ff4a, 0x0000ff2a, 0x00010d76, 0x00010d56,
+	0x00002c5d, 0x00002c2d, 0x000010e6, 0x00001ca6,
+	0x00001f93, 0x02000021, 0x000004b5, 0x000004b4,
+	0x00002179, 0x00002169, 0x00001fe4, 0x020000c6,
+	0x00001fb6, 0x020000a9, 0x00016e7f, 0x00016e5f,
+	0x00000144, 0x00000143, 0x00000223, 0x00000222,
+	0x00000501, 0x00000500, 0x0000045f, 0x0000040f,
+	0x000104f7, 0x000104cf, 0x00001ed9, 0x00001ed8,
+	0x000118d6, 0x000118b6, 0x000118c9, 0x000118a9,
+	0x00002d23, 0x000010c3, 0x0000044c, 0x0000042c,
+	0x00000123, 0x00000122, 0x0000022f, 0x0000022e,
+	0x0000029e, 0x0000a7b0, 0x00001f27, 0x00001f2f,
+	0x00002c4b, 0x00002c1b, 0x00002c46, 0x00002c16,
+	0x0000ff49, 0x0000ff29, 0x000104de, 0x000104b6,
+	0x00002d1b, 0x000010bb, 0x0001042e, 0x00010406,
+	0x00001f31, 0x00001f39, 0x000003dd, 0x000003dc,
+	0x000004b7, 0x000004b6, 0x0000fb04, 0x03000061,
+	0x0000045e, 0x0000040e, 0x00001e15, 0x00001e14,
+	0x000010e3, 0x00001ca3, 0x00001e03, 0x00001e02,
+	0x000001bf, 0x000001f7, 0x00000435, 0x00000415,
+	0x0000ab7a, 0x000013aa, 0x00000456, 0x00000406,
+	0x00010d85, 0x00010d65, 0x00001f03, 0x00001f0b,
+	0x000104f8, 0x000104d0, 0x00000507, 0x00000506,
+	0x000105a8, 0x00010581, 0x000024dd, 0x000024c3,
+	0x00001ea7, 0x00001ea6, 0x00001f75, 0x00001fcb,
+	0x00010441, 0x00010419, 0x00000371, 0x00000370,
+	0x00001f50, 0x0200009a, 0x000004c2, 0x000004c1,
+	0x000003eb, 0x000003ea, 0x000118cf, 0x000118af,
+	0x00000292, 0x000001b7, 0x000003d0, 0x00000392,
+	0x00000219, 0x00000218, 0x00000452, 0x00000402,
+	0x00002c3b, 0x00002c0b, 0x00000157, 0x00000156,
+	0x00000074, 0x00000054, 0x00001f61, 0x00001f69,
+	0x0000fb14, 0x02000071, 0x00016e73, 0x00016e53,
+	0x000001b4, 0x000001b3, 0x000004ff, 0x000004fe,
+	0x00001e49, 0x00001e48, 0x0001e936, 0x0001e914,
+	0x000003d9, 0x000003d8, 0x000104f6, 0x000104ce,
+	0x0000a73f, 0x0000a73e, 0x000024d0, 0x000024b6,
+	0x00001ebf, 0x00001ebe, 0x000010e5, 0x00001ca5,
+	0x00010cc0, 0x00010c80, 0x00000459, 0x00000409,
+	0x00010ccc, 0x00010c8c, 0x0000a727, 0x0000a726,
+	0x00000568, 0x00000538, 0x0000abb5, 0x000013e5,
+	0x00002d16, 0x000010b6, 0x00010d80, 0x00010d60,
+	0x000003b3, 0x00000393, 0x00000515, 0x00000514,
+	0x000024d9, 0x000024bf, 0x00001eaf, 0x00001eae,
+	0x00001f72, 0x00001fc8, 0x000010f6, 0x00001cb6,
+	0x0001e93b, 0x0001e919, 0x0000a723, 0x0000a722,
+	0x0000a7b9, 0x0000a7b8, 0x00001ec3, 0x00001ec2
 };
 
-static const unsigned _uccase_lower_g_size = 258;
+static const unsigned _uccase_lower_g_size = 274;
 static const short _uccase_lower_g[] = {
-	    1,  1074,   114,  2233,    64,  1054,     1,  1022,
-	   41,  1257,   256,  1843,  1229, 17154,   154,  1733,
-	 1037,  1906,  2287,   279,   319,  2390,  2258,  5395,
-	 1050,   489,  6496,  2341,  3322,  1513,    18,  1330,
-	  751, -1061,   963,  1054,    33,  2487,     1,  -865,
-	  695, 20244,  2120,  3167,     3,  2106,    26,   380,
-	 3255,  2071,   246,  2402,   808, 10428,  2320,  1271,
-	 1827,  2002,  7523,  1713,     1,  2460,    23,  2205,
-	  301,  1003,     1,  5182,   176,  1139,  2242,  1497,
-	   38,   732,    24,  1799,   294,  1560,  2294, 13683,
-	 1156,  2358,     5,   532,  1308,  8910,   217,  1238,
-	 2073,  1438,   108,  1672,  1093,  3062,   914,   615,
-	    1,  2470,    48,  -151,  1379,  1109,     1,   176,
-	   31,  1427,   890,  2260,  2004,   975,    20,  2108,
-	  144,   131,  2443,  2439,   299,  9321,  3911,  1893,
-	 1110,  1834,  1171,  2293,  5454,  1176,    32,  2415,
-	   29,  2084,   980,  1075,     4,  2404,     1,  -433,
-	   68,  2913,    16,  3250,    56,  1576,     3,   617,
-	 2284,   411,     1,  1071,   264, 26677,  1394,  2373,
-	 3840,  1062,  2177,  1049,     1,  6288,     1,  2387,
-	  262,   808,     1,  2196,  1087,  2236,    89,  1263,
-	    1,   580,   750,   951,    32,  1443,  2052,   924,
-	 1124,  1709,   548,  7061,  6158,  5585,     3,  1036,
-	 1033,  1879,    68,  2367,  1756,  2224,  1952,  1030,
-	    1,  2339,   865, 32767,   529,   396,     1,   686,
-	   13, -1301,   231,  1561,  1080, 22302,    57,  2443,
-	   33,  1035,  3305,   917,   210,  1155,  2263,  5433,
-	 2091,  2168, 15045,  1314,  2076,  1111,   103,  2069,
-	   89,   730,   141,    27,     1,  4086,    16,   846,
-	   65,  6152,   366,   403,    22,  2058,    40,  1577,
-	 2284,  2662,     1,  2205,   553,  1103, 14651,  2185,
-	   11,  1726,  2086,  1109,    66, 13927,  1726,  2108,
-	  198,    28
+	   19,  -339,  8836,   631,  9135,     8,    27, -1063,
+	   10,  3627,   876,    27,    47, 16534,    60,   888,
+	   17,    64,     2,     5,     9,  1237,    18,  2342,
+	  111,    17,   359,   110,    69,  2640,    78,   354,
+	  228,  4917,    61,   260,     3,  2614,     9,   353,
+	   37,    68,  1061,  3015,    21,  4002,   962,  1724,
+	  446,   776,    17,  8978,   421,   336,   506,  8550,
+	  148,  -474,  3259,   933,  1171,   413,   126, -1086,
+	    2,  3008,   295,   110,    16, -1061,    67,   598,
+	  126,  3575,    79,    98,   103,   693,    32,   749,
+	    3,  2501,   260,  1003,    15,  4463,   282,   349,
+	   16,    40,     6,   935,   546,   726,     2,   353,
+	   94,   928,   780,  7113,    39,  3599,  6035,   315,
+	  186,  4306,    16,  9259,   100,    82,  1069,   537,
+	   72,  -686, 12102,  8064,   216,    95,  1761, 32767,
+	    8,  3436,   116,  1035,    14,  5405,    40,  1012,
+	   22,   135,    22,  1252,   589,   812,     8,  1721,
+	   10,   761,    84,   103,    36,   655,   600,  3517,
+	   11,   475,     1,   205,    17,  4384,    20,  5705,
+	  198,   741,   154,  8691,    28,   247,   739,   144,
+	  343,   703,    16, 32767,   809,   773,   806, 15951,
+	  270,   443,   360,  4365,  2648,   154,   109,  -191,
+	   12, 11910,    43,   849,     2,  1876,    65,   460,
+	   19,   585,     1,   684,   391,   463,   203,   782,
+	  102,  2630,   679,  1610,    35,  5529,    84,  3992,
+	    1,   157,     8,   389,  1295,  1272,   153,   406,
+	  133,  1074,    59,  9484,     2,   264,  7316,   276,
+	  252,   520,    29,  -220,   113, 15121,   525,  2091,
+	  283,  6976,     1, 13412,   647,    51,   285,  2206,
+	    3,   678,    17,   948,   114,  1233,     1,    38,
+	   19,  1583,    52,   803,   770,  1329,   380,  8813,
+	   66,   133,   256,  6495,    18,  7784,    53,  2867,
+	    4,   680,    34,   258,  1488,  1040,    19,  3566,
+	  844, 12080,   391,  7012,     1,  2670,  3227,   146,
+	  362,  1934
 };
 
-static const unsigned _uccase_lower_table_size = 1433;
+static const unsigned _uccase_lower_table_size = 1460;
 static const unsigned _uccase_lower_table[] = {
-	0x00001f6f, 0x00001f67, 0x00000524, 0x00000525,
-	0x0000ff2c, 0x0000ff4c, 0x000104bd, 0x000104e5,
-	0x000003da, 0x000003db, 0x0001e90d, 0x0001e92f,
-	0x0000a73e, 0x0000a73f, 0x000104c9, 0x000104f1,
-	0x00002c8c, 0x00002c8d, 0x000000c7, 0x000000e7,
-	0x00002c11, 0x00002c41, 0x0000a7b3, 0x0000ab53,
-	0x00000370, 0x00000371, 0x000004d6, 0x000004d7,
-	0x000118b5, 0x000118d5, 0x00002ce0, 0x00002ce1,
-	0x00000394, 0x000003b4, 0x00001f8f, 0x00001f87,
-	0x000013c4, 0x0000ab94, 0x00001e60, 0x00001e61,
-	0x00002cc4, 0x00002cc5, 0x0000a65e, 0x0000a65f,
-	0x000001e2, 0x000001e3, 0x00000122, 0x00000123,
-	0x00001ef4, 0x00001ef5, 0x00000214, 0x00000215,
-	0x000013e1, 0x0000abb1, 0x00001c98, 0x000010d8,
-	0x0000046c, 0x0000046d, 0x000013d2, 0x0000aba2,
-	0x0000ff39, 0x0000ff59, 0x00000044, 0x00000064,
-	0x00016e4f, 0x00016e6f, 0x000004a6, 0x000004a7,
-	0x00010417, 0x0001043f, 0x000000d4, 0x000000f4,
-	0x00001e78, 0x00001e79, 0x00002c1f, 0x00002c4f,
-	0x00010422, 0x0001044a, 0x0000052a, 0x0000052b,
-	0x000003ee, 0x000003ef, 0x0000a786, 0x0000a787,
-	0x000001f1, 0x000001f3, 0x00001eba, 0x00001ebb,
-	0x000010b8, 0x00002d18, 0x00002cba, 0x00002cbb,
-	0x00010413, 0x0001043b, 0x00001cb4, 0x000010f4,
-	0x000004aa, 0x000004ab, 0x00000245, 0x0000028c,
-	0x00002caa, 0x00002cab, 0x00002cae, 0x00002caf,
-	0x000003a0, 0x000003c0, 0x00001e80, 0x00001e81,
-	0x00001c9d, 0x000010dd, 0x00002c92, 0x00002c93,
-	0x000013cd, 0x0000ab9d, 0x000024c8, 0x000024e2,
-	0x0000a78b, 0x0000a78c, 0x0000004a, 0x0000006a,
-	0x0000054e, 0x0000057e, 0x0000a7b6, 0x0000a7b7,
-	0x00000418, 0x00000438, 0x000000d0, 0x000000f0,
-	0x00000041, 0x00000061, 0x00010592, 0x000105b9,
-	0x00001fda, 0x00001f76, 0x00002c70, 0x00000252,
-	0x000001f8, 0x000001f9, 0x00001ffb, 0x00001f7d,
-	0x00001f8a, 0x00001f82, 0x000001af, 0x000001b0,
-	0x000024bc, 0x000024d6, 0x0000a76e, 0x0000a76f,
-	0x00001c90, 0x000010d0, 0x0000022c, 0x0000022d,
-	0x000013d0, 0x0000aba0, 0x000013e0, 0x0000abb0,
-	0x00000543, 0x00000573, 0x00000134, 0x00000135,
-	0x0000a7c6, 0x00001d8e, 0x00002c29, 0x00002c59,
-	0x00002c17, 0x00002c47, 0x00001e38, 0x00001e39,
-	0x000000c0, 0x000000e0, 0x0001e916, 0x0001e938,
-	0x00010581, 0x000105a8, 0x000010c4, 0x00002d24,
-	0x00000550, 0x00000580, 0x00001f1b, 0x00001f13,
-	0x00001e74, 0x00001e75, 0x0000ff2d, 0x0000ff4d,
-	0x00002cc6, 0x00002cc7, 0x00000170, 0x00000171,
-	0x00002c24, 0x00002c54, 0x00001ed8, 0x00001ed9,
-	0x00001cb1, 0x000010f1, 0x00001e50, 0x00001e51,
-	0x00002cda, 0x00002cdb, 0x0000012c, 0x0000012d,
-	0x00010c8d, 0x00010ccd, 0x00001eb2, 0x00001eb3,
-	0x000104c1, 0x000104e9, 0x00016e4d, 0x00016e6d,
-	0x0000ff34, 0x0000ff54, 0x000104b4, 0x000104dc,
-	0x0001058e, 0x000105b5, 0x00001eaa, 0x00001eab,
-	0x0000a694, 0x0000a695, 0x00002c05, 0x00002c35,
-	0x00002c60, 0x00002c61, 0x000003de, 0x000003df,
-	0x000000d5, 0x000000f5, 0x00016e4c, 0x00016e6c,
-	0x00000208, 0x00000209, 0x000010ae, 0x00002d0e,
-	0x0000042b, 0x0000044b, 0x00001f5d, 0x00001f55,
-	0x00001cb2, 0x000010f2, 0x0000a664, 0x0000a665,
-	0x0000a64e, 0x0000a64f, 0x0001e90e, 0x0001e930,
-	0x00000114, 0x00000115, 0x00000478, 0x00000479,
-	0x00001e1c, 0x00001e1d, 0x00002c15, 0x00002c45,
-	0x000013b8, 0x0000ab88, 0x000004d0, 0x000004d1,
-	0x0000a726, 0x0000a727, 0x0001041d, 0x00010445,
-	0x00001fcc, 0x00001fc3, 0x000001d1, 0x000001d2,
-	0x0000040c, 0x0000045c, 0x00001ca1, 0x000010e1,
-	0x0000021a, 0x0000021b, 0x000001b7, 0x00000292,
-	0x00000391, 0x000003b1, 0x000004f2, 0x000004f3,
-	0x00010425, 0x0001044d, 0x00002c72, 0x00002c73,
-	0x00002c0f, 0x00002c3f, 0x000024c0, 0x000024da,
-	0x000001bc, 0x000001bd, 0x000000c5, 0x000000e5,
-	0x00000540, 0x00000570, 0x0000004c, 0x0000006c,
-	0x00016e43, 0x00016e63, 0x00010c89, 0x00010cc9,
-	0x000013a1, 0x0000ab71, 0x00001f38, 0x00001f30,
-	0x000001fe, 0x000001ff, 0x00000187, 0x00000188,
-	0x00010580, 0x000105a7, 0x0000a7d8, 0x0000a7d9,
-	0x000004f6, 0x000004f7, 0x000004dc, 0x000004dd,
-	0x0000a77d, 0x00001d79, 0x0001e900, 0x0001e922,
-	0x0000216a, 0x0000217a, 0x00010c85, 0x00010cc5,
-	0x000104d0, 0x000104f8, 0x000000c4, 0x000000e4,
-	0x00000102, 0x00000103, 0x0000a77b, 0x0000a77c,
-	0x00002183, 0x00002184, 0x00001ca5, 0x000010e5,
-	0x00000535, 0x00000565, 0x0000a79a, 0x0000a79b,
-	0x00010c95, 0x00010cd5, 0x00010408, 0x00010430,
-	0x000010ac, 0x00002d0c, 0x00001e4a, 0x00001e4b,
-	0x000118b8, 0x000118d8, 0x000104b6, 0x000104de,
-	0x0000a68c, 0x0000a68d, 0x0000a790, 0x0000a791,
-	0x00010c81, 0x00010cc1, 0x000000da, 0x000000fa,
-	0x000118bb, 0x000118db, 0x000010bf, 0x00002d1f,
-	0x00000426, 0x00000446, 0x00001f3f, 0x00001f37,
-	0x000004d2, 0x000004d3, 0x000104d2, 0x000104fa,
-	0x000013c5, 0x0000ab95, 0x000010b4, 0x00002d14,
-	0x0000053a, 0x0000056a, 0x00001cbf, 0x000010ff,
-	0x00001f9a, 0x00001f92, 0x00001e64, 0x00001e65,
-	0x00000528, 0x00000529, 0x0000050c, 0x0000050d,
-	0x0000038f, 0x000003ce, 0x00002c14, 0x00002c44,
-	0x0000ff26, 0x0000ff46, 0x000001cf, 0x000001d0,
-	0x00001c97, 0x000010d7, 0x00001e34, 0x00001e35,
-	0x000013d8, 0x0000aba8, 0x00001ca9, 0x000010e9,
-	0x00010411, 0x00010439, 0x00000053, 0x00000073,
-	0x00001fea, 0x00001f7a, 0x0000a7bc, 0x0000a7bd,
-	0x00016e5c, 0x00016e7c, 0x0000ff24, 0x0000ff44,
-	0x0000053c, 0x0000056c, 0x000003ab, 0x000003cb,
-	0x00010589, 0x000105b0, 0x00000160, 0x00000161,
-	0x000013ac, 0x0000ab7c, 0x000001ec, 0x000001ed,
-	0x00016e56, 0x00016e76, 0x0000010a, 0x0000010b,
-	0x0000015c, 0x0000015d, 0x00010578, 0x0001059f,
-	0x00001cb6, 0x000010f6, 0x00000232, 0x00000233,
-	0x00010c9d, 0x00010cdd, 0x00010570, 0x00010597,
-	0x000024cb, 0x000024e5, 0x00000042, 0x00000062,
-	0x00000464, 0x00000465, 0x000104c6, 0x000104ee,
-	0x00001f98, 0x00001f90, 0x00000106, 0x00000107,
-	0x000004f0, 0x000004f1, 0x000104be, 0x000104e6,
-	0x0000040d, 0x0000045d, 0x00001fbc, 0x00001fb3,
-	0x000024ca, 0x000024e4, 0x0000ff30, 0x0000ff50,
-	0x000000cc, 0x000000ec, 0x0000048a, 0x0000048b,
-	0x000001f4, 0x000001f5, 0x000104d3, 0x000104fb,
-	0x00002c2a, 0x00002c5a, 0x00000400, 0x00000450,
-	0x00010c8f, 0x00010ccf, 0x0000039d, 0x000003bd,
-	0x000013ed, 0x0000abbd, 0x00000516, 0x00000517,
-	0x00000512, 0x00000513, 0x000118b7, 0x000118d7,
-	0x00001ed2, 0x00001ed3, 0x00016e53, 0x00016e73,
-	0x00000196, 0x00000269, 0x00001f0c, 0x00001f04,
-	0x000104b9, 0x000104e1, 0x000010be, 0x00002d1e,
-	0x0000a696, 0x0000a697, 0x0000054f, 0x0000057f,
-	0x0001040d, 0x00010435, 0x000004e2, 0x000004e3,
-	0x00002132, 0x0000214e, 0x000104bc, 0x000104e4,
-	0x00000204, 0x00000205, 0x000013ea, 0x0000abba,
-	0x00001f0d, 0x00001f05, 0x000013df, 0x0000abaf,
-	0x00016e5b, 0x00016e7b, 0x00000197, 0x00000268,
-	0x00001f0b, 0x00001f03, 0x00000506, 0x00000507,
-	0x00000110, 0x00000111, 0x00002c6f, 0x00000250,
-	0x00010426, 0x0001044e, 0x00001f9d, 0x00001f95,
-	0x0000019c, 0x0000026f, 0x0000a748, 0x0000a749,
-	0x000104b0, 0x000104d8, 0x00001ed0, 0x00001ed1,
-	0x00001e02, 0x00001e03, 0x0000a73a, 0x0000a73b,
-	0x00002cb2, 0x00002cb3, 0x000004c7, 0x000004c8,
-	0x000000ca, 0x000000ea, 0x000118bd, 0x000118dd,
-	0x00002c25, 0x00002c55, 0x00000412, 0x00000432,
-	0x000013b9, 0x0000ab89, 0x00016e5d, 0x00016e7d,
-	0x00000141, 0x00000142, 0x00010404, 0x0001042c,
-	0x00002c80, 0x00002c81, 0x000118a3, 0x000118c3,
-	0x0000ff2e, 0x0000ff4e, 0x00010412, 0x0001043a,
-	0x00000051, 0x00000071, 0x000010b9, 0x00002d19,
-	0x000013a3, 0x0000ab73, 0x0001e91d, 0x0001e93f,
-	0x000010bc, 0x00002d1c, 0x0000054c, 0x0000057c,
-	0x00010415, 0x0001043d, 0x0000a7d6, 0x0000a7d7,
-	0x00001f4c, 0x00001f44, 0x000004ba, 0x000004bb,
-	0x000104ca, 0x000104f2, 0x000004f8, 0x000004f9,
-	0x00002ceb, 0x00002cec, 0x00002cce, 0x00002ccf,
-	0x0000a7ac, 0x00000261, 0x00010cb2, 0x00010cf2,
-	0x00001f8e, 0x00001f86, 0x0000a66a, 0x0000a66b,
-	0x00002cd8, 0x00002cd9, 0x0001e91f, 0x0001e941,
-	0x00000492, 0x00000493, 0x00000480, 0x00000481,
-	0x00016e52, 0x00016e72, 0x00010416, 0x0001043e,
-	0x00001c91, 0x000010d1, 0x000013d6, 0x0000aba6,
-	0x000118a2, 0x000118c2, 0x00001e54, 0x00001e55,
-	0x000003f4, 0x000003b8, 0x000001ca, 0x000001cc,
-	0x000013ef, 0x0000abbf, 0x00001e3c, 0x00001e3d,
-	0x00001ea4, 0x00001ea5, 0x000013c1, 0x0000ab91,
-	0x00010c94, 0x00010cd4, 0x00002c62, 0x0000026b,
-	0x0000014c, 0x0000014d, 0x00000054, 0x00000074,
-	0x00000504, 0x00000505, 0x00001ca6, 0x000010e6,
-	0x0000038a, 0x000003af, 0x0000a779, 0x0000a77a,
-	0x000104bf, 0x000104e7, 0x00001e6a, 0x00001e6b,
-	0x00000538, 0x00000568, 0x00000194, 0x00000263,
-	0x00001f2f, 0x00001f27, 0x00002c1a, 0x00002c4a,
-	0x00001efe, 0x00001eff, 0x000010cd, 0x00002d2d,
-	0x00001cbd, 0x000010fd, 0x0001057f, 0x000105a6,
-	0x000013e4, 0x0000abb4, 0x0000a64a, 0x0000a64b,
-	0x000104cc, 0x000104f4, 0x00001ed6, 0x00001ed7,
-	0x00000549, 0x00000579, 0x0000a7c2, 0x0000a7c3,
-	0x00001f2b, 0x00001f23, 0x00001e0e, 0x00001e0f,
-	0x000001d9, 0x000001da, 0x0000039e, 0x000003be,
-	0x000118b4, 0x000118d4, 0x00001e3a, 0x00001e3b,
-	0x000013c2, 0x0000ab92, 0x000013bf, 0x0000ab8f,
-	0x00010591, 0x000105b8, 0x00000402, 0x00000452,
-	0x000004c5, 0x000004c6, 0x000024b6, 0x000024d0,
-	0x00001f9e, 0x00001f96, 0x00002c2e, 0x00002c5e,
-	0x00000420, 0x00000440, 0x00001e00, 0x00001e01,
-	0x0000a7ab, 0x0000025c, 0x00001ef0, 0x00001ef1,
-	0x00010c9b, 0x00010cdb, 0x000013e7, 0x0000abb7,
-	0x000013d5, 0x0000aba5, 0x00001f8c, 0x00001f84,
-	0x0000a72c, 0x0000a72d, 0x0000a736, 0x0000a737,
-	0x0001041f, 0x00010447, 0x00000059, 0x00000079,
-	0x000003ea, 0x000003eb, 0x0000a7aa, 0x00000266,
-	0x00002c00, 0x00002c30, 0x00000536, 0x00000566,
-	0x0000047e, 0x0000047f, 0x000000cf, 0x000000ef,
-	0x00000541, 0x00000571, 0x00000104, 0x00000105,
-	0x00010c98, 0x00010cd8, 0x00002cca, 0x00002ccb,
-	0x00002c8a, 0x00002c8b, 0x000001ac, 0x000001ad,
-	0x00000514, 0x00000515, 0x00010ca7, 0x00010ce7,
-	0x00001e5c, 0x00001e5d, 0x00016e59, 0x00016e79,
-	0x00000544, 0x00000574, 0x000104ce, 0x000104f6,
-	0x00001ec0, 0x00001ec1, 0x000000ce, 0x000000ee,
-	0x0000a646, 0x0000a647, 0x0001040e, 0x00010436,
-	0x00010c8e, 0x00010cce, 0x00000166, 0x00000167,
-	0x0000004b, 0x0000006b, 0x000013f1, 0x000013f9,
-	0x00001c96, 0x000010d6, 0x00000126, 0x00000127,
-	0x000024cc, 0x000024e6, 0x00001f19, 0x00001f11,
-	0x0000ff21, 0x0000ff41, 0x000013d4, 0x0000aba4,
-	0x0000a65a, 0x0000a65b, 0x00000407, 0x00000457,
-	0x00010ca2, 0x00010ce2, 0x00002ca2, 0x00002ca3,
-	0x000104cb, 0x000104f3, 0x000001f6, 0x00000195,
-	0x0001e921, 0x0001e943, 0x0000018e, 0x000001dd,
-	0x0001e904, 0x0001e926, 0x0000039c, 0x000003bc,
-	0x00010ca0, 0x00010ce0, 0x00000554, 0x00000584,
-	0x00002164, 0x00002174, 0x000013f5, 0x000013fd,
-	0x00001ea0, 0x00001ea1, 0x0000a782, 0x0000a783,
-	0x0000ff31, 0x0000ff51, 0x0000042a, 0x0000044a,
-	0x00000150, 0x00000151, 0x00000241, 0x00000242,
-	0x000013d1, 0x0000aba1, 0x00010caa, 0x00010cea,
-	0x00001f4a, 0x00001f42, 0x0000052e, 0x0000052f,
-	0x0000042c, 0x0000044c, 0x0000040f, 0x0000045f,
-	0x00001e5a, 0x00001e5b, 0x0000a68e, 0x0000a68f,
-	0x00001f0a, 0x00001f02, 0x00000191, 0x00000192,
-	0x00002c0a, 0x00002c3a, 0x00000408, 0x00000458,
-	0x000001c5, 0x000001c6, 0x0001e91c, 0x0001e93e,
-	0x00002c82, 0x00002c83, 0x000004e8, 0x000004e9,
-	0x000003a3, 0x000003c3, 0x00010c9e, 0x00010cde,
-	0x00001faa, 0x00001fa2, 0x000013b4, 0x0000ab84,
-	0x0000a7b2, 0x0000029d, 0x00001ec2, 0x00001ec3,
-	0x00001f99, 0x00001f91, 0x000000c3, 0x000000e3,
-	0x0000013f, 0x00000140, 0x00001f68, 0x00001f60,
-	0x00010cac, 0x00010cec, 0x00000413, 0x00000433,
-	0x00000184, 0x00000185, 0x00010583, 0x000105aa,
-	0x000001a4, 0x000001a5, 0x000003ff, 0x0000037d,
-	0x00000212, 0x00000213, 0x00000403, 0x00000453,
-	0x00000228, 0x00000229, 0x0000a798, 0x0000a799,
-	0x000024c5, 0x000024df, 0x00002cb4, 0x00002cb5,
-	0x000013b6, 0x0000ab86, 0x0000a644, 0x0000a645,
-	0x00002c63, 0x00001d7d, 0x00001e10, 0x00001e11,
-	0x00001f2c, 0x00001f24, 0x00010c9a, 0x00010cda,
-	0x000001ea, 0x000001eb, 0x00001c9e, 0x000010de,
-	0x0001040f, 0x00010437, 0x000118be, 0x000118de,
-	0x000104c8, 0x000104f0, 0x0000a682, 0x0000a683,
-	0x00000218, 0x00000219, 0x0000019f, 0x00000275,
-	0x000001e6, 0x000001e7, 0x00001eee, 0x00001eef,
-	0x00001edc, 0x00001edd, 0x00002cd2, 0x00002cd3,
-	0x00001e46, 0x00001e47, 0x00016e4a, 0x00016e6a,
-	0x000004be, 0x000004bf, 0x000013f0, 0x000013f8,
-	0x00016e46, 0x00016e66, 0x00002cb6, 0x00002cb7,
-	0x00016e49, 0x00016e69, 0x000001b1, 0x0000028a,
-	0x000013b2, 0x0000ab82, 0x00001e94, 0x00001e95,
-	0x00000202, 0x00000203, 0x0000a742, 0x0000a743,
-	0x000013c9, 0x0000ab99, 0x0000014e, 0x0000014f,
-	0x000118a0, 0x000118c0, 0x0000054b, 0x0000057b,
-	0x0000017d, 0x0000017e, 0x000104b8, 0x000104e0,
-	0x00000526, 0x00000527, 0x000024cd, 0x000024e7,
-	0x000004fc, 0x000004fd, 0x0000023e, 0x00002c66,
-	0x000010bd, 0x00002d1d, 0x00001f6b, 0x00001f63,
-	0x00002c21, 0x00002c51, 0x00001eb4, 0x00001eb5,
-	0x000118bf, 0x000118df, 0x000013a7, 0x0000ab77,
-	0x00010579, 0x000105a0, 0x000010ba, 0x00002d1a,
-	0x0000a732, 0x0000a733, 0x000004a2, 0x000004a3,
-	0x000004cd, 0x000004ce, 0x00001fc8, 0x00001f72,
-	0x00001f18, 0x00001f10, 0x00001eca, 0x00001ecb,
-	0x00001f3d, 0x00001f35, 0x00001ec8, 0x00001ec9,
-	0x000001d5, 0x000001d6, 0x000010a9, 0x00002d09,
-	0x0000a7c7, 0x0000a7c8, 0x000001fc, 0x000001fd,
-	0x00002cc8, 0x00002cc9, 0x00002166, 0x00002176,
-	0x00001f8b, 0x00001f83, 0x0000016c, 0x0000016d,
-	0x0000a75a, 0x0000a75b, 0x0000ff32, 0x0000ff52,
-	0x000104c3, 0x000104eb, 0x00001eda, 0x00001edb,
-	0x000003e4, 0x000003e5, 0x0001e903, 0x0001e925,
-	0x00001e44, 0x00001e45, 0x00002cc2, 0x00002cc3,
-	0x00002ca6, 0x00002ca7, 0x000118b3, 0x000118d3,
-	0x00002c06, 0x00002c36, 0x00001f3c, 0x00001f34,
-	0x000004d8, 0x000004d9, 0x000013eb, 0x0000abbb,
-	0x00002ce2, 0x00002ce3, 0x000010a2, 0x00002d02,
-	0x000000c1, 0x000000e1, 0x00000424, 0x00000444,
-	0x00001ee4, 0x00001ee5, 0x00001e5e, 0x00001e5f,
-	0x0000a660, 0x0000a661, 0x0000018b, 0x0000018c,
-	0x00002c20, 0x00002c50, 0x00001ef6, 0x00001ef7,
-	0x000013be, 0x0000ab8e, 0x00000139, 0x0000013a,
-	0x00010571, 0x00010598, 0x0000040a, 0x0000045a,
-	0x0000a752, 0x0000a753, 0x0001e913, 0x0001e935,
-	0x00001e06, 0x00001e07, 0x0000216c, 0x0000217c,
-	0x000010b3, 0x00002d13, 0x000013ec, 0x0000abbc,
-	0x000000d6, 0x000000f6, 0x000013cc, 0x0000ab9c,
-	0x000118b1, 0x000118d1, 0x000118ad, 0x000118cd,
-	0x00001f3a, 0x00001f32, 0x0000046e, 0x0000046f,
-	0x0000017b, 0x0000017c, 0x00016e40, 0x00016e60,
-	0x000010b0, 0x00002d10, 0x0000053e, 0x0000056e,
-	0x0001e920, 0x0001e942, 0x00010ca1, 0x00010ce1,
-	0x0001e914, 0x0001e936, 0x0000020c, 0x0000020d,
-	0x0000020a, 0x0000020b, 0x00001f1d, 0x00001f15,
-	0x0000011c, 0x0000011d, 0x000013bc, 0x0000ab8c,
-	0x00002c0b, 0x00002c3b, 0x0000a684, 0x0000a685,
-	0x00002cac, 0x00002cad, 0x00000174, 0x00000175,
-	0x00002ca8, 0x00002ca9, 0x000104cf, 0x000104f7,
-	0x000010a0, 0x00002d00, 0x00002c9a, 0x00002c9b,
-	0x000013a5, 0x0000ab75, 0x0000a7b1, 0x00000287,
-	0x0000a74e, 0x0000a74f, 0x000001e8, 0x000001e9,
-	0x00010400, 0x00010428, 0x000004c1, 0x000004c2,
-	0x000013b1, 0x0000ab81, 0x00002c07, 0x00002c37,
-	0x00010402, 0x0001042a, 0x00016e5a, 0x00016e7a,
-	0x00001f0f, 0x00001f07, 0x0000a768, 0x0000a769,
-	0x0000ff22, 0x0000ff42, 0x00001c92, 0x000010d2,
-	0x0000022e, 0x0000022f, 0x0000a7c4, 0x0000a794,
-	0x00002c7f, 0x00000240, 0x00001f69, 0x00001f61,
-	0x00000474, 0x00000475, 0x00000468, 0x00000469,
-	0x00000147, 0x00000148, 0x00001cab, 0x000010eb,
-	0x00002c6b, 0x00002c6c, 0x0000a722, 0x0000a723,
-	0x000013c7, 0x0000ab97, 0x00000128, 0x00000129,
-	0x00001fb8, 0x00001fb0, 0x00002160, 0x00002170,
-	0x000013af, 0x0000ab7f, 0x0000ff28, 0x0000ff48,
-	0x00010588, 0x000105af, 0x00001e4c, 0x00001e4d,
-	0x00000389, 0x000003ae, 0x00002c26, 0x00002c56,
-	0x00001ee0, 0x00001ee1, 0x0000018a, 0x00000257,
-	0x00001fe9, 0x00001fe1, 0x00002cb0, 0x00002cb1,
-	0x000001a0, 0x000001a1, 0x000001d7, 0x000001d8,
-	0x000104b5, 0x000104dd, 0x00001ebc, 0x00001ebd,
-	0x00001fa8, 0x00001fa0, 0x0000041b, 0x0000043b,
-	0x00002cb8, 0x00002cb9, 0x000000de, 0x000000fe,
-	0x000013ca, 0x0000ab9a, 0x00010ca6, 0x00010ce6,
-	0x00001f1a, 0x00001f12, 0x0000040e, 0x0000045e,
-	0x00000466, 0x00000467, 0x00002cbc, 0x00002cbd,
-	0x00001c9b, 0x000010db, 0x000013ce, 0x0000ab9e,
-	0x00000386, 0x000003ac, 0x0000ff3a, 0x0000ff5a,
-	0x00001f5b, 0x00001f53, 0x00000222, 0x00000223,
-	0x0000024e, 0x0000024f, 0x00000176, 0x00000177,
-	0x000013e5, 0x0000abb5, 0x00001ede, 0x00001edf,
-	0x000001e0, 0x000001e1, 0x000010c5, 0x00002d25,
-	0x0001e91b, 0x0001e93d, 0x00001c9a, 0x000010da,
-	0x0000024c, 0x0000024d, 0x0000a754, 0x0000a755,
-	0x000104c7, 0x000104ef, 0x00002c9e, 0x00002c9f,
-	0x0000a640, 0x0000a641, 0x0000a7b8, 0x0000a7b9,
-	0x000003fd, 0x0000037b, 0x00001ca2, 0x000010e2,
-	0x000118a5, 0x000118c5, 0x00001e86, 0x00001e87,
-	0x00001f4b, 0x00001f43, 0x00001e18, 0x00001e19,
-	0x00000545, 0x00000575, 0x00010c97, 0x00010cd7,
-	0x00010590, 0x000105b7, 0x0001e919, 0x0001e93b,
-	0x0001e910, 0x0001e932, 0x0000a766, 0x0000a767,
-	0x0000040b, 0x0000045b, 0x00001e70, 0x00001e71,
-	0x0000024a, 0x0000024b, 0x0001e907, 0x0001e929,
-	0x00002c98, 0x00002c99, 0x0000a74c, 0x0000a74d,
-	0x000013de, 0x0000abae, 0x000003a9, 0x000003c9,
-	0x00001cae, 0x000010ee, 0x00000152, 0x00000153,
-	0x000004de, 0x000004df, 0x000013ab, 0x0000ab7b,
-	0x00010585, 0x000105ac, 0x00001e08, 0x00001e09,
-	0x0000a75c, 0x0000a75d, 0x000024ba, 0x000024d4,
-	0x00000143, 0x00000144, 0x00000043, 0x00000063,
-	0x0000a666, 0x0000a667, 0x000010b1, 0x00002d11,
-	0x00000120, 0x00000121, 0x000013e2, 0x0000abb2,
-	0x00000494, 0x00000495, 0x00010414, 0x0001043c,
-	0x00000401, 0x00000451, 0x0000051e, 0x0000051f,
-	0x00010ca9, 0x00010ce9, 0x0000013b, 0x0000013c,
-	0x00010421, 0x00010449, 0x0000021e, 0x0000021f,
-	0x000000d1, 0x000000f1, 0x000000cd, 0x000000ed,
-	0x000000dc, 0x000000fc, 0x0000004f, 0x0000006f,
-	0x0000a78d, 0x00000265, 0x00010420, 0x00010448,
-	0x00002c64, 0x0000027d, 0x000001b2, 0x0000028b,
-	0x00001f89, 0x00001f81, 0x000104cd, 0x000104f5,
-	0x000010b6, 0x00002d16, 0x0000039a, 0x000003ba,
-	0x00000047, 0x00000067, 0x00002c1d, 0x00002c4d,
-	0x00001e66, 0x00001e67, 0x00000406, 0x00000456,
-	0x00001cb3, 0x000010f3, 0x000118b2, 0x000118d2,
-	0x00002c16, 0x00002c46, 0x000003e0, 0x000003e1,
-	0x0000023b, 0x0000023c, 0x000013bb, 0x0000ab8b,
-	0x0001057d, 0x000105a4, 0x00002c86, 0x00002c87,
-	0x0000a780, 0x0000a781, 0x00001fd8, 0x00001fd0,
-	0x00001ca8, 0x000010e8, 0x00001f9c, 0x00001f94,
-	0x0000a7be, 0x0000a7bf, 0x000118af, 0x000118cf,
-	0x00000050, 0x00000070, 0x00000052, 0x00000072,
-	0x0000a698, 0x0000a699, 0x00001ec4, 0x00001ec5,
-	0x00002c08, 0x00002c38, 0x000118bc, 0x000118dc,
-	0x00010424, 0x0001044c, 0x00010c84, 0x00010cc4,
-	0x0001058a, 0x000105b1, 0x00000376, 0x00000377,
-	0x000000cb, 0x000000eb, 0x00002ccc, 0x00002ccd,
-	0x000000c6, 0x000000e6, 0x0000a650, 0x0000a651,
-	0x000013ad, 0x0000ab7d, 0x00000472, 0x00000473,
-	0x00002cf2, 0x00002cf3, 0x000024c7, 0x000024e1,
-	0x000001cd, 0x000001ce, 0x000001e4, 0x000001e5,
-	0x00000136, 0x00000137, 0x00010c93, 0x00010cd3,
-	0x000118aa, 0x000118ca, 0x00000182, 0x00000183,
-	0x0000216b, 0x0000217b, 0x00000156, 0x00000157,
-	0x0000042e, 0x0000044e, 0x00001ee8, 0x00001ee9,
-	0x000001fa, 0x000001fb, 0x000004ae, 0x000004af,
-	0x00001f88, 0x00001f80, 0x00001f6c, 0x00001f64,
-	0x00000124, 0x00000125, 0x0000a648, 0x0000a649,
-	0x0000046a, 0x0000046b, 0x00002c8e, 0x00002c8f,
-	0x00002cdc, 0x00002cdd, 0x000013dc, 0x0000abac,
-	0x000024be, 0x000024d8, 0x00000555, 0x00000585,
-	0x00016e55, 0x00016e75, 0x0001e901, 0x0001e923,
-	0x00001f0e, 0x00001f06, 0x000104bb, 0x000104e3,
-	0x00001eac, 0x00001ead, 0x0000a77e, 0x0000a77f,
-	0x000003e6, 0x000003e7, 0x00001fcb, 0x00001f75,
-	0x00000162, 0x00000163, 0x00010c91, 0x00010cd1,
-	0x00016e44, 0x00016e64, 0x0000053d, 0x0000056d,
-	0x00000198, 0x00000199, 0x00000552, 0x00000582,
-	0x000003f9, 0x000003f2, 0x00001e6e, 0x00001e6f,
-	0x0000a7c9, 0x0000a7ca, 0x0000a656, 0x0000a657,
-	0x00000496, 0x00000497, 0x00001e1a, 0x00001e1b,
-	0x00002167, 0x00002177, 0x00000415, 0x00000435,
-	0x00000410, 0x00000430, 0x00002c90, 0x00002c91,
-	0x000004b8, 0x000004b9, 0x0000ff38, 0x0000ff58,
-	0x00016e4e, 0x00016e6e, 0x00001ffc, 0x00001ff3,
-	0x000001a7, 0x000001a8, 0x0000019d, 0x00000272,
-	0x00010c83, 0x00010cc3, 0x00001e8a, 0x00001e8b,
-	0x0000a690, 0x0000a691, 0x000004cb, 0x000004cc,
-	0x000003a1, 0x000003c1, 0x00001f2e, 0x00001f26,
-	0x00002169, 0x00002179, 0x00001cba, 0x000010fa,
-	0x0000a686, 0x0000a687, 0x000010a6, 0x00002d06,
-	0x00000395, 0x000003b5, 0x000024c4, 0x000024de,
-	0x00001ee6, 0x00001ee7, 0x000001f7, 0x000001bf,
-	0x0000004d, 0x0000006d, 0x00002c19, 0x00002c49,
-	0x00001c99, 0x000010d9, 0x00000533, 0x00000563,
-	0x0000a69a, 0x0000a69b, 0x00016e48, 0x00016e68,
-	0x000003a8, 0x000003c8, 0x000003dc, 0x000003dd,
-	0x000004e4, 0x000004e5, 0x00001fd9, 0x00001fd1,
-	0x00000405, 0x00000455, 0x00001e14, 0x00001e15,
-	0x0000038c, 0x000003cc, 0x0000a7ae, 0x0000026a,
-	0x00000508, 0x00000509, 0x00001ece, 0x00001ecf,
-	0x0000a66c, 0x0000a66d, 0x000003a7, 0x000003c7,
-	0x00002c10, 0x00002c40, 0x000010c2, 0x00002d22,
-	0x000013c6, 0x0000ab96, 0x00010c86, 0x00010cc6,
-	0x0001e90a, 0x0001e92c, 0x0000ff23, 0x0000ff43,
-	0x00000520, 0x00000521, 0x00010cae, 0x00010cee,
-	0x00001fe8, 0x00001fe0, 0x00001ff8, 0x00001f78,
-	0x00000243, 0x00000180, 0x00010c99, 0x00010cd9,
-	0x00000470, 0x00000471, 0x00000423, 0x00000443,
-	0x0000a7a0, 0x0000a7a1, 0x00001e82, 0x00001e83,
-	0x00002c84, 0x00002c85, 0x000013a6, 0x0000ab76,
-	0x000013ae, 0x0000ab7e, 0x000003a4, 0x000003c4,
-	0x000004b6, 0x000004b7, 0x00001fae, 0x00001fa6,
-	0x00000460, 0x00000461, 0x00000425, 0x00000445,
-	0x00001e6c, 0x00001e6d, 0x00001e76, 0x00001e77,
-	0x00000532, 0x00000562, 0x00000189, 0x00000256,
-	0x00002c1c, 0x00002c4c, 0x00001e36, 0x00001e37,
-	0x000104d1, 0x000104f9, 0x000010ab, 0x00002d0b,
-	0x00001ed4, 0x00001ed5, 0x00000193, 0x00000260,
-	0x00002c1b, 0x00002c4b, 0x000104b3, 0x000104db,
-	0x00000056, 0x00000076, 0x00016e45, 0x00016e65,
-	0x00002cd4, 0x00002cd5, 0x000010b5, 0x00002d15,
-	0x00002c88, 0x00002c89, 0x0000048c, 0x0000048d,
-	0x000010c1, 0x00002d21, 0x00002c2b, 0x00002c5b,
-	0x0000012e, 0x0000012f, 0x000004a4, 0x000004a5,
-	0x00000248, 0x00000249, 0x00002c09, 0x00002c39,
-	0x00001efc, 0x00001efd, 0x00000055, 0x00000075,
-	0x00001e7c, 0x00001e7d, 0x00001c9c, 0x000010dc,
-	0x0000023a, 0x00002c65, 0x00000118, 0x00000119,
-	0x000001c7, 0x000001c9, 0x000003f7, 0x000003f8,
-	0x00002c2c, 0x00002c5c, 0x00000404, 0x00000454,
-	0x00010c8b, 0x00010ccb, 0x000104c0, 0x000104e8,
-	0x00000200, 0x00000201, 0x0000a72e, 0x0000a72f,
-	0x00002ca4, 0x00002ca5, 0x00002c03, 0x00002c33,
-	0x00001e56, 0x00001e57, 0x00000396, 0x000003b6,
-	0x00001e3e, 0x00001e3f, 0x0001040c, 0x00010434,
-	0x00001ecc, 0x00001ecd, 0x000024cf, 0x000024e9,
-	0x00010c9c, 0x00010cdc, 0x0000ff25, 0x0000ff45,
-	0x000013e6, 0x0000abb6, 0x00000417, 0x00000437,
-	0x000000dd, 0x000000fd, 0x00001f3b, 0x00001f33,
-	0x000001ae, 0x00000288, 0x0000212a, 0x0000006b,
-	0x00010c82, 0x00010cc2, 0x00001cac, 0x000010ec,
-	0x000003d8, 0x000003d9, 0x00000393, 0x000003b3,
-	0x000024b9, 0x000024d3, 0x0000053f, 0x0000056f,
-	0x00002ca0, 0x00002ca1, 0x00000045, 0x00000065,
-	0x0001e908, 0x0001e92a, 0x0000015a, 0x0000015b,
-	0x00000168, 0x00000169, 0x000004d4, 0x000004d5,
-	0x000104c2, 0x000104ea, 0x00001ea8, 0x00001ea9,
-	0x00000392, 0x000003b2, 0x000024ce, 0x000024e8,
-	0x000010a5, 0x00002d05, 0x00001eb6, 0x00001eb7,
-	0x00002c75, 0x00002c76, 0x0000a65c, 0x0000a65d,
-	0x0000ff27, 0x0000ff47, 0x0001058c, 0x000105b3,
-	0x00001ef2, 0x00001ef3, 0x0001e917, 0x0001e939,
-	0x00016e54, 0x00016e74, 0x00002c9c, 0x00002c9d,
-	0x0000a7c5, 0x00000282, 0x0000039b, 0x000003bb,
-	0x0001e909, 0x0001e92b, 0x0000004e, 0x0000006e,
-	0x00001ffa, 0x00001f7c, 0x000004ac, 0x000004ad,
-	0x000104b1, 0x000104d9, 0x000000d2, 0x000000f2,
-	0x00001caf, 0x000010ef, 0x0001040a, 0x00010432,
-	0x0000049c, 0x0000049d, 0x0000016a, 0x0000016b,
-	0x00002c69, 0x00002c6a, 0x00001f08, 0x00001f00,
-	0x00001fdb, 0x00001f77, 0x00000206, 0x00000207,
-	0x00000518, 0x00000519, 0x0000a7a2, 0x0000a7a3,
-	0x0000042d, 0x0000044d, 0x00016e51, 0x00016e71,
-	0x000003fa, 0x000003fb, 0x000013a9, 0x0000ab79,
-	0x0000049e, 0x0000049f, 0x00002c0c, 0x00002c3c,
-	0x0000018f, 0x00000259, 0x00010c80, 0x00010cc0,
-	0x0001e906, 0x0001e928, 0x00000372, 0x00000373,
-	0x000004ea, 0x000004eb, 0x00001f1c, 0x00001f14,
-	0x00000427, 0x00000447, 0x000003e8, 0x000003e9,
-	0x0000a7a8, 0x0000a7a9, 0x0000a7b4, 0x0000a7b5,
-	0x00000553, 0x00000583, 0x00001e1e, 0x00001e1f,
-	0x000010a3, 0x00002d03, 0x00010418, 0x00010440,
-	0x00001ca7, 0x000010e7, 0x00002c04, 0x00002c34,
-	0x0001e911, 0x0001e933, 0x00001fad, 0x00001fa5,
-	0x00001f8d, 0x00001f85, 0x0001e915, 0x0001e937,
-	0x0000050e, 0x0000050f, 0x00002c2d, 0x00002c5d,
-	0x00000048, 0x00000068, 0x0000022a, 0x0000022b,
-	0x00001e2c, 0x00001e2d, 0x00001f2d, 0x00001f25,
-	0x00001f49, 0x00001f41, 0x00001ee2, 0x00001ee3,
-	0x00001e28, 0x00001e29, 0x00000178, 0x000000ff,
-	0x00002c0e, 0x00002c3e, 0x00000539, 0x00000569,
-	0x000013da, 0x0000abaa, 0x000000d9, 0x000000f9,
-	0x00010405, 0x0001042d, 0x000010aa, 0x00002d0a,
-	0x00010caf, 0x00010cef, 0x00001faf, 0x00001fa7,
-	0x00001e72, 0x00001e73, 0x0000021c, 0x0000021d,
-	0x0000013d, 0x0000013e, 0x00010594, 0x000105bb,
-	0x0000010c, 0x0000010d, 0x0000011e, 0x0000011f,
-	0x0000051a, 0x0000051b, 0x00001e2e, 0x00001e2f,
-	0x00002cde, 0x00002cdf, 0x00001f6a, 0x00001f62,
-	0x000013f2, 0x000013fa, 0x00001e84, 0x00001e85,
-	0x00001e0c, 0x00001e0d, 0x00016e4b, 0x00016e6b,
-	0x0000a792, 0x0000a793, 0x00001e48, 0x00001e49,
-	0x000001de, 0x000001df, 0x000013b0, 0x0000ab80,
-	0x0000a692, 0x0000a693, 0x00000186, 0x00000254,
-	0x00000409, 0x00000459, 0x00000537, 0x00000567,
-	0x00010c87, 0x00010cc7, 0x00000551, 0x00000581,
-	0x00001e12, 0x00001e13, 0x00002163, 0x00002173,
-	0x000118b6, 0x000118d6, 0x00002c27, 0x00002c57,
-	0x000004c9, 0x000004ca, 0x000001b3, 0x000001b4,
-	0x0000a64c, 0x0000a64d, 0x0001e91a, 0x0001e93c,
-	0x000118ac, 0x000118cc, 0x000003cf, 0x000003d7,
-	0x000118b9, 0x000118d9, 0x000004fa, 0x000004fb,
-	0x0000a744, 0x0000a745, 0x0000a734, 0x0000a735,
-	0x0000a73c, 0x0000a73d, 0x0001041b, 0x00010443,
-	0x00001fca, 0x00001f74, 0x000024c3, 0x000024dd,
-	0x000024c2, 0x000024dc, 0x00001f5f, 0x00001f57,
-	0x00001e8e, 0x00001e8f, 0x000118a9, 0x000118c9,
-	0x0001e905, 0x0001e927, 0x000013b7, 0x0000ab87,
-	0x000001a6, 0x00000280, 0x000013a8, 0x0000ab78,
-	0x000010a7, 0x00002d07, 0x0001041e, 0x00010446,
-	0x000001a9, 0x00000283, 0x00000522, 0x00000523,
-	0x000010ad, 0x00002d0d, 0x00002c02, 0x00002c32,
-	0x000003fe, 0x0000037c, 0x000004c3, 0x000004c4,
-	0x00001e24, 0x00001e25, 0x000104c5, 0x000104ed,
-	0x00002c2f, 0x00002c5f, 0x0000a784, 0x0000a785,
-	0x00001e4e, 0x00001e4f, 0x0000042f, 0x0000044f,
-	0x00001f3e, 0x00001f36, 0x000004da, 0x000004db,
-	0x000118a4, 0x000118c4, 0x00010419, 0x00010441,
-	0x00002168, 0x00002178, 0x0000a7ba, 0x0000a7bb,
-	0x00001e7a, 0x00001e7b, 0x00001eec, 0x00001eed,
-	0x00000542, 0x00000572, 0x00010c90, 0x00010cd0,
-	0x00001ff9, 0x00001f79, 0x00000112, 0x00000113,
-	0x00001ef8, 0x00001ef9, 0x000024bb, 0x000024d5,
-	0x000013d7, 0x0000aba7, 0x00010573, 0x0001059a,
-	0x0000051c, 0x0000051d, 0x00000411, 0x00000431,
-	0x00000145, 0x00000146, 0x00001e90, 0x00001e91,
-	0x00016e5f, 0x00016e7f, 0x000013e3, 0x0000abb3,
-	0x00002c0d, 0x00002c3d, 0x000000d8, 0x000000f8,
-	0x00001eb0, 0x00001eb1, 0x00000397, 0x000003b7,
-	0x0001e90b, 0x0001e92d, 0x00001e04, 0x00001e05,
-	0x00002ced, 0x00002cee, 0x0000a756, 0x0000a757,
-	0x0001041a, 0x00010442, 0x000010b2, 0x00002d12,
-	0x00000108, 0x00000109, 0x00001cb5, 0x000010f5,
-	0x00000416, 0x00000436, 0x00001e62, 0x00001e63,
-	0x0000a654, 0x0000a655, 0x0000037f, 0x000003f3,
-	0x00010ca4, 0x00010ce4, 0x00001efa, 0x00001efb,
-	0x0000a762, 0x0000a763, 0x000013d3, 0x0000aba3,
-	0x000003a6, 0x000003c6, 0x000118ab, 0x000118cb,
-	0x0000ff2f, 0x0000ff4f, 0x00000246, 0x00000247,
-	0x00001c94, 0x000010d4, 0x000010a4, 0x00002d04,
-	0x0000054a, 0x0000057a, 0x00010cb1, 0x00010cf1,
-	0x00002c67, 0x00002c68, 0x00001eae, 0x00001eaf,
-	0x000024c1, 0x000024db, 0x000001db, 0x000001dc,
-	0x00010c96, 0x00010cd6, 0x00000116, 0x00000117,
-	0x00002cc0, 0x00002cc1, 0x00010584, 0x000105ab,
-	0x00001fab, 0x00001fa3, 0x0000012a, 0x0000012b,
-	0x0000a76a, 0x0000a76b, 0x000024b8, 0x000024d2,
-	0x00010409, 0x00010431, 0x00000230, 0x00000231,
-	0x0000216e, 0x0000217e, 0x0000039f, 0x000003bf,
-	0x00016e42, 0x00016e62, 0x00002c12, 0x00002c42,
-	0x000000d3, 0x000000f3, 0x00001f59, 0x00001f51,
-	0x00002c6e, 0x00000271, 0x00000132, 0x00000133,
-	0x0000a724, 0x0000a725, 0x00002c23, 0x00002c53,
-	0x00010423, 0x0001044b, 0x00001fba, 0x00001f70,
-	0x000001c4, 0x000001c6, 0x000000c9, 0x000000e9,
-	0x00010c92, 0x00010cd2, 0x000013a2, 0x0000ab72,
-	0x0000a662, 0x0000a663, 0x000013b3, 0x0000ab83,
-	0x00002c28, 0x00002c58, 0x000003e2, 0x000003e3,
-	0x000013c0, 0x0000ab90, 0x00000502, 0x00000503,
-	0x0000ff2b, 0x0000ff4b, 0x0000a7f5, 0x0000a7f6,
-	0x00000510, 0x00000511, 0x00001fbb, 0x00001f71,
-	0x00010427, 0x0001044f, 0x00001fac, 0x00001fa4,
-	0x00010c9f, 0x00010cdf, 0x00001fa9, 0x00001fa1,
-	0x000013c3, 0x0000ab93, 0x00000548, 0x00000578,
-	0x00010ca8, 0x00010ce8, 0x000001ee, 0x000001ef,
-	0x00001f39, 0x00001f31, 0x000013aa, 0x0000ab7a,
-	0x0000a760, 0x0000a761, 0x000003a5, 0x000003c5,
-	0x00000414, 0x00000434, 0x00000388, 0x000003ad,
-	0x000010c3, 0x00002d23, 0x000004fe, 0x000004ff,
-	0x00001f6e, 0x00001f66, 0x0000ff36, 0x0000ff56,
-	0x000010bb, 0x00002d1b, 0x00010574, 0x0001059b,
-	0x0000010e, 0x0000010f, 0x0000047a, 0x0000047b,
-	0x0001e918, 0x0001e93a, 0x00001f6d, 0x00001f65,
-	0x0001e90c, 0x0001e92e, 0x000000db, 0x000000fb,
-	0x0000a758, 0x0000a759, 0x000013db, 0x0000abab,
-	0x00000046, 0x00000066, 0x00000057, 0x00000077,
-	0x0001057a, 0x000105a1, 0x00001fb9, 0x00001fb1,
-	0x000000c8, 0x000000e8, 0x00000534, 0x00000564,
-	0x0000216f, 0x0000217f, 0x00000498, 0x00000499,
-	0x00000130, 0x02000142, 0x00002c13, 0x00002c43,
-	0x00010576, 0x0001059d, 0x000013e9, 0x0000abb9,
-	0x000001b8, 0x000001b9, 0x0000a75e, 0x0000a75f,
-	0x00010cab, 0x00010ceb, 0x00001cb0, 0x000010f0,
-	0x00000226, 0x00000227, 0x00000100, 0x00000101,
-	0x00016e50, 0x00016e70, 0x00000547, 0x00000577,
-	0x00002c22, 0x00002c52, 0x000001cb, 0x000001cc,
-	0x000118a6, 0x000118c6, 0x00010595, 0x000105bc,
-	0x0000a74a, 0x0000a74b, 0x00002126, 0x000003c9,
-	0x00001f09, 0x00001f01, 0x00000476, 0x00000477,
-	0x00001eb8, 0x00001eb9, 0x00002165, 0x00002175,
-	0x00010582, 0x000105a9, 0x0000005a, 0x0000007a,
-	0x00001ec6, 0x00001ec7, 0x0000a668, 0x0000a669,
-	0x0000216d, 0x0000217d, 0x0000053b, 0x0000056b,
-	0x00000490, 0x00000491, 0x00001e42, 0x00001e43,
-	0x000013dd, 0x0000abad, 0x00010575, 0x0001059c,
-	0x0000052c, 0x0000052d, 0x00000419, 0x00000439,
-	0x00000190, 0x0000025b, 0x0001e912, 0x0001e934,
-	0x00000220, 0x0000019e, 0x0000a764, 0x0000a765,
-	0x00001e32, 0x00001e33, 0x00001ea2, 0x00001ea3,
-	0x00000399, 0x000003b9, 0x00001fc9, 0x00001f73,
-	0x0001041c, 0x00010444, 0x0000a750, 0x0000a751,
-	0x00001f2a, 0x00001f22, 0x000024b7, 0x000024d1,
-	0x00016e58, 0x00016e78, 0x00001e16, 0x00001e17,
-	0x000010c0, 0x00002d20, 0x0000a7a6, 0x0000a7a7,
-	0x0001058d, 0x000105b4, 0x00001e68, 0x00001e69,
-	0x00000244, 0x00000289, 0x000004b2, 0x000004b3,
-	0x00010586, 0x000105ad, 0x00002c18, 0x00002c48,
-	0x00001feb, 0x00001f7b, 0x0000212b, 0x000000e5,
-	0x00000181, 0x00000253, 0x00001caa, 0x000010ea,
-	0x000013b5, 0x0000ab85, 0x00001cb9, 0x000010f9,
-	0x000118ba, 0x000118da, 0x00000224, 0x00000225,
-	0x0000a642, 0x0000a643, 0x0000a7c0, 0x0000a7c1,
-	0x0000041c, 0x0000043c, 0x000004f4, 0x000004f5,
-	0x0000a7d0, 0x0000a7d1, 0x00001ca3, 0x000010e3,
-	0x00010410, 0x00010438, 0x00000398, 0x000003b8,
-	0x0000a68a, 0x0000a68b, 0x000024bf, 0x000024d9,
-	0x0001058f, 0x000105b6, 0x0000054d, 0x0000057d,
-	0x00000531, 0x00000561, 0x0000a79c, 0x0000a79d,
-	0x0000041e, 0x0000043e, 0x000000c2, 0x000000e2,
-	0x00010ca5, 0x00010ce5, 0x0001057c, 0x000105a3,
-	0x0000ff29, 0x0000ff49, 0x00002c96, 0x00002c97,
-	0x0000047c, 0x0000047d, 0x00001c9f, 0x000010df,
-	0x00001e22, 0x00001e23, 0x000024c6, 0x000024e0,
-	0x000004e0, 0x000004e1, 0x0001e91e, 0x0001e940,
-	0x00010407, 0x0001042f, 0x00001e0a, 0x00001e0b,
-	0x00000462, 0x00000463, 0x00001e26, 0x00001e27,
-	0x000001d3, 0x000001d4, 0x00001e88, 0x00001e89,
-	0x000024c9, 0x000024e3, 0x000010b7, 0x00002d17,
-	0x00010c88, 0x00010cc8, 0x0000ff33, 0x0000ff53,
-	0x0000048e, 0x0000048f, 0x00001e20, 0x00001e21,
-	0x0000ff37, 0x0000ff57, 0x00010cb0, 0x00010cf0,
-	0x000118a1, 0x000118c1, 0x000118b0, 0x000118d0,
-	0x00001c93, 0x000010d3, 0x00016e57, 0x00016e77,
-	0x0000a796, 0x0000a797, 0x000118a8, 0x000118c8,
-	0x00010406, 0x0001042e, 0x0000a79e, 0x0000a79f,
-	0x00010c8c, 0x00010ccc, 0x00002c01, 0x00002c31,
-	0x000003ec, 0x000003ed, 0x00000164, 0x00000165,
-	0x00002cbe, 0x00002cbf, 0x000001f2, 0x000001f3,
-	0x00001e92, 0x00001e93, 0x0000038e, 0x000003cd,
-	0x00000172, 0x00000173, 0x00010403, 0x0001042b,
-	0x00001cbe, 0x000010fe, 0x0000020e, 0x0000020f,
-	0x0000a658, 0x0000a659, 0x00000421, 0x00000441,
-	0x0000041a, 0x0000043a, 0x00001eea, 0x00001eeb,
-	0x00000546, 0x00000576, 0x0001e902, 0x0001e924,
-	0x00010577, 0x0001059e, 0x00001e2a, 0x00001e2b,
-	0x0000a740, 0x0000a741, 0x00002cd0, 0x00002cd1,
-	0x0000015e, 0x0000015f, 0x000013bd, 0x0000ab8d,
-	0x0000a738, 0x0000a739, 0x000104ba, 0x000104e2,
-	0x00001e9e, 0x000000df, 0x0000a7a4, 0x0000a7a5,
-	0x000118ae, 0x000118ce, 0x00000428, 0x00000448,
-	0x000104b2, 0x000104da, 0x000013f3, 0x000013fb,
-	0x00010cad, 0x00010ced, 0x00010587, 0x000105ae,
-	0x000010a8, 0x00002d08, 0x00000158, 0x00000159,
-	0x00001f9b, 0x00001f93, 0x00001e7e, 0x00001e7f,
-	0x00001e58, 0x00001e59, 0x00010ca3, 0x00010ce3,
-	0x0000ff35, 0x0000ff55, 0x000004bc, 0x000004bd,
-	0x0000011a, 0x0000011b, 0x000004a8, 0x000004a9,
-	0x00010c8a, 0x00010cca, 0x000003aa, 0x000003ca,
-	0x00001f48, 0x00001f40, 0x000004e6, 0x000004e7,
-	0x0000a72a, 0x0000a72b, 0x000001b5, 0x000001b6,
-	0x00001ca4, 0x000010e4, 0x000010a1, 0x00002d01,
-	0x0000a7b0, 0x0000029e, 0x00001f9f, 0x00001f97,
-	0x00000049, 0x00000069, 0x00002162, 0x00002172,
-	0x00000179, 0x0000017a, 0x00000210, 0x00000211,
-	0x000024bd, 0x000024d7, 0x000013a0, 0x0000ab70,
-	0x00001c95, 0x000010d5, 0x0001057e, 0x000105a5,
-	0x00002c94, 0x00002c95, 0x0000a76c, 0x0000a76d,
-	0x000104c4, 0x000104ec, 0x0000014a, 0x0000014b,
-	0x00016e41, 0x00016e61, 0x00001e30, 0x00001e31,
-	0x00002cd6, 0x00002cd7, 0x0000050a, 0x0000050b,
-	0x00000422, 0x00000442, 0x00000216, 0x00000217,
-	0x00001e40, 0x00001e41, 0x000013d9, 0x0000aba9,
-	0x000004ec, 0x000004ed, 0x000013a4, 0x0000ab74,
-	0x0000041f, 0x0000043f, 0x00001f4d, 0x00001f45,
-	0x0000ff2a, 0x0000ff4a, 0x0000041d, 0x0000043d,
-	0x0000049a, 0x0000049b, 0x0000a680, 0x0000a681,
-	0x000118a7, 0x000118c7, 0x00000556, 0x00000586,
-	0x00001f29, 0x00001f21, 0x00002c1e, 0x00002c4e,
-	0x000004c0, 0x000004cf, 0x00010401, 0x00010429,
-	0x000010af, 0x00002d0f, 0x000013ba, 0x0000ab8a,
-	0x000001a2, 0x000001a3, 0x000013ee, 0x0000abbe,
-	0x0000a746, 0x0000a747, 0x00000058, 0x00000078,
-	0x00016e47, 0x00016e67, 0x000004ee, 0x000004ef,
-	0x00001cb7, 0x000010f7, 0x0000a7ad, 0x0000026c,
-	0x00002c6d, 0x00000251, 0x000013cb, 0x0000ab9b,
-	0x0001e90f, 0x0001e931, 0x00001ebe, 0x00001ebf,
-	0x000004a0, 0x000004a1, 0x0000a728, 0x0000a729,
-	0x00001cb8, 0x000010f8, 0x00000154, 0x00000155,
-	0x00001fec, 0x00001fe5, 0x0000023d, 0x0000019a,
-	0x000013cf, 0x0000ab9f, 0x00001ca0, 0x000010e0,
-	0x000013e8, 0x0000abb8, 0x000004b0, 0x000004b1,
-	0x00016e5e, 0x00016e7e, 0x00001e8c, 0x00001e8d,
-	0x0000a688, 0x0000a689, 0x000104b7, 0x000104df,
-	0x00001cad, 0x000010ed, 0x0000016e, 0x0000016f,
-	0x000013f4, 0x000013fc, 0x000004b4, 0x000004b5,
-	0x0001040b, 0x00010433, 0x00001e52, 0x00001e53,
-	0x000001c8, 0x000001c9, 0x000010c7, 0x00002d27,
-	0x00000500, 0x00000501, 0x00001ea6, 0x00001ea7,
-	0x0000a652, 0x0000a653, 0x00002161, 0x00002171,
-	0x00000429, 0x00000449, 0x00002c7e, 0x0000023f,
-	0x000013c8, 0x0000ab98, 0x00010572, 0x00010599,
-	0x00001f28, 0x00001f20
+	0x00002cac, 0x00002cad, 0x00001e78, 0x00001e79,
+	0x0000042d, 0x0000044d, 0x0000023d, 0x0000019a,
+	0x00002169, 0x00002179, 0x00001fb9, 0x00001fb1,
+	0x000013e9, 0x0000abb9, 0x000001a9, 0x00000283,
+	0x000001c4, 0x000001c6, 0x000000c5, 0x000000e5,
+	0x00000230, 0x00000231, 0x00000372, 0x00000373,
+	0x00000232, 0x00000233, 0x00000053, 0x00000073,
+	0x0000018a, 0x00000257, 0x00001ec0, 0x00001ec1,
+	0x0000046c, 0x0000046d, 0x00010ca1, 0x00010ce1,
+	0x00000536, 0x00000566, 0x00001e32, 0x00001e33,
+	0x00010d59, 0x00010d79, 0x00001ec4, 0x00001ec5,
+	0x00000200, 0x00000201, 0x000013bd, 0x0000ab8d,
+	0x00001f48, 0x00001f40, 0x00000423, 0x00000443,
+	0x00002c07, 0x00002c37, 0x000104bc, 0x000104e4,
+	0x000013af, 0x0000ab7f, 0x00010caa, 0x00010cea,
+	0x000004a8, 0x000004a9, 0x000024bf, 0x000024d9,
+	0x000000d0, 0x000000f0, 0x00001e42, 0x00001e43,
+	0x00010577, 0x0001059e, 0x00001e1a, 0x00001e1b,
+	0x0000a750, 0x0000a751, 0x000000dd, 0x000000fd,
+	0x00002c0c, 0x00002c3c, 0x0001e91b, 0x0001e93d,
+	0x00002126, 0x000003c9, 0x00016e41, 0x00016e61,
+	0x000010b4, 0x00002d14, 0x000001b3, 0x000001b4,
+	0x00000050, 0x00000070, 0x00000122, 0x00000123,
+	0x00000427, 0x00000447, 0x000013f5, 0x000013fd,
+	0x00001e60, 0x00001e61, 0x00010c92, 0x00010cd2,
+	0x00001f0a, 0x00001f02, 0x0000a662, 0x0000a663,
+	0x0000040d, 0x0000045d, 0x000013d4, 0x0000aba4,
+	0x000013ec, 0x0000abbc, 0x0000012e, 0x0000012f,
+	0x00001ec8, 0x00001ec9, 0x00000498, 0x00000499,
+	0x00001e22, 0x00001e23, 0x00010574, 0x0001059b,
+	0x0000ff25, 0x0000ff45, 0x00000535, 0x00000565,
+	0x000001e4, 0x000001e5, 0x000104b0, 0x000104d8,
+	0x00000386, 0x000003ac, 0x000013ed, 0x0000abbd,
+	0x00002c72, 0x00002c73, 0x000118a8, 0x000118c8,
+	0x000003e0, 0x000003e1, 0x00010412, 0x0001043a,
+	0x0000048a, 0x0000048b, 0x000013ee, 0x0000abbe,
+	0x000000c0, 0x000000e0, 0x0001058f, 0x000105b6,
+	0x0000016a, 0x0000016b, 0x0000a646, 0x0000a647,
+	0x00000206, 0x00000207, 0x00000399, 0x000003b9,
+	0x00002c17, 0x00002c47, 0x0000a79a, 0x0000a79b,
+	0x000013b1, 0x0000ab81, 0x00002c9a, 0x00002c9b,
+	0x00000428, 0x00000448, 0x000010bd, 0x00002d1d,
+	0x0000053d, 0x0000056d, 0x00002166, 0x00002176,
+	0x00000170, 0x00000171, 0x00010c9c, 0x00010cdc,
+	0x000001a0, 0x000001a1, 0x0001057d, 0x000105a4,
+	0x00002c29, 0x00002c59, 0x00010c8b, 0x00010ccb,
+	0x00000051, 0x00000071, 0x00001f88, 0x00001f80,
+	0x000013e6, 0x0000abb6, 0x000024b8, 0x000024d2,
+	0x000004b8, 0x000004b9, 0x00016e56, 0x00016e76,
+	0x00010586, 0x000105ad, 0x000013d7, 0x0000aba7,
+	0x000013cf, 0x0000ab9f, 0x0000011e, 0x0000011f,
+	0x00000043, 0x00000063, 0x000001c8, 0x000001c9,
+	0x000010a9, 0x00002d09, 0x000001d3, 0x000001d4,
+	0x000004cb, 0x000004cc, 0x00002c60, 0x00002c61,
+	0x0000a724, 0x0000a725, 0x00002cda, 0x00002cdb,
+	0x000024ca, 0x000024e4, 0x00000470, 0x00000471,
+	0x000000db, 0x000000fb, 0x0000051a, 0x0000051b,
+	0x00000516, 0x00000517, 0x0001057a, 0x000105a1,
+	0x00000224, 0x00000225, 0x000001e8, 0x000001e9,
+	0x000010ba, 0x00002d1a, 0x0000a78d, 0x00000265,
+	0x000013c4, 0x0000ab94, 0x0001e905, 0x0001e927,
+	0x000013c3, 0x0000ab93, 0x000003e4, 0x000003e5,
+	0x000003ec, 0x000003ed, 0x00010415, 0x0001043d,
+	0x0000046a, 0x0000046b, 0x00010422, 0x0001044a,
+	0x00001ffb, 0x00001f7d, 0x0001e906, 0x0001e928,
+	0x00001ee0, 0x00001ee1, 0x00000208, 0x00000209,
+	0x0000a686, 0x0000a687, 0x00001e00, 0x00001e01,
+	0x000013ac, 0x0000ab7c, 0x000013b8, 0x0000ab88,
+	0x0000ff38, 0x0000ff58, 0x0000039d, 0x000003bd,
+	0x00000422, 0x00000442, 0x000004e0, 0x000004e1,
+	0x00001cba, 0x000010fa, 0x00001cb3, 0x000010f3,
+	0x00001e6c, 0x00001e6d, 0x0000a684, 0x0000a685,
+	0x00010c8d, 0x00010ccd, 0x0000a72e, 0x0000a72f,
+	0x0000022c, 0x0000022d, 0x00001f9a, 0x00001f92,
+	0x00000395, 0x000003b5, 0x00000114, 0x00000115,
+	0x00001f8d, 0x00001f85, 0x00001c9a, 0x000010da,
+	0x00000198, 0x00000199, 0x000013ce, 0x0000ab9e,
+	0x00010c8f, 0x00010ccf, 0x00010588, 0x000105af,
+	0x00010401, 0x00010429, 0x000004e8, 0x000004e9,
+	0x00000396, 0x000003b6, 0x00001e5c, 0x00001e5d,
+	0x0000a728, 0x0000a729, 0x00000193, 0x00000260,
+	0x00001cac, 0x000010ec, 0x000024c9, 0x000024e3,
+	0x00002c69, 0x00002c6a, 0x00010c9f, 0x00010cdf,
+	0x0000a7c0, 0x0000a7c1, 0x0000a722, 0x0000a723,
+	0x00000534, 0x00000564, 0x0000a754, 0x0000a755,
+	0x000104b6, 0x000104de, 0x000118b0, 0x000118d0,
+	0x00000214, 0x00000215, 0x00001f1c, 0x00001f14,
+	0x00001e50, 0x00001e51, 0x00010c90, 0x00010cd0,
+	0x000001b5, 0x000001b6, 0x00000510, 0x00000511,
+	0x0000a64c, 0x0000a64d, 0x0000004e, 0x0000006e,
+	0x000118ab, 0x000118cb, 0x000118b3, 0x000118d3,
+	0x000104b9, 0x000104e1, 0x000001a2, 0x000001a3,
+	0x00001e3e, 0x00001e3f, 0x00001f99, 0x00001f91,
+	0x00000220, 0x0000019e, 0x00001fcb, 0x00001f75,
+	0x00002cde, 0x00002cdf, 0x000013e1, 0x0000abb1,
+	0x000013cc, 0x0000ab9c, 0x000001d7, 0x000001d8,
+	0x00000389, 0x000003ae, 0x000010af, 0x00002d0f,
+	0x0000a66c, 0x0000a66d, 0x000004f2, 0x000004f3,
+	0x00001ca5, 0x000010e5, 0x000004f4, 0x000004f5,
+	0x0000a68a, 0x0000a68b, 0x00001eaa, 0x00001eab,
+	0x0000021a, 0x0000021b, 0x0000a7be, 0x0000a7bf,
+	0x0000038f, 0x000003ce, 0x0000a79e, 0x0000a79f,
+	0x0000ff31, 0x0000ff51, 0x000010b5, 0x00002d15,
+	0x00016e55, 0x00016e75, 0x000010a8, 0x00002d08,
+	0x00010c9d, 0x00010cdd, 0x000104cc, 0x000104f4,
+	0x00000112, 0x00000113, 0x0000a654, 0x0000a655,
+	0x0000a7ba, 0x0000a7bb, 0x0000a7b3, 0x0000ab53,
+	0x000013e3, 0x0000abb3, 0x00000412, 0x00000432,
+	0x00001efa, 0x00001efb, 0x0000a7ad, 0x0000026c,
+	0x0001e920, 0x0001e942, 0x00016e58, 0x00016e78,
+	0x00001cbd, 0x000010fd, 0x00000490, 0x00000491,
+	0x00010ca7, 0x00010ce7, 0x00001e2c, 0x00001e2d,
+	0x00001e56, 0x00001e57, 0x0000a75e, 0x0000a75f,
+	0x00001f1d, 0x00001f15, 0x00010576, 0x0001059d,
+	0x00002c20, 0x00002c50, 0x000013a2, 0x0000ab72,
+	0x00002cbc, 0x00002cbd, 0x000024c1, 0x000024db,
+	0x0000042b, 0x0000044b, 0x00002c21, 0x00002c51,
+	0x0000216e, 0x0000217e, 0x00002c8a, 0x00002c8b,
+	0x00001ff9, 0x00001f79, 0x00000544, 0x00000574,
+	0x0000a688, 0x0000a689, 0x000001d1, 0x000001d2,
+	0x0000020a, 0x0000020b, 0x00001cb5, 0x000010f5,
+	0x00002c24, 0x00002c54, 0x0000a7d8, 0x0000a7d9,
+	0x0000053f, 0x0000056f, 0x0000041d, 0x0000043d,
+	0x00016e47, 0x00016e67, 0x000118b9, 0x000118d9,
+	0x000010b8, 0x00002d18, 0x000013b3, 0x0000ab83,
+	0x000024cd, 0x000024e7, 0x00002c84, 0x00002c85,
+	0x000001f8, 0x000001f9, 0x000104ce, 0x000104f6,
+	0x00001f3e, 0x00001f36, 0x0000024a, 0x0000024b,
+	0x00001fe8, 0x00001fe0, 0x00001fc8, 0x00001f72,
+	0x0000a782, 0x0000a783, 0x000013bf, 0x0000ab8f,
+	0x000024c0, 0x000024da, 0x0000047c, 0x0000047d,
+	0x00002c92, 0x00002c93, 0x00010c99, 0x00010cd9,
+	0x00001e66, 0x00001e67, 0x00002c2d, 0x00002c5d,
+	0x00010402, 0x0001042a, 0x000001f6, 0x00000195,
+	0x000010c2, 0x00002d22, 0x00010ca6, 0x00010ce6,
+	0x0001e913, 0x0001e935, 0x00002cae, 0x00002caf,
+	0x000118aa, 0x000118ca, 0x00001cbe, 0x000010fe,
+	0x0000004a, 0x0000006a, 0x0001040d, 0x00010435,
+	0x000004ae, 0x000004af, 0x000000d4, 0x000000f4,
+	0x00000522, 0x00000523, 0x0000a65a, 0x0000a65b,
+	0x00001e0c, 0x00001e0d, 0x00000228, 0x00000229,
+	0x00010c8c, 0x00010ccc, 0x00001feb, 0x00001f7b,
+	0x0000a79c, 0x0000a79d, 0x0001e903, 0x0001e925,
+	0x00002ca0, 0x00002ca1, 0x0000054b, 0x0000057b,
+	0x000024bd, 0x000024d7, 0x000004d0, 0x000004d1,
+	0x0000216c, 0x0000217c, 0x00000164, 0x00000165,
+	0x00000468, 0x00000469, 0x0000a682, 0x0000a683,
+	0x0000a7c5, 0x00000282, 0x0000a72c, 0x0000a72d,
+	0x000013a1, 0x0000ab71, 0x000004bc, 0x000004bd,
+	0x00000393, 0x000003b3, 0x00002165, 0x00002175,
+	0x00002cd2, 0x00002cd3, 0x00016e49, 0x00016e69,
+	0x00002c23, 0x00002c53, 0x000118b4, 0x000118d4,
+	0x00010d52, 0x00010d72, 0x00000174, 0x00000175,
+	0x00016e4a, 0x00016e6a, 0x000001a6, 0x00000280,
+	0x00000388, 0x000003ad, 0x000010a5, 0x00002d05,
+	0x000000cf, 0x000000ef, 0x00001ece, 0x00001ecf,
+	0x00001faa, 0x00001fa2, 0x00000162, 0x00000163,
+	0x00002c67, 0x00002c68, 0x00000409, 0x00000459,
+	0x0000041c, 0x0000043c, 0x000001c7, 0x000001c9,
+	0x00000520, 0x00000521, 0x00001e72, 0x00001e73,
+	0x00000549, 0x00000579, 0x00001ed6, 0x00001ed7,
+	0x00002ce2, 0x00002ce3, 0x00000244, 0x00000289,
+	0x0000a78b, 0x0000a78c, 0x00000506, 0x00000507,
+	0x000003a1, 0x000003c1, 0x000118bf, 0x000118df,
+	0x000004fc, 0x000004fd, 0x0000ff35, 0x0000ff55,
+	0x0001040b, 0x00010433, 0x000118a9, 0x000118c9,
+	0x00000552, 0x00000582, 0x00001e54, 0x00001e55,
+	0x00002c15, 0x00002c45, 0x00001ed2, 0x00001ed3,
+	0x00001e80, 0x00001e81, 0x0000a650, 0x0000a651,
+	0x00001f9c, 0x00001f94, 0x00001cbf, 0x000010ff,
+	0x000013a6, 0x0000ab76, 0x00001faf, 0x00001fa7,
+	0x0000ff39, 0x0000ff59, 0x00001e58, 0x00001e59,
+	0x00000494, 0x00000495, 0x00000136, 0x00000137,
+	0x00001ca3, 0x000010e3, 0x000104c1, 0x000104e9,
+	0x00001e62, 0x00001e63, 0x00001c9f, 0x000010df,
+	0x0000a7b1, 0x00000287, 0x0000a75c, 0x0000a75d,
+	0x00001fca, 0x00001f74, 0x0000a65c, 0x0000a65d,
+	0x00002c75, 0x00002c76, 0x0000039e, 0x000003be,
+	0x00001c9c, 0x000010dc, 0x0000a7c4, 0x0000a794,
+	0x00002c64, 0x0000027d, 0x00002c2b, 0x00002c5b,
+	0x00000130, 0x02000142, 0x00001e12, 0x00001e13,
+	0x000001fc, 0x000001fd, 0x00010d54, 0x00010d74,
+	0x0000a76e, 0x0000a76f, 0x00000414, 0x00000434,
+	0x00001fe9, 0x00001fe1, 0x00002ce0, 0x00002ce1,
+	0x00010414, 0x0001043c, 0x000118b2, 0x000118d2,
+	0x000004d8, 0x000004d9, 0x000004a2, 0x000004a3,
+	0x000000c2, 0x000000e2, 0x0001041e, 0x00010446,
+	0x00001e30, 0x00001e31, 0x00010d5f, 0x00010d7f,
+	0x0000022a, 0x0000022b, 0x00010572, 0x00010599,
+	0x0000020c, 0x0000020d, 0x0000a7ae, 0x0000026a,
+	0x0001057c, 0x000105a3, 0x00002c9e, 0x00002c9f,
+	0x00001e1e, 0x00001e1f, 0x00001f2b, 0x00001f23,
+	0x0000018f, 0x00000259, 0x0000216a, 0x0000217a,
+	0x00001eac, 0x00001ead, 0x000104d3, 0x000104fb,
+	0x0000a694, 0x0000a695, 0x00000190, 0x0000025b,
+	0x00001f0c, 0x00001f04, 0x00000212, 0x00000213,
+	0x00001f8c, 0x00001f84, 0x0000a7d6, 0x0000a7d7,
+	0x00001cb9, 0x000010f9, 0x000024bc, 0x000024d6,
+	0x00001c97, 0x000010d7, 0x000010c0, 0x00002d20,
+	0x00001f2f, 0x00001f27, 0x00001f5d, 0x00001f55,
+	0x00010425, 0x0001044d, 0x00010c81, 0x00010cc1,
+	0x000104cf, 0x000104f7, 0x00010587, 0x000105ae,
+	0x0001040c, 0x00010434, 0x0000a760, 0x0000a761,
+	0x000013c2, 0x0000ab92, 0x00001eae, 0x00001eaf,
+	0x000004ba, 0x000004bb, 0x0001e914, 0x0001e936,
+	0x0000ff26, 0x0000ff46, 0x00000411, 0x00000431,
+	0x000003ff, 0x0000037d, 0x0000051e, 0x0000051f,
+	0x0000016c, 0x0000016d, 0x000118a2, 0x000118c2,
+	0x000010ab, 0x00002d0b, 0x00010c85, 0x00010cc5,
+	0x00001f39, 0x00001f31, 0x0000a779, 0x0000a77a,
+	0x0001e915, 0x0001e937, 0x00002cc6, 0x00002cc7,
+	0x00001cb1, 0x000010f1, 0x000003e6, 0x000003e7,
+	0x0000004c, 0x0000006c, 0x00010417, 0x0001043f,
+	0x000004de, 0x000004df, 0x000104bf, 0x000104e7,
+	0x00001e70, 0x00001e71, 0x0000a64e, 0x0000a64f,
+	0x0000a642, 0x0000a643, 0x000013f4, 0x000013fc,
+	0x000010ae, 0x00002d0e, 0x00001e04, 0x00001e05,
+	0x0000a796, 0x0000a797, 0x00002ca6, 0x00002ca7,
+	0x00002cb6, 0x00002cb7, 0x00000533, 0x00000563,
+	0x00000512, 0x00000513, 0x00002c6f, 0x00000250,
+	0x00002168, 0x00002178, 0x0000a7aa, 0x00000266,
+	0x00000462, 0x00000463, 0x000001f4, 0x000001f5,
+	0x00002167, 0x00002177, 0x00001f4a, 0x00001f42,
+	0x0000a758, 0x0000a759, 0x00002ca4, 0x00002ca5,
+	0x0001e916, 0x0001e938, 0x00002c2f, 0x00002c5f,
+	0x000024ba, 0x000024d4, 0x00001cae, 0x000010ee,
+	0x0000004f, 0x0000006f, 0x00001ca9, 0x000010e9,
+	0x0000a656, 0x0000a657, 0x00000391, 0x000003b1,
+	0x00000120, 0x00000121, 0x00000508, 0x00000509,
+	0x000001ca, 0x000001cc, 0x00010418, 0x00010440,
+	0x0000a748, 0x0000a749, 0x00001efc, 0x00001efd,
+	0x00001eb8, 0x00001eb9, 0x00010ca4, 0x00010ce4,
+	0x00000179, 0x0000017a, 0x00000056, 0x00000076,
+	0x00000472, 0x00000473, 0x00010416, 0x0001043e,
+	0x00010c9b, 0x00010cdb, 0x0001058e, 0x000105b5,
+	0x00010d63, 0x00010d83, 0x00001ed4, 0x00001ed5,
+	0x00001ef8, 0x00001ef9, 0x00001e7c, 0x00001e7d,
+	0x00001f69, 0x00001f61, 0x0001e921, 0x0001e943,
+	0x000003a8, 0x000003c8, 0x00001fbb, 0x00001f71,
+	0x00001fda, 0x00001f76, 0x00000041, 0x00000061,
+	0x0001040f, 0x00010437, 0x0000048e, 0x0000048f,
+	0x00000059, 0x00000079, 0x00000528, 0x00000529,
+	0x00010d64, 0x00010d84, 0x00001e3c, 0x00001e3d,
+	0x00000419, 0x00000439, 0x00001f3b, 0x00001f33,
+	0x000013f0, 0x000013f8, 0x0000a7f5, 0x0000a7f6,
+	0x000013dc, 0x0000abac, 0x00002cba, 0x00002cbb,
+	0x00000464, 0x00000465, 0x00000166, 0x00000167,
+	0x00001ca6, 0x000010e6, 0x00010578, 0x0001059f,
+	0x00001fd9, 0x00001fd1, 0x0000054c, 0x0000057c,
+	0x00001e68, 0x00001e69, 0x0000a690, 0x0000a691,
+	0x0000a7b8, 0x0000a7b9, 0x0000a73a, 0x0000a73b,
+	0x00001fbc, 0x00001fb3, 0x00001c93, 0x000010d3,
+	0x000004c0, 0x000004cf, 0x00001ca2, 0x000010e2,
+	0x00001c96, 0x000010d6, 0x000010c4, 0x00002d24,
+	0x000000da, 0x000000fa, 0x000004e6, 0x000004e7,
+	0x00000397, 0x000003b7, 0x00000531, 0x00000561,
+	0x00001e94, 0x00001e95, 0x000013c8, 0x0000ab98,
+	0x0000018b, 0x0000018c, 0x0001e90d, 0x0001e92f,
+	0x00002c70, 0x00000252, 0x000010a0, 0x00002d00,
+	0x000010ad, 0x00002d0d, 0x00001ea8, 0x00001ea9,
+	0x000001f1, 0x000001f3, 0x000010a2, 0x00002d02,
+	0x000000c8, 0x000000e8, 0x0000053a, 0x0000056a,
+	0x00001e36, 0x00001e37, 0x0000013d, 0x0000013e,
+	0x0000021c, 0x0000021d, 0x0001058d, 0x000105b4,
+	0x00002c12, 0x00002c42, 0x000013ab, 0x0000ab7b,
+	0x00000370, 0x00000371, 0x00010592, 0x000105b9,
+	0x00000545, 0x00000575, 0x0000a77b, 0x0000a77c,
+	0x0000ff2b, 0x0000ff4b, 0x00001fac, 0x00001fa4,
+	0x00001f19, 0x00001f11, 0x000104b7, 0x000104df,
+	0x00001e46, 0x00001e47, 0x00010584, 0x000105ab,
+	0x00000514, 0x00000515, 0x0000a73c, 0x0000a73d,
+	0x00001fcc, 0x00001fc3, 0x00002c0e, 0x00002c3e,
+	0x0001e91e, 0x0001e940, 0x00002cc8, 0x00002cc9,
+	0x0000ff34, 0x0000ff54, 0x0000ff2a, 0x0000ff4a,
+	0x000118ba, 0x000118da, 0x0000047a, 0x0000047b,
+	0x00010423, 0x0001044b, 0x00000132, 0x00000133,
+	0x000104cd, 0x000104f5, 0x000001fe, 0x000001ff,
+	0x00000504, 0x00000505, 0x0000a756, 0x0000a757,
+	0x00010ca0, 0x00010ce0, 0x0000a786, 0x0000a787,
+	0x00001f5b, 0x00001f53, 0x000013ea, 0x0000abba,
+	0x00002cf2, 0x00002cf3, 0x0000047e, 0x0000047f,
+	0x00000408, 0x00000458, 0x00016e46, 0x00016e66,
+	0x00000176, 0x00000177, 0x0000041a, 0x0000043a,
+	0x00002c1b, 0x00002c4b, 0x000001e6, 0x000001e7,
+	0x00001e0e, 0x00001e0f, 0x000024c3, 0x000024dd,
+	0x0000a764, 0x0000a765, 0x000004c7, 0x000004c8,
+	0x00001cb8, 0x000010f8, 0x000013d5, 0x0000aba5,
+	0x0000038a, 0x000003af, 0x00000417, 0x00000437,
+	0x00001ebe, 0x00001ebf, 0x00000548, 0x00000578,
+	0x00010ca9, 0x00010ce9, 0x00001ee6, 0x00001ee7,
+	0x0000a644, 0x0000a645, 0x000003a0, 0x000003c0,
+	0x0001057f, 0x000105a6, 0x00002cc2, 0x00002cc3,
+	0x000013b0, 0x0000ab80, 0x000013be, 0x0000ab8e,
+	0x00002cbe, 0x00002cbf, 0x00000426, 0x00000446,
+	0x0000054d, 0x0000057d, 0x000013a3, 0x0000ab73,
+	0x0001041d, 0x00010445, 0x000000c9, 0x000000e9,
+	0x00010c89, 0x00010cc9, 0x00000401, 0x00000451,
+	0x00010571, 0x00010598, 0x00001f49, 0x00001f41,
+	0x0000a732, 0x0000a733, 0x00001fa8, 0x00001fa0,
+	0x00001e7a, 0x00001e7b, 0x0000012a, 0x0000012b,
+	0x000024be, 0x000024d8, 0x00001e18, 0x00001e19,
+	0x000004f8, 0x000004f9, 0x0000010a, 0x0000010b,
+	0x000004b2, 0x000004b3, 0x00002163, 0x00002173,
+	0x000010a1, 0x00002d01, 0x000104c3, 0x000104eb,
+	0x000001ec, 0x000001ed, 0x0000020e, 0x0000020f,
+	0x0000a746, 0x0000a747, 0x00000403, 0x00000453,
+	0x00000241, 0x00000242, 0x00001e16, 0x00001e17,
+	0x000003ea, 0x000003eb, 0x00000055, 0x00000075,
+	0x00000476, 0x00000477, 0x000013ef, 0x0000abbf,
+	0x000010c7, 0x00002d27, 0x00000154, 0x00000155,
+	0x00000145, 0x00000146, 0x000001a7, 0x000001a8,
+	0x00000126, 0x00000127, 0x000004be, 0x000004bf,
+	0x0000a7a0, 0x0000a7a1, 0x000010a6, 0x00002d06,
+	0x000024bb, 0x000024d5, 0x00001eca, 0x00001ecb,
+	0x000010b7, 0x00002d17, 0x00001c99, 0x000010d9,
+	0x000118af, 0x000118cf, 0x0000049e, 0x0000049f,
+	0x000000d6, 0x000000f6, 0x00010585, 0x000105ac,
+	0x00010d61, 0x00010d81, 0x00001e84, 0x00001e85,
+	0x00001ef0, 0x00001ef1, 0x0000ff21, 0x0000ff41,
+	0x00001ca7, 0x000010e7, 0x0000a7a4, 0x0000a7a5,
+	0x000013bc, 0x0000ab8c, 0x0000ff32, 0x0000ff52,
+	0x00002c1a, 0x00002c4a, 0x000013d9, 0x0000aba9,
+	0x000004d2, 0x000004d3, 0x00002c6d, 0x00000251,
+	0x00010403, 0x0001042b, 0x00000550, 0x00000580,
+	0x0000a664, 0x0000a665, 0x00001f08, 0x00001f00,
+	0x0000a740, 0x0000a741, 0x00000466, 0x00000467,
+	0x00001f98, 0x00001f90, 0x00002c04, 0x00002c34,
+	0x00002cca, 0x00002ccb, 0x000013dd, 0x0000abad,
+	0x0000042e, 0x0000044e, 0x00000424, 0x00000444,
+	0x0000039a, 0x000003ba, 0x000104c8, 0x000104f0,
+	0x00000152, 0x00000153, 0x00010406, 0x0001042e,
+	0x00001e90, 0x00001e91, 0x0000a692, 0x0000a693,
+	0x00001f4b, 0x00001f43, 0x0000a74c, 0x0000a74d,
+	0x00002c02, 0x00002c32, 0x00002c62, 0x0000026b,
+	0x000003fa, 0x000003fb, 0x00000245, 0x0000028c,
+	0x00001c91, 0x000010d1, 0x00000474, 0x00000475,
+	0x00010cb0, 0x00010cf0, 0x00010413, 0x0001043b,
+	0x000001f7, 0x000001bf, 0x00010420, 0x00010448,
+	0x00001eda, 0x00001edb, 0x000104ca, 0x000104f2,
+	0x000013cb, 0x0000ab9b, 0x0000a790, 0x0000a791,
+	0x00016e5c, 0x00016e7c, 0x00002c98, 0x00002c99,
+	0x00010c94, 0x00010cd4, 0x000003a7, 0x000003c7,
+	0x0000004b, 0x0000006b, 0x000118a1, 0x000118c1,
+	0x00001f6b, 0x00001f63, 0x00010cb2, 0x00010cf2,
+	0x00001e44, 0x00001e45, 0x000104c0, 0x000104e8,
+	0x00001eee, 0x00001eef, 0x0000023a, 0x00002c65,
+	0x000104c6, 0x000104ee, 0x00002c26, 0x00002c56,
+	0x0000040e, 0x0000045e, 0x0000038e, 0x000003cd,
+	0x00001ca0, 0x000010e0, 0x0000ff2f, 0x0000ff4f,
+	0x00001e14, 0x00001e15, 0x000004e2, 0x000004e3,
+	0x0000040a, 0x0000045a, 0x0000011c, 0x0000011d,
+	0x0000053e, 0x0000056e, 0x00001e5e, 0x00001e5f,
+	0x00001f3a, 0x00001f32, 0x00016e50, 0x00016e70,
+	0x0000a7ac, 0x00000261, 0x000104c4, 0x000104ec,
+	0x0000a65e, 0x0000a65f, 0x0000216d, 0x0000217d,
+	0x000024cc, 0x000024e6, 0x00016e54, 0x00016e74,
+	0x000000c6, 0x000000e6, 0x00000518, 0x00000519,
+	0x00001fad, 0x00001fa5, 0x00000524, 0x00000525,
+	0x0000053c, 0x0000056c, 0x00001ea2, 0x00001ea3,
+	0x00002c88, 0x00002c89, 0x00001f4c, 0x00001f44,
+	0x0000a76a, 0x0000a76b, 0x00002c7e, 0x0000023f,
+	0x000000d9, 0x000000f9, 0x00001ca8, 0x000010e8,
+	0x00016e44, 0x00016e64, 0x000004a6, 0x000004a7,
+	0x000118a3, 0x000118c3, 0x00010cad, 0x00010ced,
+	0x0000052c, 0x0000052d, 0x0000015e, 0x0000015f,
+	0x0000a7bc, 0x0000a7bd, 0x00002c09, 0x00002c39,
+	0x000004dc, 0x000004dd, 0x0000a7a6, 0x0000a7a7,
+	0x000013b4, 0x0000ab84, 0x000001db, 0x000001dc,
+	0x00016e4f, 0x00016e6f, 0x00000406, 0x00000456,
+	0x00000147, 0x00000148, 0x00000058, 0x00000078,
+	0x00002c19, 0x00002c49, 0x00000102, 0x00000103,
+	0x0001040a, 0x00010432, 0x000001ac, 0x000001ad,
+	0x000001a4, 0x000001a5, 0x0000017b, 0x0000017c,
+	0x0000a73e, 0x0000a73f, 0x000013bb, 0x0000ab8b,
+	0x00002c2c, 0x00002c5c, 0x000013c0, 0x0000ab90,
+	0x00001c95, 0x000010d5, 0x00001c90, 0x000010d0,
+	0x00016e40, 0x00016e60, 0x000010b2, 0x00002d12,
+	0x000118b5, 0x000118d5, 0x0000a68c, 0x0000a68d,
+	0x000004fe, 0x000004ff, 0x00001e8e, 0x00001e8f,
+	0x0000053b, 0x0000056b, 0x00001f38, 0x00001f30,
+	0x00001f3f, 0x00001f37, 0x00001eb4, 0x00001eb5,
+	0x000003a4, 0x000003c4, 0x0001e90e, 0x0001e930,
+	0x0000ff23, 0x0000ff43, 0x000024c4, 0x000024de,
+	0x000004b4, 0x000004b5, 0x000000d2, 0x000000f2,
+	0x000010c5, 0x00002d25, 0x00000460, 0x00000461,
+	0x0000015a, 0x0000015b, 0x00001ea6, 0x00001ea7,
+	0x00000118, 0x00000119, 0x00010591, 0x000105b8,
+	0x0000023b, 0x0000023c, 0x0000a77e, 0x0000a77f,
+	0x0001e912, 0x0001e934, 0x000024cf, 0x000024e9,
+	0x000003e8, 0x000003e9, 0x00000044, 0x00000064,
+	0x000004ac, 0x000004ad, 0x000024b7, 0x000024d1,
+	0x000000cc, 0x000000ec, 0x0000a7ab, 0x0000025c,
+	0x0000019f, 0x00000275, 0x000010c3, 0x00002d23,
+	0x0000a7b4, 0x0000a7b5, 0x00001ffa, 0x00001f7c,
+	0x000013a5, 0x0000ab75, 0x0000041e, 0x0000043e,
+	0x000013ba, 0x0000ab8a, 0x00016e51, 0x00016e71,
+	0x00016e43, 0x00016e63, 0x00001f8b, 0x00001f83,
+	0x00002183, 0x00002184, 0x000104bd, 0x000104e5,
+	0x00000191, 0x00000192, 0x00000539, 0x00000569,
+	0x00001e64, 0x00001e65, 0x00016e52, 0x00016e72,
+	0x00000143, 0x00000144, 0x0000a738, 0x0000a739,
+	0x00001fb8, 0x00001fb0, 0x00001f2c, 0x00001f24,
+	0x000013de, 0x0000abae, 0x00010c84, 0x00010cc4,
+	0x00001f9f, 0x00001f97, 0x00001f0f, 0x00001f07,
+	0x00010c91, 0x00010cd1, 0x00001e28, 0x00001e29,
+	0x0000013b, 0x0000013c, 0x0000a64a, 0x0000a64b,
+	0x000001bc, 0x000001bd, 0x000013d2, 0x0000aba2,
+	0x0000a762, 0x0000a763, 0x000013b2, 0x0000ab82,
+	0x00002c0a, 0x00002c3a, 0x00001f1b, 0x00001f13,
+	0x000001af, 0x000001b0, 0x00001ca1, 0x000010e1,
+	0x0001e918, 0x0001e93a, 0x0000216f, 0x0000217f,
+	0x000000c4, 0x000000e4, 0x00000538, 0x00000568,
+	0x00000172, 0x00000173, 0x00010d57, 0x00010d77,
+	0x00000218, 0x00000219, 0x000118ae, 0x000118ce,
+	0x00010581, 0x000105a8, 0x00001f2e, 0x00001f26,
+	0x000001b7, 0x00000292, 0x00000187, 0x00000188,
+	0x0000040b, 0x0000045b, 0x000010be, 0x00002d1e,
+	0x00002162, 0x00002172, 0x000118ad, 0x000118cd,
+	0x0001e907, 0x0001e929, 0x000104b1, 0x000104d9,
+	0x00001e26, 0x00001e27, 0x00010575, 0x0001059c,
+	0x00016e5e, 0x00016e7e, 0x00001ef4, 0x00001ef5,
+	0x00001caa, 0x000010ea, 0x00002c08, 0x00002c38,
+	0x00016e5a, 0x00016e7a, 0x000003cf, 0x000003d7,
+	0x00016e53, 0x00016e73, 0x000013c9, 0x0000ab99,
+	0x00001e8a, 0x00001e8b, 0x0000a7cc, 0x0000a7cd,
+	0x00000042, 0x00000062, 0x00002c03, 0x00002c33,
+	0x000104c5, 0x000104ed, 0x00001e6e, 0x00001e6f,
+	0x00001f1a, 0x00001f12, 0x00001f18, 0x00001f10,
+	0x00010d62, 0x00010d82, 0x00001fae, 0x00001fa6,
+	0x00001cb4, 0x000010f4, 0x000013e4, 0x0000abb4,
+	0x0000ff33, 0x0000ff53, 0x00000537, 0x00000567,
+	0x0000017d, 0x0000017e, 0x00010426, 0x0001044e,
+	0x000024c5, 0x000024df, 0x00000168, 0x00000169,
+	0x00001e9e, 0x000000df, 0x000001e0, 0x000001e1,
+	0x0001e908, 0x0001e92a, 0x00002c27, 0x00002c57,
+	0x0001e911, 0x0001e933, 0x00000108, 0x00000109,
+	0x000001d5, 0x000001d6, 0x00002c00, 0x00002c30,
+	0x000013c7, 0x0000ab97, 0x00000196, 0x00000269,
+	0x000004a0, 0x000004a1, 0x000000ce, 0x000000ee,
+	0x00010cb1, 0x00010cf1, 0x00000178, 0x000000ff,
+	0x00010d53, 0x00010d73, 0x00000222, 0x00000223,
+	0x0000010c, 0x0000010d, 0x00010404, 0x0001042c,
+	0x0000a792, 0x0000a793, 0x00000376, 0x00000377,
+	0x00002c1f, 0x00002c4f, 0x00000420, 0x00000440,
+	0x000118b8, 0x000118d8, 0x00010d56, 0x00010d76,
+	0x000004a4, 0x000004a5, 0x00001ffc, 0x00001ff3,
+	0x000104c7, 0x000104ef, 0x0000a69a, 0x0000a69b,
+	0x00010c87, 0x00010cc7, 0x00001ebc, 0x00001ebd,
+	0x0000012c, 0x0000012d, 0x000013b7, 0x0000ab87,
+	0x0000a7dc, 0x0000019b, 0x000013ca, 0x0000ab9a,
+	0x00010c83, 0x00010cc3, 0x0000212b, 0x000000e5,
+	0x0000216b, 0x0000217b, 0x00000405, 0x00000455,
+	0x00002c25, 0x00002c55, 0x000001d9, 0x000001da,
+	0x00000160, 0x00000161, 0x00001f28, 0x00001f20,
+	0x00000186, 0x00000254, 0x00000543, 0x00000573,
+	0x0000024e, 0x0000024f, 0x00001f89, 0x00001f81,
+	0x00001c9d, 0x000010dd, 0x000010ac, 0x00002d0c,
+	0x00002c63, 0x00001d7d, 0x00000052, 0x00000072,
+	0x000118b7, 0x000118d7, 0x0000ff2c, 0x0000ff4c,
+	0x00010c97, 0x00010cd7, 0x000013db, 0x0000abab,
+	0x00000156, 0x00000157, 0x000013d3, 0x0000aba3,
+	0x0000a660, 0x0000a661, 0x000013f2, 0x000013fa,
+	0x000003f9, 0x000003f2, 0x00001f6c, 0x00001f64,
+	0x00002c96, 0x00002c97, 0x00001ec2, 0x00001ec3,
+	0x000003fe, 0x0000037c, 0x00001f09, 0x00001f01,
+	0x0001041b, 0x00010443, 0x000000cb, 0x000000eb,
+	0x000104b5, 0x000104dd, 0x00002c1d, 0x00002c4d,
+	0x00001e3a, 0x00001e3b, 0x00002ced, 0x00002cee,
+	0x0000a666, 0x0000a667, 0x0000a7d0, 0x0000a7d1,
+	0x00001f8e, 0x00001f86, 0x000013d0, 0x0000aba0,
+	0x00016e4e, 0x00016e6e, 0x00002cb2, 0x00002cb3,
+	0x0000ff2d, 0x0000ff4d, 0x000010a7, 0x00002d07,
+	0x00002160, 0x00002170, 0x00002164, 0x00002174,
+	0x0000011a, 0x0000011b, 0x000104d1, 0x000104f9,
+	0x0000a696, 0x0000a697, 0x0000041b, 0x0000043b,
+	0x00001f3d, 0x00001f35, 0x00000226, 0x00000227,
+	0x00001e06, 0x00001e07, 0x00002c2a, 0x00002c5a,
+	0x000013a4, 0x0000ab74, 0x00002cd4, 0x00002cd5,
+	0x00001c92, 0x000010d2, 0x00000429, 0x00000449,
+	0x000000dc, 0x000000fc, 0x00010410, 0x00010438,
+	0x000010bf, 0x00002d1f, 0x000104ba, 0x000104e2,
+	0x000001ee, 0x000001ef, 0x00001cb7, 0x000010f7,
+	0x00001eba, 0x00001ebb, 0x00010590, 0x000105b7,
+	0x00001e10, 0x00001e11, 0x000003ee, 0x000003ef,
+	0x000118b6, 0x000118d6, 0x000003de, 0x000003df,
+	0x00000045, 0x00000065, 0x000013ad, 0x0000ab7d,
+	0x000010b3, 0x00002d13, 0x00000532, 0x00000562,
+	0x00001ec6, 0x00001ec7, 0x00000158, 0x00000159,
+	0x00000216, 0x00000217, 0x00000202, 0x00000203,
+	0x00010c82, 0x00010cc2, 0x00001e0a, 0x00001e0b,
+	0x0001e919, 0x0001e93b, 0x000104c2, 0x000104ea,
+	0x00002c0b, 0x00002c3b, 0x00000400, 0x00000450,
+	0x00000046, 0x00000066, 0x000004aa, 0x000004ab,
+	0x00000197, 0x00000268, 0x00000554, 0x00000584,
+	0x00001e2e, 0x00001e2f, 0x00001e2a, 0x00001e2b,
+	0x00000425, 0x00000445, 0x00001efe, 0x00001eff,
+	0x00000421, 0x00000441, 0x00002c06, 0x00002c36,
+	0x000013d6, 0x0000aba6, 0x000013a0, 0x0000ab70,
+	0x00016e4b, 0x00016e6b, 0x000004b6, 0x000004b7,
+	0x00010580, 0x000105a7, 0x0000010e, 0x0000010f,
+	0x000013e5, 0x0000abb5, 0x00002c13, 0x00002c43,
+	0x000010b9, 0x00002d19, 0x0000a68e, 0x0000a68f,
+	0x00001f5f, 0x00001f57, 0x000000c1, 0x000000e1,
+	0x000004e4, 0x000004e5, 0x0000037f, 0x000003f3,
+	0x00002c14, 0x00002c44, 0x000000c3, 0x000000e3,
+	0x00002cd6, 0x00002cd7, 0x0000046e, 0x0000046f,
+	0x00002c8c, 0x00002c8d, 0x00001ca4, 0x000010e4,
+	0x00000500, 0x00000501, 0x0000a780, 0x0000a781,
+	0x00010c98, 0x00010cd8, 0x00000181, 0x00000253,
+	0x00010c86, 0x00010cc6, 0x00001e52, 0x00001e53,
+	0x0000a766, 0x0000a767, 0x0001041a, 0x00010442,
+	0x0000ff29, 0x0000ff49, 0x00000141, 0x00000142,
+	0x000003da, 0x000003db, 0x0000004d, 0x0000006d,
+	0x000010aa, 0x00002d0a, 0x000001cf, 0x000001d0,
+	0x0000052e, 0x0000052f, 0x00001e34, 0x00001e35,
+	0x0000a640, 0x0000a641, 0x0000a72a, 0x0000a72b,
+	0x00000204, 0x00000205, 0x00002c10, 0x00002c40,
+	0x00010400, 0x00010428, 0x000013d1, 0x0000aba1,
+	0x00002c9c, 0x00002c9d, 0x0000ff27, 0x0000ff47,
+	0x00000402, 0x00000452, 0x00016e5d, 0x00016e7d,
+	0x000118a7, 0x000118c7, 0x00000407, 0x00000457,
+	0x00000556, 0x00000586, 0x00001e4a, 0x00001e4b,
+	0x0000a648, 0x0000a649, 0x00001e24, 0x00001e25,
+	0x000013eb, 0x0000abbb, 0x000001c5, 0x000001c6,
+	0x00001f8a, 0x00001f82, 0x0001e91f, 0x0001e941,
+	0x00002cb4, 0x00002cb5, 0x000003fd, 0x0000037b,
+	0x000013c1, 0x0000ab91, 0x00001cb0, 0x000010f0,
+	0x00010570, 0x00010597, 0x00001cb6, 0x000010f6,
+	0x000000d3, 0x000000f3, 0x0000a66a, 0x0000a66b,
+	0x00000184, 0x00000185, 0x000013b9, 0x0000ab89,
+	0x00000541, 0x00000571, 0x00002c05, 0x00002c35,
+	0x00001f4d, 0x00001f45, 0x0000a7c9, 0x0000a7ca,
+	0x000003d8, 0x000003d9, 0x000024c6, 0x000024e0,
+	0x0000042c, 0x0000044c, 0x00000542, 0x00000572,
+	0x0000051c, 0x0000051d, 0x00000546, 0x00000576,
+	0x0001041c, 0x00010444, 0x000004fa, 0x000004fb,
+	0x000001ea, 0x000001eb, 0x000104b8, 0x000104e0,
+	0x00001e86, 0x00001e87, 0x0001e909, 0x0001e92b,
+	0x0001e90f, 0x0001e931, 0x000024c2, 0x000024dc,
+	0x00016e59, 0x00016e79, 0x00010d60, 0x00010d80,
+	0x00010411, 0x00010439, 0x000004c9, 0x000004ca,
+	0x000104bb, 0x000104e3, 0x00000526, 0x00000527,
+	0x00010d65, 0x00010d85, 0x00001ef2, 0x00001ef3,
+	0x0000a7cb, 0x00000264, 0x0000a7c6, 0x00001d8e,
+	0x00002c2e, 0x00002c5e, 0x000013a8, 0x0000ab78,
+	0x00002ca2, 0x00002ca3, 0x00002cb0, 0x00002cb1,
+	0x0001058a, 0x000105b1, 0x000010cd, 0x00002d2d,
+	0x000104d2, 0x000104fa, 0x00001cab, 0x000010eb,
+	0x0000039f, 0x000003bf, 0x00001e74, 0x00001e75,
+	0x00001ef6, 0x00001ef7, 0x00010424, 0x0001044c,
+	0x00001f0e, 0x00001f06, 0x0000a734, 0x0000a735,
+	0x0000039c, 0x000003bc, 0x000003a6, 0x000003c6,
+	0x000013da, 0x0000abaa, 0x00002c18, 0x00002c48,
+	0x00001c94, 0x000010d4, 0x000024c7, 0x000024e1,
+	0x00016e48, 0x00016e68, 0x0000a75a, 0x0000a75b,
+	0x000004ea, 0x000004eb, 0x00000134, 0x00000135,
+	0x00000182, 0x00000183, 0x000001de, 0x000001df,
+	0x00001f3c, 0x00001f34, 0x00000547, 0x00000577,
+	0x00002c94, 0x00002c95, 0x000013f1, 0x000013f9,
+	0x00000243, 0x00000180, 0x00001c9e, 0x000010de,
+	0x00016e5b, 0x00016e7b, 0x000118be, 0x000118de,
+	0x00002c6b, 0x00002c6c, 0x00010c93, 0x00010cd3,
+	0x0000016e, 0x0000016f, 0x0000a7b0, 0x0000029e,
+	0x00001f9b, 0x00001f93, 0x0000a7b6, 0x0000a7b7,
+	0x000003aa, 0x000003ca, 0x000003a3, 0x000003c3,
+	0x0001e910, 0x0001e932, 0x00002caa, 0x00002cab,
+	0x0000ff37, 0x0000ff57, 0x000001b2, 0x0000028b,
+	0x00000048, 0x00000068, 0x00010407, 0x0001042f,
+	0x000004d6, 0x000004d7, 0x000001b8, 0x000001b9,
+	0x0000019c, 0x0000026f, 0x00001e02, 0x00001e03,
+	0x00000139, 0x0000013a, 0x00001eec, 0x00001eed,
+	0x00010589, 0x000105b0, 0x00001f9e, 0x00001f96,
+	0x0001e901, 0x0001e923, 0x000013e0, 0x0000abb0,
+	0x0000ff3a, 0x0000ff5a, 0x00002c11, 0x00002c41,
+	0x00000054, 0x00000074, 0x00010419, 0x00010441,
+	0x00000124, 0x00000125, 0x00002ceb, 0x00002cec,
+	0x00010c8a, 0x00010cca, 0x0000018e, 0x000001dd,
+	0x00010ca8, 0x00010ce8, 0x0000042f, 0x0000044f,
+	0x0000ff2e, 0x0000ff4e, 0x000118ac, 0x000118cc,
+	0x0000a74e, 0x0000a74f, 0x0000038c, 0x000003cc,
+	0x00002cce, 0x00002ccf, 0x00016e57, 0x00016e77,
+	0x00000540, 0x00000570, 0x0000052a, 0x0000052b,
+	0x00001eb2, 0x00001eb3, 0x0000014c, 0x0000014d,
+	0x00001e08, 0x00001e09, 0x0000039b, 0x000003bb,
+	0x00000553, 0x00000583, 0x00001fab, 0x00001fa3,
+	0x000104be, 0x000104e6, 0x00001ff8, 0x00001f78,
+	0x000003ab, 0x000003cb, 0x000004c1, 0x000004c2,
+	0x00010408, 0x00010430, 0x000004b0, 0x000004b1,
+	0x00002cc4, 0x00002cc5, 0x00010ca3, 0x00010ce3,
+	0x000013c5, 0x0000ab95, 0x00001e6a, 0x00001e6b,
+	0x00010d51, 0x00010d71, 0x00001edc, 0x00001edd,
+	0x0001e90a, 0x0001e92c, 0x00002c22, 0x00002c52,
+	0x0000a798, 0x0000a799, 0x00002cb8, 0x00002cb9,
+	0x00000410, 0x00000430, 0x00000398, 0x000003b8,
+	0x0000050c, 0x0000050d, 0x0000005a, 0x0000007a,
+	0x000004d4, 0x000004d5, 0x00001f0b, 0x00001f03,
+	0x0000054e, 0x0000057e, 0x000001ae, 0x00000288,
+	0x000013b5, 0x0000ab85, 0x0000021e, 0x0000021f,
+	0x00001ee4, 0x00001ee5, 0x00000394, 0x000003b4,
+	0x00002c16, 0x00002c46, 0x0001e91c, 0x0001e93e,
+	0x00002cc0, 0x00002cc1, 0x00002c01, 0x00002c31,
+	0x00000189, 0x00000256, 0x000000ca, 0x000000ea,
+	0x00001fdb, 0x00001f77, 0x00000502, 0x00000503,
+	0x000118a6, 0x000118c6, 0x000001fa, 0x000001fb,
+	0x000000de, 0x000000fe, 0x000010a3, 0x00002d03,
+	0x00010d5e, 0x00010d7e, 0x000004c5, 0x000004c6,
+	0x00001fba, 0x00001f70, 0x0000a7a2, 0x0000a7a3,
+	0x00002cd8, 0x00002cd9, 0x00002c82, 0x00002c83,
+	0x00000478, 0x00000479, 0x00001f6a, 0x00001f62,
+	0x00010c8e, 0x00010cce, 0x00000106, 0x00000107,
+	0x000004da, 0x000004db, 0x00001e88, 0x00001e89,
+	0x00001ed8, 0x00001ed9, 0x00000551, 0x00000581,
+	0x000013c6, 0x0000ab96, 0x000013e8, 0x0000abb8,
+	0x00002cdc, 0x00002cdd, 0x00002c0f, 0x00002c3f,
+	0x00001c9b, 0x000010db, 0x00016e42, 0x00016e62,
+	0x00000496, 0x00000497, 0x0000040c, 0x0000045c,
+	0x000004f6, 0x000004f7, 0x00010cab, 0x00010ceb,
+	0x0000015c, 0x0000015d, 0x00010d55, 0x00010d75,
+	0x00001e4c, 0x00001e4d, 0x00001cad, 0x000010ed,
+	0x00000248, 0x00000249, 0x000013aa, 0x0000ab7a,
+	0x0001e91d, 0x0001e93f, 0x00016e45, 0x00016e65,
+	0x00000404, 0x00000454, 0x00001f29, 0x00001f21,
+	0x00001cb2, 0x000010f2, 0x0001041f, 0x00010447,
+	0x000001cb, 0x000001cc, 0x000104c9, 0x000104f1,
+	0x000010b0, 0x00002d10, 0x00010573, 0x0001059a,
+	0x000024b9, 0x000024d3, 0x0000a736, 0x0000a737,
+	0x00001eb0, 0x00001eb1, 0x0000a7a8, 0x0000a7a9,
+	0x000013d8, 0x0000aba8, 0x000024b6, 0x000024d0,
+	0x00001c98, 0x000010d8, 0x000013e7, 0x0000abb7,
+	0x000001f2, 0x000001f3, 0x000118bc, 0x000118dc,
+	0x0000040f, 0x0000045f, 0x00010d5c, 0x00010d7c,
+	0x0000a658, 0x0000a659, 0x00010cac, 0x00010cec,
+	0x0000ff24, 0x0000ff44, 0x0000a74a, 0x0000a74b,
+	0x00001fea, 0x00001f7a, 0x00002c1c, 0x00002c4c,
+	0x0001e904, 0x0001e926, 0x000024c8, 0x000024e2,
+	0x00000116, 0x00000117, 0x00010d50, 0x00010d70,
+	0x000010bc, 0x00002d1c, 0x000104d0, 0x000104f8,
+	0x0000014e, 0x0000014f, 0x00010d5d, 0x00010d7d,
+	0x00001e1c, 0x00001e1d, 0x00001eea, 0x00001eeb,
+	0x000003a9, 0x000003c9, 0x00000415, 0x00000435,
+	0x0000ff30, 0x0000ff50, 0x00010c9e, 0x00010cde,
+	0x00001f68, 0x00001f60, 0x000000d1, 0x000000f1,
+	0x000001cd, 0x000001ce, 0x00000480, 0x00000481,
+	0x000118b1, 0x000118d1, 0x00000047, 0x00000067,
+	0x000001e2, 0x000001e3, 0x00001e5a, 0x00001e5b,
+	0x0000049a, 0x0000049b, 0x00001ea0, 0x00001ea1,
+	0x00001fa9, 0x00001fa1, 0x00000555, 0x00000585,
+	0x0001e90c, 0x0001e92e, 0x00002ca8, 0x00002ca9,
+	0x0000ff36, 0x0000ff56, 0x00001f6f, 0x00001f67,
+	0x00000049, 0x00000069, 0x0000049c, 0x0000049d,
+	0x000013f3, 0x000013fb, 0x0000014a, 0x0000014b,
+	0x0000054a, 0x0000057a, 0x0000a698, 0x0000a699,
+	0x00001caf, 0x000010ef, 0x0000a742, 0x0000a743,
+	0x00010582, 0x000105a9, 0x00000210, 0x00000211,
+	0x000013e2, 0x0000abb2, 0x00002ccc, 0x00002ccd,
+	0x00002c8e, 0x00002c8f, 0x00016e4d, 0x00016e6d,
+	0x0000042a, 0x0000044a, 0x00010ca5, 0x00010ce5,
+	0x00001e4e, 0x00001e4f, 0x00000100, 0x00000101,
+	0x0000a7b2, 0x0000029d, 0x000013df, 0x0000abaf,
+	0x0001e90b, 0x0001e92d, 0x000003f7, 0x000003f8,
+	0x00010c80, 0x00010cc0, 0x00001fec, 0x00001fe5,
+	0x000001b1, 0x0000028a, 0x00010594, 0x000105bb,
+	0x000010c1, 0x00002d21, 0x00010d5a, 0x00010d7a,
+	0x0000054f, 0x0000057f, 0x000004ec, 0x000004ed,
+	0x00010583, 0x000105aa, 0x00000150, 0x00000151,
+	0x00010d5b, 0x00010d7b, 0x00001ede, 0x00001edf,
+	0x000004c3, 0x000004c4, 0x00000413, 0x00000433,
+	0x0000a668, 0x0000a669, 0x0001e900, 0x0001e922,
+	0x00000128, 0x00000129, 0x00001f59, 0x00001f51,
+	0x00000492, 0x00000493, 0x00010cae, 0x00010cee,
+	0x00010405, 0x0001042d, 0x00001e82, 0x00001e83,
+	0x0000050e, 0x0000050f, 0x00001e48, 0x00001e49,
+	0x00010579, 0x000105a0, 0x0000024c, 0x0000024d,
+	0x0000a768, 0x0000a769, 0x00001fd8, 0x00001fd0,
+	0x00001ee8, 0x00001ee9, 0x000013a9, 0x0000ab79,
+	0x000010bb, 0x00002d1b, 0x00016e4c, 0x00016e6c,
+	0x000010a4, 0x00002d04, 0x0001e91a, 0x0001e93c,
+	0x00010c96, 0x00010cd6, 0x00010421, 0x00010449,
+	0x00000057, 0x00000077, 0x000104cb, 0x000104f3,
+	0x00010595, 0x000105bc, 0x00010c9a, 0x00010cda,
+	0x0000022e, 0x0000022f, 0x00001e7e, 0x00001e7f,
+	0x0000a652, 0x0000a653, 0x00010c88, 0x00010cc8,
+	0x00002c7f, 0x00000240, 0x000024ce, 0x000024e8,
+	0x000004f0, 0x000004f1, 0x0000041f, 0x0000043f,
+	0x000104b4, 0x000104dc, 0x00002c90, 0x00002c91,
+	0x00000246, 0x00000247, 0x0001040e, 0x00010436,
+	0x00001ed0, 0x00001ed1, 0x00010d58, 0x00010d78,
+	0x00001f2a, 0x00001f22, 0x0001e917, 0x0001e939,
+	0x0000ff22, 0x0000ff42, 0x000000c7, 0x000000e7,
+	0x000003e2, 0x000003e3, 0x000003dc, 0x000003dd,
+	0x0000048c, 0x0000048d, 0x000118a5, 0x000118c5,
+	0x00010caf, 0x00010cef, 0x00001e40, 0x00001e41,
+	0x0000a752, 0x0000a753, 0x0000013f, 0x00000140,
+	0x00001f6d, 0x00001f65, 0x000013cd, 0x0000ab9d,
+	0x00002c0d, 0x00002c3d, 0x000013b6, 0x0000ab86,
+	0x000013a7, 0x0000ab77, 0x00001f0d, 0x00001f05,
+	0x000118a0, 0x000118c0, 0x00000418, 0x00000438,
+	0x0000212a, 0x0000006b, 0x00010ca2, 0x00010ce2,
+	0x000010b1, 0x00002d11, 0x0000a7c2, 0x0000a7c3,
+	0x0000019d, 0x00000272, 0x0000050a, 0x0000050b,
+	0x000118a4, 0x000118c4, 0x0000a76c, 0x0000a76d,
+	0x00016e5f, 0x00016e7f, 0x00001f6e, 0x00001f66,
+	0x00002161, 0x00002171, 0x00001e20, 0x00001e21,
+	0x000118bb, 0x000118db, 0x0000a784, 0x0000a785,
+	0x000010b6, 0x00002d16, 0x00001f2d, 0x00001f25,
+	0x0001057e, 0x000105a5, 0x0000a726, 0x0000a727,
+	0x00001e92, 0x00001e93, 0x0000a680, 0x0000a681,
+	0x00002c6e, 0x00000271, 0x0000a744, 0x0000a745,
+	0x00001e8c, 0x00001e8d, 0x00001f9d, 0x00001f95,
+	0x000118bd, 0x000118dd, 0x00002c86, 0x00002c87,
+	0x00000110, 0x00000111, 0x00002132, 0x0000214e,
+	0x000000d8, 0x000000f8, 0x00010c95, 0x00010cd5,
+	0x00001e38, 0x00001e39, 0x000024cb, 0x000024e5,
+	0x00001ee2, 0x00001ee3, 0x00001ea4, 0x00001ea5,
+	0x00001fc9, 0x00001f73, 0x0000a77d, 0x00001d79,
+	0x000013ae, 0x0000ab7e, 0x00002c80, 0x00002c81,
+	0x000104b2, 0x000104da, 0x000003f4, 0x000003b8,
+	0x00000416, 0x00000436, 0x00010409, 0x00010431,
+	0x00001ecc, 0x00001ecd, 0x000104b3, 0x000104db,
+	0x00001eb6, 0x00001eb7, 0x00000194, 0x00000263,
+	0x000000d5, 0x000000f5, 0x0000023e, 0x00002c66,
+	0x00001f8f, 0x00001f87, 0x00002c1e, 0x00002c4e,
+	0x0000a7da, 0x0000a7db, 0x00000392, 0x000003b2,
+	0x000004ee, 0x000004ef, 0x0000ff28, 0x0000ff48,
+	0x000000cd, 0x000000ed, 0x00010427, 0x0001044f,
+	0x000004cd, 0x000004ce, 0x00000104, 0x00000105,
+	0x00001e76, 0x00001e77, 0x000003a5, 0x000003c5,
+	0x00001c89, 0x00001c8a, 0x0001058c, 0x000105b3,
+	0x0001e902, 0x0001e924, 0x0000a7c7, 0x0000a7c8,
+	0x00002c28, 0x00002c58, 0x00002cd0, 0x00002cd1
 };
 
 static const unsigned _uccase_title_g_size = 35;
@@ -4255,814 +4359,828 @@ static const unsigned _uccase_title_table[] = {
 	0x00001f93, 0x00001f9b
 };
 
-static const unsigned _uccase_fold_g_size = 290;
+static const unsigned _uccase_fold_g_size = 293;
 static const short _uccase_fold_g[] = {
-	  172,  2060,  3456,   169,    75,   732,  6000,  1391,
-	  515,  -172,    14,  2627,     1,  1054,     1,  3166,
-	  571,  3110,     2, 14466,   157, 10181,   518,  1068,
-	  662,  1353,     1,  1187,     4, 17455,    24,   522,
-	    1,   987,     1,  1117,  1132,    23,   543,  1305,
-	  520,  2954,  3565,   669,   608,  1036,    10, 32767,
-	    1,  1217,   183,   179,   170,   581,   716,  2604,
-	  525,   688,   644,  2082,   607, -1316,   589,   130,
-	  769,  4242,    62,  3386,    39, 17154,    18,  5185,
-	  982,  1122,  1045,   535,    54,    41,   776,  3136,
-	  152,  -819,   262, 11070,    14,  3786,     1,  3119,
-	  272,  3124,   297, 10605,  3498,  3205,  4190,  1513,
-	  285,  5726,  1113,   134,     2,  1450,    83,  5733,
-	    1,   872,    65,   574,     2, 14497,   154,  2301,
-	  621,  1056,   120,  1460,    39,  1579,  3098,  2852,
-	   70,  1542,     1,  2488,     1, 29884,   884,   184,
-	   28,   967,   436,   762,   570,   310,   656,   982,
-	    2, 32767,     9,  2471,   203,   368,   527,  6043,
-	   99,   557,   538,   143,    53,  1058,   735,  7744,
-	  166,  3150,  1483,  4323,     2,  3338,     2,  4078,
-	   17,  5126,  1078,  1181,   534,  1446,    31,    95,
-	 3200,  1414,   278,  -853,  3900,  3206,     2,  1037,
-	    1,  2679,   158,  5667,   387,  2525,  1443,  1145,
-	 3173,  4401,   340,  1852,   994,  2051,     1,  1517,
-	    2,  8166,     1,  3178,    90,  4606,    13,  1524,
-	   69, -1516,  6334,  1063,  3368,  1169,   344,  1590,
-	 3222,  1152,     1, 31950,     1,  1143,     1,  5710,
-	  145,  3791,     1,  1308,   447,  1031,   527,  1082,
-	  118,  1035,     5,  -467,   528, 17446,    10, 11411,
-	  305,  9619,     1,   627,   571,     9,   463,  1531,
-	  929,  9877,   525,   930,  6235,  4235,     2,  -608,
-	  323, 14592,     1,   741,   291,  6245,  1152,  1233,
-	  598,   315,   573,  4326,   926,  -937,   590,    50,
-	  523,  3737,   128,  5153,   116, 11582,    66,  3343,
-	  542,  9689,  1065,  1232,     1,    66,   700,  4742,
-	    2,  -687,   344,  2652,    56,  3557,     1,  5678,
-	   92, 12483
+	 3432,   570,     1,   102,   547,   152,   440,    46,
+	  546,   468,     6,   769,     1,   581,  -753,  2134,
+	  130,   743,   372,   238,     1,   829,     1,  1007,
+	  158,  1146,   174,  1077,   760,  1041,  1091,   567,
+	 1591,   817,   630,   711,   225,  1808,   121,  2595,
+	 2831,   363,   601,  2677,    86,  1013,    12,   186,
+	   10,   201,   544,     2,   252,     4,   666,     1,
+	 -297,   131,   173,   811,   461,     2,   355,     1,
+	  478,     8,  1544,    16,   531,    61,  1109,  1061,
+	  518,   926,  1380,   875,  1302,  1996,   109, 13793,
+	  119,  -916,  -870,   401,  2098,   551,   546,    83,
+	  521,     3,   512,   533,   167,     4,    20,   252,
+	   87, -1534,    51,  -835,   129,   781,   323,   428,
+	    1,   397,     1,  1662,    78,  1120,    32,   232,
+	   59,  1673,   250,   976,  1486,  1526,   718,  2892,
+	 2869,  1306,     1, -1412,  2428,  5542,   519,  7772,
+	  459,   590,     1,   143,     2,   484,   247,     9,
+	  514,     1,   704,     7,  -591,   744,   143,   168,
+	  266,   368,   913,     1,    86,     1,  1012,   140,
+	  796,    48,   842,  1049,  3775,   815,   714,  1421,
+	  182,  2899,  4758,  2493,  1590, -1189,  3441,   867,
+	  538,   520,   605,     4,   635,   249,   220,   516,
+	  166,   183,     6,   583,    63,   706,   121,   633,
+	  271,  1577,     5,   274,     1,  2442,     1,   535,
+	  413,   307,   787,   192,   857,  3329,   375,  1223,
+	  131,   790,  1785,  4374,  2147,  2028,  2317, -1449,
+	 4982,  4893,   325,  7004,    93,   256,   108,   513,
+	    1,   182,     2,   116,   390,     1,   322,  2182,
+	  313,   554, 15407,    12,    63,    22,   404,     1,
+	  405,     8,  3674,   203,   880,   581,   803,   214,
+	 2925,   191,  2747,   556,  1638,  2864,  2687,  2635,
+	 2450,  1845,   445,  2093,  4633,    52,   676,     1,
+	  536,     1,     4,     1,     5,   340,     1,   226,
+	    4,  -151,  -782,   502,   283,    75,    15,   300,
+	   16,   539,     1,  1128,     3,  1625,  1138,  1245,
+	  391,  2421,  1347,  1362,  1439,   136,  1598,   212,
+	 3221,  2388,  1158,  3173,   666
 };
 
-static const unsigned _uccase_fold_table_size = 1530;
+static const unsigned _uccase_fold_table_size = 1557;
 static const unsigned _uccase_fold_table[] = {
-	0x00001f8c, 0x020001eb, 0x000118a8, 0x000118c8,
-	0x00002cd0, 0x00002cd1, 0x0000a66c, 0x0000a66d,
-	0x00001e82, 0x00001e83, 0x000118bf, 0x000118df,
-	0x00010418, 0x00010440, 0x0001e90f, 0x0001e931,
-	0x0000a696, 0x0000a697, 0x00001fb9, 0x00001fb1,
-	0x0001e913, 0x0001e935, 0x00001fea, 0x00001f7a,
-	0x00000245, 0x0000028c, 0x00016e4a, 0x00016e6a,
-	0x0000ab8f, 0x000013bf, 0x00010c84, 0x00010cc4,
-	0x00000186, 0x00000254, 0x00010576, 0x0001059d,
-	0x000010a6, 0x00002d06, 0x0001041b, 0x00010443,
-	0x00001fc2, 0x0200026a, 0x00001e60, 0x00001e61,
-	0x000024b7, 0x000024d1, 0x000010cd, 0x00002d2d,
-	0x0000ab90, 0x000013c0, 0x0000015c, 0x0000015d,
-	0x000024c5, 0x000024df, 0x000118ac, 0x000118cc,
-	0x00010ca3, 0x00010ce3, 0x00000510, 0x00000511,
-	0x00010c81, 0x00010cc1, 0x00001f94, 0x02000203,
-	0x000010bb, 0x00002d1b, 0x0000a766, 0x0000a767,
-	0x00001e12, 0x00001e13, 0x0000ff3a, 0x0000ff5a,
-	0x0000a72a, 0x0000a72b, 0x0000fb13, 0x020002c8,
-	0x0000abaa, 0x000013da, 0x0000a658, 0x0000a659,
-	0x00001ebc, 0x00001ebd, 0x00002c0a, 0x00002c3a,
-	0x000004cd, 0x000004ce, 0x00010587, 0x000105ae,
-	0x00002c1a, 0x00002c4a, 0x00000044, 0x00000064,
-	0x00001f9b, 0x02000218, 0x0000010a, 0x0000010b,
-	0x00001e58, 0x00001e59, 0x000001ae, 0x00000288,
-	0x00002168, 0x00002178, 0x00001fcc, 0x0200027a,
-	0x0000052a, 0x0000052b, 0x00002c0f, 0x00002c3f,
-	0x00000045, 0x00000065, 0x00000168, 0x00000169,
-	0x00000120, 0x00000121, 0x000004c5, 0x000004c6,
-	0x000003ea, 0x000003eb, 0x000000df, 0x0200018f,
-	0x00001f93, 0x02000200, 0x00001fe3, 0x03000290,
-	0x00016e4e, 0x00016e6e, 0x00000462, 0x00000463,
-	0x0000a76a, 0x0000a76b, 0x00000545, 0x00000575,
-	0x0000ff2c, 0x0000ff4c, 0x0000a75a, 0x0000a75b,
-	0x00001f28, 0x00001f20, 0x000004e2, 0x000004e3,
-	0x00000158, 0x00000159, 0x0000fb15, 0x020002ce,
-	0x00002c6e, 0x00000271, 0x00001f96, 0x02000209,
-	0x00000552, 0x00000582, 0x00002cde, 0x00002cdf,
-	0x000004d2, 0x000004d3, 0x000118ba, 0x000118da,
-	0x00010419, 0x00010441, 0x00001faf, 0x02000254,
-	0x000024c0, 0x000024da, 0x0000023a, 0x00002c65,
-	0x00001fb2, 0x02000257, 0x000004a0, 0x000004a1,
-	0x0000a666, 0x0000a667, 0x00000423, 0x00000443,
-	0x00002cbe, 0x00002cbf, 0x00000043, 0x00000063,
-	0x00001fc4, 0x02000270, 0x000003e8, 0x000003e9,
-	0x00001fa2, 0x0200022d, 0x0000aba8, 0x000013d8,
-	0x0000038e, 0x000003cd, 0x00001e2a, 0x00001e2b,
-	0x00002cc0, 0x00002cc1, 0x0000a736, 0x0000a737,
-	0x00016e58, 0x00016e78, 0x000000c0, 0x000000e0,
-	0x0000019c, 0x0000026f, 0x0000004f, 0x0000006f,
-	0x000004b0, 0x000004b1, 0x00001ee8, 0x00001ee9,
-	0x00000500, 0x00000501, 0x00002c1b, 0x00002c4b,
-	0x00000054, 0x00000074, 0x0000ab86, 0x000013b6,
-	0x00002c70, 0x00000252, 0x000004cb, 0x000004cc,
-	0x0000020a, 0x0000020b, 0x00010c85, 0x00010cc5,
-	0x00001fa8, 0x0200023f, 0x00000139, 0x0000013a,
-	0x00000208, 0x00000209, 0x000004c7, 0x000004c8,
-	0x0000054f, 0x0000057f, 0x000001c7, 0x000001c9,
-	0x00001ea8, 0x00001ea9, 0x0000042c, 0x0000044c,
-	0x00001e9a, 0x020001b2, 0x00016e44, 0x00016e64,
-	0x00000182, 0x00000183, 0x00001ee0, 0x00001ee1,
-	0x000004fe, 0x000004ff, 0x000118a5, 0x000118c5,
-	0x00001ea2, 0x00001ea3, 0x0000ff21, 0x0000ff41,
-	0x0000a75c, 0x0000a75d, 0x00001f68, 0x00001f60,
-	0x0000a779, 0x0000a77a, 0x0000a662, 0x0000a663,
-	0x00001e20, 0x00001e21, 0x0000046c, 0x0000046d,
-	0x000000dd, 0x000000fd, 0x00010592, 0x000105b9,
-	0x000003b0, 0x0300019f, 0x0000023b, 0x0000023c,
-	0x00000400, 0x00000450, 0x00000425, 0x00000445,
-	0x00001efc, 0x00001efd, 0x0001040f, 0x00010437,
-	0x000118b5, 0x000118d5, 0x0000a7c0, 0x0000a7c1,
-	0x00000104, 0x00000105, 0x000001c4, 0x000001c6,
-	0x0000ff29, 0x0000ff49, 0x0000abb0, 0x000013e0,
-	0x00001f8e, 0x020001f1, 0x00001e6a, 0x00001e6b,
-	0x00000416, 0x00000436, 0x0000004e, 0x0000006e,
-	0x000003f9, 0x000003f2, 0x00010c96, 0x00010cd6,
-	0x0000212b, 0x000000e5, 0x000010a3, 0x00002d03,
-	0x000104c9, 0x000104f1, 0x00001c9b, 0x000010db,
-	0x00000053, 0x00000073, 0x00002169, 0x00002179,
-	0x00001f1d, 0x00001f15, 0x000004ec, 0x000004ed,
-	0x0000012a, 0x0000012b, 0x0000ff32, 0x0000ff52,
-	0x000118b4, 0x000118d4, 0x000013f9, 0x000013f1,
-	0x00001fdb, 0x00001f77, 0x00000376, 0x00000377,
-	0x0000ab8e, 0x000013be, 0x0000ab80, 0x000013b0,
-	0x0000a7b8, 0x0000a7b9, 0x00001e08, 0x00001e09,
-	0x00010409, 0x00010431, 0x0000a722, 0x0000a723,
-	0x00000041, 0x00000061, 0x0000052c, 0x0000052d,
-	0x0000a66a, 0x0000a66b, 0x0001058c, 0x000105b3,
-	0x00010c86, 0x00010cc6, 0x00001e70, 0x00001e71,
-	0x000003ff, 0x0000037d, 0x000003d8, 0x000003d9,
-	0x0000ab74, 0x000013a4, 0x00002161, 0x00002171,
-	0x00002c63, 0x00001d7d, 0x00001e4c, 0x00001e4d,
-	0x00001fc9, 0x00001f73, 0x0000a762, 0x0000a763,
-	0x00001fb6, 0x02000260, 0x000104c6, 0x000104ee,
-	0x000001c8, 0x000001c9, 0x00001cb0, 0x000010f0,
-	0x00002c84, 0x00002c85, 0x0000a64a, 0x0000a64b,
-	0x000024bb, 0x000024d5, 0x000001f8, 0x000001f9,
-	0x0000a798, 0x0000a799, 0x0000ff2f, 0x0000ff4f,
-	0x000104b4, 0x000104dc, 0x00001ec8, 0x00001ec9,
-	0x00001f0f, 0x00001f07, 0x0000a7a2, 0x0000a7a3,
-	0x00001c96, 0x000010d6, 0x000024c1, 0x000024db,
-	0x0000a69a, 0x0000a69b, 0x00001cb6, 0x000010f6,
-	0x000104d0, 0x000104f8, 0x00000345, 0x000003b9,
-	0x00000401, 0x00000451, 0x0000047e, 0x0000047f,
-	0x00010c8f, 0x00010ccf, 0x00001f3f, 0x00001f37,
-	0x00000372, 0x00000373, 0x00001fc8, 0x00001f72,
-	0x0000041b, 0x0000043b, 0x00002c11, 0x00002c41,
-	0x0000a7c5, 0x00000282, 0x0000ff24, 0x0000ff44,
-	0x0000022a, 0x0000022b, 0x00001ef2, 0x00001ef3,
-	0x000001b1, 0x0000028a, 0x0000018e, 0x000001dd,
-	0x0001040e, 0x00010436, 0x0001e905, 0x0001e927,
-	0x00001fa0, 0x02000227, 0x00000550, 0x00000580,
-	0x000104b6, 0x000104de, 0x00000407, 0x00000457,
-	0x00002167, 0x00002177, 0x00002c62, 0x0000026b,
-	0x000013fc, 0x000013f4, 0x00001f5f, 0x00001f57,
-	0x000001b3, 0x000001b4, 0x0000054b, 0x0000057b,
-	0x00001cb9, 0x000010f9, 0x0000ff23, 0x0000ff43,
-	0x00001cb8, 0x000010f8, 0x000004a6, 0x000004a7,
-	0x0000011e, 0x0000011f, 0x00000393, 0x000003b3,
-	0x000001fa, 0x000001fb, 0x00001f48, 0x00001f40,
-	0x0000ff30, 0x0000ff50, 0x00002ca2, 0x00002ca3,
-	0x00001e99, 0x020001af, 0x00010406, 0x0001042e,
-	0x0000a728, 0x0000a729, 0x0001e910, 0x0001e932,
-	0x000024ba, 0x000024d4, 0x0000a680, 0x0000a681,
-	0x0000a78b, 0x0000a78c, 0x00010583, 0x000105aa,
-	0x0000010e, 0x0000010f, 0x0000a77b, 0x0000a77c,
-	0x00000466, 0x00000467, 0x0000a746, 0x0000a747,
-	0x00010c82, 0x00010cc2, 0x000001ee, 0x000001ef,
-	0x000104c3, 0x000104eb, 0x000010b8, 0x00002d18,
-	0x00002c2c, 0x00002c5c, 0x00001fcb, 0x00001f75,
-	0x000024c2, 0x000024dc, 0x000118b1, 0x000118d1,
-	0x0000053d, 0x0000056d, 0x00016e45, 0x00016e65,
-	0x000001af, 0x000001b0, 0x00001cbe, 0x000010fe,
-	0x00000476, 0x00000477, 0x00001e84, 0x00001e85,
-	0x00001c84, 0x00000442, 0x000003e2, 0x000003e3,
-	0x0000a77e, 0x0000a77f, 0x00010408, 0x00010430,
-	0x000104bc, 0x000104e4, 0x00001e52, 0x00001e53,
-	0x0000ff38, 0x0000ff58, 0x000118ab, 0x000118cb,
-	0x00001f2a, 0x00001f22, 0x0000ab76, 0x000013a6,
-	0x00002c27, 0x00002c57, 0x00000555, 0x00000585,
-	0x0000048a, 0x0000048b, 0x00000540, 0x00000570,
-	0x0000ff34, 0x0000ff54, 0x0000040d, 0x0000045d,
-	0x00000244, 0x00000289, 0x00000546, 0x00000576,
-	0x00002caa, 0x00002cab, 0x00001e92, 0x00001e93,
-	0x000003ab, 0x000003cb, 0x0000a7ac, 0x00000261,
-	0x0001e916, 0x0001e938, 0x0000049e, 0x0000049f,
-	0x000001db, 0x000001dc, 0x00001f39, 0x00001f31,
-	0x000004f2, 0x000004f3, 0x00010574, 0x0001059b,
-	0x00010582, 0x000105a9, 0x00001cb3, 0x000010f3,
-	0x00001f54, 0x030001bf, 0x000010ad, 0x00002d0d,
-	0x0000fb04, 0x030002be, 0x00010424, 0x0001044c,
-	0x0000aba6, 0x000013d6, 0x000104c0, 0x000104e8,
-	0x00001e44, 0x00001e45, 0x000024c4, 0x000024de,
-	0x00002164, 0x00002174, 0x0000018b, 0x0000018c,
-	0x00000538, 0x00000568, 0x00000108, 0x00000109,
-	0x0000a7ab, 0x0000025c, 0x00002c82, 0x00002c83,
-	0x00001ff8, 0x00001f78, 0x0000ab7b, 0x000013ab,
-	0x0000ab72, 0x000013a2, 0x00001e50, 0x00001e51,
-	0x00000399, 0x000003b9, 0x000104b9, 0x000104e1,
-	0x0000a650, 0x0000a651, 0x000118b2, 0x000118d2,
-	0x00000106, 0x00000107, 0x00001cb4, 0x000010f4,
-	0x00002c7f, 0x00000240, 0x0000a698, 0x0000a699,
-	0x000003a3, 0x000003c3, 0x0001e90b, 0x0001e92d,
-	0x0000011c, 0x0000011d, 0x0000ff36, 0x0000ff56,
-	0x00001c83, 0x00000441, 0x00001f52, 0x030001bb,
-	0x000000c5, 0x000000e5, 0x00000132, 0x00000133,
-	0x0001e902, 0x0001e924, 0x000010a8, 0x00002d08,
-	0x00010423, 0x0001044b, 0x00002c2d, 0x00002c5d,
-	0x00002c8c, 0x00002c8d, 0x000001c5, 0x000001c6,
-	0x00010c83, 0x00010cc3, 0x0000049a, 0x0000049b,
-	0x0000014c, 0x0000014d, 0x00000243, 0x00000180,
-	0x0000041a, 0x0000043a, 0x00010ca9, 0x00010ce9,
-	0x00001fc6, 0x02000273, 0x00010c80, 0x00010cc0,
-	0x000003fd, 0x0000037b, 0x00001f3a, 0x00001f32,
-	0x00002c12, 0x00002c42, 0x00010c94, 0x00010cd4,
-	0x0000ab83, 0x000013b3, 0x00000396, 0x000003b6,
-	0x00001f97, 0x0200020c, 0x0000050a, 0x0000050b,
-	0x00016e4c, 0x00016e6c, 0x000004fc, 0x000004fd,
-	0x000001ea, 0x000001eb, 0x00001fd2, 0x0300027d,
-	0x00001f6d, 0x00001f65, 0x00010579, 0x000105a0,
-	0x00010586, 0x000105ad, 0x0000ff2e, 0x0000ff4e,
-	0x000104bd, 0x000104e5, 0x00001e54, 0x00001e55,
-	0x000118b8, 0x000118d8, 0x00002166, 0x00002176,
-	0x00010578, 0x0001059f, 0x00001ff9, 0x00001f79,
-	0x00001fe7, 0x0300029a, 0x00000553, 0x00000583,
-	0x000004ae, 0x000004af, 0x00000187, 0x00000188,
-	0x0000a682, 0x0000a683, 0x00000496, 0x00000497,
-	0x00001f56, 0x030001c3, 0x00010c8c, 0x00010ccc,
-	0x000001cd, 0x000001ce, 0x00001c81, 0x00000434,
-	0x0000ab99, 0x000013c9, 0x00010c8d, 0x00010ccd,
-	0x0000abaf, 0x000013df, 0x00016e4b, 0x00016e6b,
-	0x00001caf, 0x000010ef, 0x00010416, 0x0001043e,
-	0x0000051a, 0x0000051b, 0x0000a7d0, 0x0000a7d1,
-	0x00001f6c, 0x00001f64, 0x00000428, 0x00000448,
-	0x00001f9c, 0x0200021b, 0x00002c0d, 0x00002c3d,
-	0x00000057, 0x00000077, 0x00001efe, 0x00001eff,
-	0x0000ab7f, 0x000013af, 0x0000a7b2, 0x0000029d,
-	0x0001e90e, 0x0001e930, 0x0000aba0, 0x000013d0,
-	0x00000388, 0x000003ad, 0x00001f5b, 0x00001f53,
-	0x000104cf, 0x000104f7, 0x0000a65e, 0x0000a65f,
-	0x00016e50, 0x00016e70, 0x00000468, 0x00000469,
-	0x00010c99, 0x00010cd9, 0x000104cd, 0x000104f5,
-	0x000003a4, 0x000003c4, 0x00001fa5, 0x02000236,
-	0x0000ab94, 0x000013c4, 0x00002ce2, 0x00002ce3,
-	0x00002c2f, 0x00002c5f, 0x0000ab9b, 0x000013cb,
-	0x0000216e, 0x0000217e, 0x0000abad, 0x000013dd,
-	0x00002c06, 0x00002c36, 0x00000154, 0x00000155,
-	0x0000ff2b, 0x0000ff4b, 0x000004a8, 0x000004a9,
-	0x00000170, 0x00000171, 0x00001cac, 0x000010ec,
-	0x000003a8, 0x000003c8, 0x0000004a, 0x0000006a,
-	0x000118ae, 0x000118ce, 0x00002c8a, 0x00002c8b,
-	0x00001fa4, 0x02000233, 0x000118a0, 0x000118c0,
-	0x00010cab, 0x00010ceb, 0x00001faa, 0x02000245,
-	0x00016e53, 0x00016e73, 0x000001de, 0x000001df,
-	0x00001f69, 0x00001f61, 0x000004e8, 0x000004e9,
-	0x00001fb3, 0x0200025a, 0x00001c92, 0x000010d2,
-	0x0000216d, 0x0000217d, 0x000000d8, 0x000000f8,
-	0x0000abab, 0x000013db, 0x00002cb2, 0x00002cb3,
-	0x000010b5, 0x00002d15, 0x0000042f, 0x0000044f,
-	0x0000a7d8, 0x0000a7d9, 0x00001e04, 0x00001e05,
-	0x000024b8, 0x000024d2, 0x0000021e, 0x0000021f,
-	0x00010420, 0x00010448, 0x00010c8a, 0x00010cca,
-	0x00000210, 0x00000211, 0x00001eee, 0x00001eef,
-	0x0000ab70, 0x000013a0, 0x00001e8a, 0x00001e8b,
-	0x00000143, 0x00000144, 0x00000390, 0x0300019b,
-	0x0000a780, 0x0000a781, 0x0000ab9a, 0x000013ca,
-	0x00000100, 0x00000101, 0x00001efa, 0x00001efb,
-	0x00000248, 0x00000249, 0x000118ad, 0x000118cd,
-	0x00001f5d, 0x00001f55, 0x00002c92, 0x00002c93,
-	0x000003d0, 0x000003b2, 0x0001e904, 0x0001e926,
-	0x0001e911, 0x0001e933, 0x00001fd8, 0x00001fd0,
-	0x00000512, 0x00000513, 0x00000418, 0x00000438,
-	0x00000405, 0x00000455, 0x000004f6, 0x000004f7,
-	0x00002cd4, 0x00002cd5, 0x000000c1, 0x000000e1,
-	0x0000216f, 0x0000217f, 0x0000a79e, 0x0000a79f,
-	0x0000a78d, 0x00000265, 0x00001e32, 0x00001e33,
-	0x00010c98, 0x00010cd8, 0x0001041c, 0x00010444,
-	0x0000046e, 0x0000046f, 0x00000128, 0x00000129,
-	0x00000544, 0x00000574, 0x00002ccc, 0x00002ccd,
-	0x00001f82, 0x020001cd, 0x0000053e, 0x0000056e,
-	0x00002cba, 0x00002cbb, 0x00001ee2, 0x00001ee3,
-	0x000010c5, 0x00002d25, 0x0000a7b4, 0x0000a7b5,
-	0x00001e86, 0x00001e87, 0x0000ff2a, 0x0000ff4a,
-	0x00000226, 0x00000227, 0x00010590, 0x000105b7,
-	0x0000041c, 0x0000043c, 0x0000018a, 0x00000257,
-	0x00001e64, 0x00001e65, 0x00000051, 0x00000071,
-	0x00001e98, 0x020001ac, 0x00001e16, 0x00001e17,
-	0x00000398, 0x000003b8, 0x00001ca4, 0x000010e4,
-	0x0000a7ba, 0x0000a7bb, 0x00002c08, 0x00002c38,
-	0x0000053c, 0x0000056c, 0x00001ca1, 0x000010e1,
-	0x000104ba, 0x000104e2, 0x00002c21, 0x00002c51,
-	0x00000055, 0x00000075, 0x000118af, 0x000118cf,
-	0x0001e90c, 0x0001e92e, 0x0001e901, 0x0001e923,
-	0x000001e8, 0x000001e9, 0x00001e5e, 0x00001e5f,
-	0x00010413, 0x0001043b, 0x00000181, 0x00000253,
-	0x0001e91c, 0x0001e93e, 0x000118a3, 0x000118c3,
-	0x00010422, 0x0001044a, 0x00001e1c, 0x00001e1d,
-	0x0000020e, 0x0000020f, 0x000013fd, 0x000013f5,
-	0x00016e59, 0x00016e79, 0x00010ca5, 0x00010ce5,
-	0x00001fe9, 0x00001fe1, 0x0000037f, 0x000003f3,
-	0x0000015e, 0x0000015f, 0x00016e54, 0x00016e74,
-	0x000104bf, 0x000104e7, 0x00001cb5, 0x000010f5,
-	0x00000551, 0x00000581, 0x0000039e, 0x000003be,
-	0x00001c87, 0x00000463, 0x00001ffb, 0x00001f7d,
-	0x00002cbc, 0x00002cbd, 0x00001e0e, 0x00001e0f,
-	0x00000548, 0x00000578, 0x0000022c, 0x0000022d,
-	0x0001e91e, 0x0001e940, 0x00000532, 0x00000562,
-	0x00000160, 0x00000161, 0x00001fb7, 0x03000263,
-	0x0000ab9d, 0x000013cd, 0x000000d4, 0x000000f4,
-	0x00001e34, 0x00001e35, 0x000003de, 0x000003df,
-	0x00001fac, 0x0200024b, 0x0000aba4, 0x000013d4,
-	0x0001041d, 0x00010445, 0x00001e42, 0x00001e43,
-	0x00001ec0, 0x00001ec1, 0x000001cb, 0x000001cc,
-	0x00001ec2, 0x00001ec3, 0x00001fc7, 0x03000276,
-	0x0000a690, 0x0000a691, 0x0000ff37, 0x0000ff57,
-	0x000004b6, 0x000004b7, 0x00000114, 0x00000115,
-	0x000118a6, 0x000118c6, 0x00010415, 0x0001043d,
-	0x00000058, 0x00000078, 0x00000518, 0x00000519,
-	0x00002c1c, 0x00002c4c, 0x00001e8e, 0x00001e8f,
-	0x0000a7bc, 0x0000a7bd, 0x0000a7a8, 0x0000a7a9,
-	0x00010caf, 0x00010cef, 0x00016e5b, 0x00016e7b,
-	0x000000d5, 0x000000f5, 0x00001e18, 0x00001e19,
-	0x00016e5a, 0x00016e7a, 0x00000178, 0x000000ff,
-	0x00000241, 0x00000242, 0x00002cd8, 0x00002cd9,
-	0x0000a7c4, 0x0000a794, 0x0000054a, 0x0000057a,
-	0x0000fb00, 0x020002b1, 0x00001ece, 0x00001ecf,
-	0x00000408, 0x00000458, 0x00002c20, 0x00002c50,
-	0x00001ee6, 0x00001ee7, 0x0000aba1, 0x000013d1,
-	0x0000a72c, 0x0000a72d, 0x00001f49, 0x00001f41,
-	0x0000042d, 0x0000044d, 0x00000194, 0x00000263,
-	0x00000508, 0x00000509, 0x0000047c, 0x0000047d,
-	0x00001fa1, 0x0200022a, 0x000010a1, 0x00002d01,
-	0x00000172, 0x00000173, 0x00001eec, 0x00001eed,
-	0x000004da, 0x000004db, 0x000104b5, 0x000104dd,
-	0x00001e22, 0x00001e23, 0x0000040e, 0x0000045e,
-	0x0000a75e, 0x0000a75f, 0x00001fb4, 0x0200025d,
-	0x00000524, 0x00000525, 0x0000ff35, 0x0000ff55,
-	0x00002c80, 0x00002c81, 0x000004d0, 0x000004d1,
-	0x000000d1, 0x000000f1, 0x000010b6, 0x00002d16,
-	0x00000498, 0x00000499, 0x00002c09, 0x00002c39,
-	0x0000039d, 0x000003bd, 0x00002c86, 0x00002c87,
-	0x00001e96, 0x020001a6, 0x000010c7, 0x00002d27,
-	0x00000130, 0x02000192, 0x000104c8, 0x000104f0,
-	0x00000179, 0x0000017a, 0x0000a7b0, 0x0000029e,
-	0x00001fbb, 0x00001f71, 0x00002cc4, 0x00002cc5,
-	0x00001feb, 0x00001f7b, 0x00001ebe, 0x00001ebf,
-	0x000118bc, 0x000118dc, 0x00000246, 0x00000247,
-	0x000010c4, 0x00002d24, 0x0000ab79, 0x000013a9,
-	0x00001ed6, 0x00001ed7, 0x000010be, 0x00002d1e,
-	0x00010405, 0x0001042d, 0x000013fb, 0x000013f3,
-	0x000004c0, 0x000004cf, 0x0000a754, 0x0000a755,
-	0x00001e62, 0x00001e63, 0x00000534, 0x00000564,
-	0x0000a740, 0x0000a741, 0x0001e914, 0x0001e936,
-	0x000000c3, 0x000000e3, 0x0000a7be, 0x0000a7bf,
-	0x000003f7, 0x000003f8, 0x00010575, 0x0001059c,
-	0x00001f1a, 0x00001f12, 0x00000494, 0x00000495,
-	0x0000016c, 0x0000016d, 0x00001e3a, 0x00001e3b,
-	0x00001e36, 0x00001e37, 0x0000005a, 0x0000007a,
-	0x0000053a, 0x0000056a, 0x00001f4d, 0x00001f45,
-	0x0000a694, 0x0000a695, 0x0000ab75, 0x000013a5,
-	0x000001fe, 0x000001ff, 0x00001fe8, 0x00001fe0,
-	0x0001058a, 0x000105b1, 0x000003e4, 0x000003e5,
-	0x0000a74a, 0x0000a74b, 0x00001f91, 0x020001fa,
-	0x00002c25, 0x00002c55, 0x00001e76, 0x00001e77,
-	0x000010a4, 0x00002d04, 0x00000147, 0x00000148,
-	0x00002c29, 0x00002c59, 0x0000ff26, 0x0000ff46,
-	0x0000a74c, 0x0000a74d, 0x00001fd9, 0x00001fd1,
-	0x000004a2, 0x000004a3, 0x0000014e, 0x0000014f,
-	0x00001c88, 0x0000a64b, 0x00000464, 0x00000465,
-	0x0000ab71, 0x000013a1, 0x000003d1, 0x000003b8,
-	0x00001cbd, 0x000010fd, 0x0000a748, 0x0000a749,
-	0x000010b0, 0x00002d10, 0x00002c10, 0x00002c40,
-	0x0000a688, 0x0000a689, 0x0000ff33, 0x0000ff53,
-	0x0000212a, 0x0000006b, 0x0000aba7, 0x000013d7,
-	0x00000149, 0x02000195, 0x0000a65a, 0x0000a65b,
-	0x00001cba, 0x000010fa, 0x00000427, 0x00000447,
-	0x00001f88, 0x020001df, 0x0001e906, 0x0001e928,
-	0x000001f6, 0x00000195, 0x00001f18, 0x00001f10,
-	0x00010ca2, 0x00010ce2, 0x0000038c, 0x000003cc,
-	0x00001e26, 0x00001e27, 0x0001041e, 0x00010446,
-	0x0000216a, 0x0000217a, 0x00001fae, 0x02000251,
-	0x000024c8, 0x000024e2, 0x000001d9, 0x000001da,
-	0x00001e6c, 0x00001e6d, 0x0000abb8, 0x000013e8,
-	0x00000126, 0x00000127, 0x0000abb1, 0x000013e1,
-	0x00000410, 0x00000430, 0x00000046, 0x00000066,
-	0x0000ab78, 0x000013a8, 0x00002c13, 0x00002c43,
-	0x00001e97, 0x020001a9, 0x0000004d, 0x0000006d,
-	0x000118a7, 0x000118c7, 0x00002c1f, 0x00002c4f,
-	0x00016e51, 0x00016e71, 0x0000a646, 0x0000a647,
-	0x00001f3e, 0x00001f36, 0x000004e4, 0x000004e5,
-	0x0000aba3, 0x000013d3, 0x00001e72, 0x00001e73,
-	0x0001058d, 0x000105b4, 0x00010ca7, 0x00010ce7,
-	0x000104cc, 0x000104f4, 0x000001fc, 0x000001fd,
-	0x00001edc, 0x00001edd, 0x00001ca3, 0x000010e3,
-	0x00002c14, 0x00002c44, 0x00001e9b, 0x00001e61,
-	0x000010ae, 0x00002d0e, 0x0000021a, 0x0000021b,
-	0x00001f9a, 0x02000215, 0x0001040d, 0x00010435,
-	0x00000162, 0x00000163, 0x000001b5, 0x000001b6,
-	0x00010411, 0x00010439, 0x00001f90, 0x020001f7,
-	0x0000054e, 0x0000057e, 0x000001ac, 0x000001ad,
-	0x00001f1c, 0x00001f14, 0x0001040c, 0x00010434,
-	0x0000a782, 0x0000a783, 0x00001cbf, 0x000010ff,
-	0x000010c1, 0x00002d21, 0x0000216c, 0x0000217c,
-	0x00001f2b, 0x00001f23, 0x00002c8e, 0x00002c8f,
-	0x00000198, 0x00000199, 0x00001ea0, 0x00001ea1,
-	0x0001e919, 0x0001e93b, 0x00001ff6, 0x020002a7,
-	0x00000504, 0x00000505, 0x000003ee, 0x000003ef,
-	0x00001f95, 0x02000206, 0x00010c9c, 0x00010cdc,
-	0x00002ca8, 0x00002ca9, 0x0000a68e, 0x0000a68f,
-	0x000118a4, 0x000118c4, 0x00000394, 0x000003b4,
-	0x00000556, 0x00000586, 0x00001f59, 0x00001f51,
-	0x00000543, 0x00000573, 0x00001f9d, 0x0200021e,
-	0x0001057c, 0x000105a3, 0x00010c8b, 0x00010ccb,
-	0x000118b0, 0x000118d0, 0x0000042e, 0x0000044e,
-	0x000000d3, 0x000000f3, 0x00000554, 0x00000584,
-	0x00002cb6, 0x00002cb7, 0x000010b3, 0x00002d13,
-	0x00000542, 0x00000572, 0x00002c16, 0x00002c46,
-	0x00001e10, 0x00001e11, 0x0000040c, 0x0000045c,
-	0x00000218, 0x00000219, 0x00001f29, 0x00001f21,
-	0x0001e921, 0x0001e943, 0x0000a664, 0x0000a665,
-	0x00001e24, 0x00001e25, 0x0000016a, 0x0000016b,
-	0x00001ee4, 0x00001ee5, 0x00000547, 0x00000577,
-	0x000001a4, 0x000001a5, 0x00001f83, 0x020001d0,
-	0x0000ab8b, 0x000013bb, 0x0000a79a, 0x0000a79b,
-	0x00001e74, 0x00001e75, 0x0000a684, 0x0000a685,
-	0x0000a73c, 0x0000a73d, 0x00001f38, 0x00001f30,
-	0x0001058f, 0x000105b6, 0x000001ca, 0x000001cc,
-	0x00001f89, 0x020001e2, 0x0000aba5, 0x000013d5,
-	0x00000174, 0x00000175, 0x000003f5, 0x000003b5,
-	0x00000414, 0x00000434, 0x00000050, 0x00000070,
-	0x00016e5c, 0x00016e7c, 0x00000102, 0x00000103,
-	0x00002c94, 0x00002c95, 0x000010c0, 0x00002d20,
-	0x00000220, 0x0000019e, 0x00002c05, 0x00002c35,
-	0x00016e55, 0x00016e75, 0x00000152, 0x00000153,
-	0x0001041a, 0x00010442, 0x000004ee, 0x000004ef,
-	0x00000535, 0x00000565, 0x000004f8, 0x000004f9,
-	0x0000216b, 0x0000217b, 0x00001f80, 0x020001c7,
-	0x0000ab93, 0x000013c3, 0x00002cb8, 0x00002cb9,
-	0x00002ced, 0x00002cee, 0x0000ab82, 0x000013b2,
-	0x00002c22, 0x00002c52, 0x00001e0a, 0x00001e0b,
-	0x00002c00, 0x00002c30, 0x0000a724, 0x0000a725,
-	0x00001c93, 0x000010d3, 0x00000522, 0x00000523,
-	0x00010c9b, 0x00010cdb, 0x00001eba, 0x00001ebb,
-	0x0000042b, 0x0000044b, 0x000000d0, 0x000000f0,
-	0x00001cb2, 0x000010f2, 0x000003da, 0x000003db,
-	0x0000012e, 0x0000012f, 0x000118b6, 0x000118d6,
-	0x0000a786, 0x0000a787, 0x000013fa, 0x000013f2,
-	0x0000ab87, 0x000013b7, 0x0000a68c, 0x0000a68d,
-	0x00001f6b, 0x00001f63, 0x0000ab7c, 0x000013ac,
-	0x000024c7, 0x000024e1, 0x0000abb3, 0x000013e3,
-	0x0000abae, 0x000013de, 0x00000110, 0x00000111,
-	0x00000397, 0x000003b7, 0x000003f0, 0x000003ba,
-	0x000000d9, 0x000000f9, 0x00001f8f, 0x020001f4,
-	0x00000392, 0x000003b2, 0x00001fd7, 0x03000288,
-	0x000003a1, 0x000003c1, 0x0000a7a4, 0x0000a7a5,
-	0x0000fb16, 0x020002d1, 0x000024b6, 0x000024d0,
-	0x00001cb1, 0x000010f1, 0x00000411, 0x00000431,
-	0x000004b2, 0x000004b3, 0x00000150, 0x00000151,
-	0x000024c3, 0x000024dd, 0x000104b8, 0x000104e0,
-	0x00001f84, 0x020001d3, 0x00010cac, 0x00010cec,
-	0x00002c88, 0x00002c89, 0x000010b1, 0x00002d11,
-	0x00000492, 0x00000493, 0x000000cc, 0x000000ec,
-	0x0000a7c2, 0x0000a7c3, 0x0000004b, 0x0000006b,
-	0x0000a76c, 0x0000a76d, 0x0000a792, 0x0000a793,
-	0x000001a9, 0x00000283, 0x00000190, 0x0000025b,
-	0x00000409, 0x00000459, 0x0001e907, 0x0001e929,
-	0x00010cb1, 0x00010cf1, 0x0000abb5, 0x000013e5,
-	0x000003a6, 0x000003c6, 0x0000a744, 0x0000a745,
-	0x000010aa, 0x00002d0a, 0x00002c64, 0x0000027d,
-	0x00001c97, 0x000010d7, 0x0000039b, 0x000003bb,
-	0x000118b3, 0x000118d3, 0x00001fab, 0x02000248,
-	0x00000502, 0x00000503, 0x00010c9a, 0x00010cda,
-	0x00001ef4, 0x00001ef5, 0x00000415, 0x00000435,
-	0x00001fe6, 0x02000297, 0x000024ce, 0x000024e8,
-	0x0000016e, 0x0000016f, 0x00001f4a, 0x00001f42,
-	0x0000abbc, 0x000013ec, 0x00002ca4, 0x00002ca5,
-	0x00001eca, 0x00001ecb, 0x0000ff25, 0x0000ff45,
-	0x00010425, 0x0001044d, 0x00001fb8, 0x00001fb0,
-	0x0000ff28, 0x0000ff48, 0x00001cad, 0x000010ed,
-	0x00001e5c, 0x00001e5d, 0x00002c04, 0x00002c34,
-	0x000001f0, 0x02000198, 0x00001c80, 0x00000432,
-	0x00002cca, 0x00002ccb, 0x00001f86, 0x020001d9,
-	0x00000536, 0x00000566, 0x0000fb02, 0x020002b7,
-	0x00001eda, 0x00001edb, 0x000010ba, 0x00002d1a,
-	0x0000a752, 0x0000a753, 0x00010572, 0x00010599,
-	0x0000ab8a, 0x000013ba, 0x0000022e, 0x0000022f,
-	0x0000017b, 0x0000017c, 0x00000426, 0x00000446,
-	0x00000116, 0x00000117, 0x0000a686, 0x0000a687,
-	0x000118be, 0x000118de, 0x00001fec, 0x00001fe5,
-	0x000003f1, 0x000003c1, 0x00010571, 0x00010598,
-	0x00001f9f, 0x02000224, 0x0000abbb, 0x000013eb,
-	0x00002c1e, 0x00002c4e, 0x00001ec4, 0x00001ec5,
-	0x000004de, 0x000004df, 0x0000a76e, 0x0000a76f,
-	0x0000038f, 0x000003ce, 0x00001e30, 0x00001e31,
-	0x0000012c, 0x0000012d, 0x000004c1, 0x000004c2,
-	0x000004bc, 0x000004bd, 0x000001cf, 0x000001d0,
-	0x00001e56, 0x00001e57, 0x00001fad, 0x0200024e,
-	0x000000ca, 0x000000ea, 0x000001d7, 0x000001d8,
-	0x00000232, 0x00000233, 0x00001c9f, 0x000010df,
-	0x00002183, 0x00002184, 0x000003ec, 0x000003ed,
-	0x0000ab77, 0x000013a7, 0x00002c67, 0x00002c68,
-	0x0000a648, 0x0000a649, 0x0000054c, 0x0000057c,
-	0x000104c5, 0x000104ed, 0x00000539, 0x00000569,
-	0x000010ab, 0x00002d0b, 0x00000413, 0x00000433,
-	0x00001f92, 0x020001fd, 0x0000040b, 0x0000045b,
+	0x000024b9, 0x000024d3, 0x0000aba6, 0x000013d6,
+	0x0000ab94, 0x000013c4, 0x00000045, 0x00000065,
+	0x0000018e, 0x000001dd, 0x00001e10, 0x00001e11,
+	0x000004ba, 0x000004bb, 0x000003e6, 0x000003e7,
+	0x000010a3, 0x00002d03, 0x00000224, 0x00000225,
+	0x00010c8b, 0x00010ccb, 0x00001fe9, 0x00001fe1,
+	0x00001e5e, 0x00001e5f, 0x0000ff36, 0x0000ff56,
+	0x0000a754, 0x0000a755, 0x0000020c, 0x0000020d,
+	0x0000a642, 0x0000a643, 0x00001eaa, 0x00001eab,
+	0x00001ed8, 0x00001ed9, 0x0000023e, 0x00002c66,
+	0x00001c9b, 0x000010db, 0x00000187, 0x00000188,
+	0x000010a2, 0x00002d02, 0x00001fbe, 0x000003b9,
+	0x000004e0, 0x000004e1, 0x00001e12, 0x00001e13,
+	0x000001f8, 0x000001f9, 0x000000c3, 0x000000e3,
+	0x00001f8f, 0x020001f4, 0x00001e00, 0x00001e01,
+	0x00001e1a, 0x00001e1b, 0x00010c8c, 0x00010ccc,
+	0x0000a750, 0x0000a751, 0x000010a0, 0x00002d00,
+	0x00002c80, 0x00002c81, 0x0000ff33, 0x0000ff53,
+	0x00001c9a, 0x000010da, 0x00001fcc, 0x0200027a,
+	0x0000011c, 0x0000011d, 0x0000053d, 0x0000056d,
+	0x0000ff2b, 0x0000ff4b, 0x00001f2e, 0x00001f26,
+	0x000000d4, 0x000000f4, 0x00010cb2, 0x00010cf2,
+	0x000001b2, 0x0000028b, 0x0000a72a, 0x0000a72b,
+	0x0000abb8, 0x000013e8, 0x0000ab91, 0x000013c1,
+	0x00010c8d, 0x00010ccd, 0x00001ea8, 0x00001ea9,
+	0x0000041b, 0x0000043b, 0x0000a728, 0x0000a729,
+	0x00001e38, 0x00001e39, 0x000003d8, 0x000003d9,
+	0x0000a77b, 0x0000a77c, 0x0000a792, 0x0000a793,
+	0x00001e02, 0x00001e03, 0x0000a666, 0x0000a667,
+	0x00001ed0, 0x00001ed1, 0x00000466, 0x00000467,
+	0x00001fc8, 0x00001f72, 0x00000152, 0x00000153,
+	0x000001f6, 0x00000195, 0x00010c89, 0x00010cc9,
+	0x0000aba7, 0x000013d7, 0x000104c3, 0x000104eb,
+	0x0000fb00, 0x020002b1, 0x000001ec, 0x000001ed,
+	0x0000a79c, 0x0000a79d, 0x00000538, 0x00000568,
+	0x00001e26, 0x00001e27, 0x00001e9b, 0x00001e61,
+	0x0000a779, 0x0000a77a, 0x0000a76c, 0x0000a76d,
+	0x00000421, 0x00000441, 0x0000a644, 0x0000a645,
+	0x0000041a, 0x0000043a, 0x0001e901, 0x0001e923,
+	0x0000a734, 0x0000a735, 0x00000141, 0x00000142,
+	0x0000a680, 0x0000a681, 0x00001f08, 0x00001f00,
+	0x000004a8, 0x000004a9, 0x0000a7b1, 0x00000287,
+	0x0000053c, 0x0000056c, 0x0001058c, 0x000105b3,
+	0x000000c2, 0x000000e2, 0x00001fa0, 0x02000227,
+	0x000118ab, 0x000118cb, 0x00001c86, 0x0000044a,
+	0x00000222, 0x00000223, 0x0000a7be, 0x0000a7bf,
+	0x00001f4b, 0x00001f43, 0x00001e6a, 0x00001e6b,
+	0x000003a9, 0x000003c9, 0x00016e41, 0x00016e61,
+	0x000001b1, 0x0000028a, 0x00000134, 0x00000135,
+	0x0000a68c, 0x0000a68d, 0x00001ef6, 0x00001ef7,
+	0x00001f6b, 0x00001f63, 0x000001cb, 0x000001cc,
+	0x00016e5f, 0x00016e7f, 0x0000a744, 0x0000a745,
+	0x0000ab80, 0x000013b0, 0x000004ea, 0x000004eb,
+	0x00000197, 0x00000268, 0x0000013f, 0x00000140,
+	0x0000022c, 0x0000022d, 0x00001f89, 0x020001e2,
+	0x00001fd8, 0x00001fd0, 0x000003a0, 0x000003c0,
+	0x00001ee0, 0x00001ee1, 0x00002167, 0x00002177,
+	0x000000d3, 0x000000f3, 0x00002c86, 0x00002c87,
+	0x0000ff39, 0x0000ff59, 0x0000ab74, 0x000013a4,
+	0x0000aba3, 0x000013d3, 0x000013f8, 0x000013f0,
+	0x0000018b, 0x0000018c, 0x000010b5, 0x00002d15,
+	0x00001f3a, 0x00001f32, 0x00001fa3, 0x02000230,
+	0x0001e917, 0x0001e939, 0x00002c0d, 0x00002c3d,
+	0x0000ff2c, 0x0000ff4c, 0x0000abb6, 0x000013e6,
+	0x0001057f, 0x000105a6, 0x0000039e, 0x000003be,
+	0x00010586, 0x000105ad, 0x000010be, 0x00002d1e,
+	0x00001fc9, 0x00001f73, 0x00001e3a, 0x00001e3b,
+	0x0000aba5, 0x000013d5, 0x00001ff8, 0x00001f78,
+	0x0001e919, 0x0001e93b, 0x0000010e, 0x0000010f,
+	0x00002cc8, 0x00002cc9, 0x0000ab88, 0x000013b8,
+	0x00000470, 0x00000471, 0x00000394, 0x000003b4,
+	0x00000156, 0x00000157, 0x000024ba, 0x000024d4,
+	0x00000043, 0x00000063, 0x000004be, 0x000004bf,
+	0x00000130, 0x02000192, 0x0001e911, 0x0001e933,
+	0x00000132, 0x00000133, 0x0000a780, 0x0000a781,
+	0x00001fb7, 0x03000263, 0x000001cd, 0x000001ce,
+	0x000003c2, 0x000003c3, 0x00010583, 0x000105aa,
+	0x00001cb5, 0x000010f5, 0x000004cd, 0x000004ce,
+	0x0000a654, 0x0000a655, 0x00000412, 0x00000432,
+	0x00001cb6, 0x000010f6, 0x00001c90, 0x000010d0,
+	0x00010411, 0x00010439, 0x0000a7d6, 0x0000a7d7,
+	0x00001f0a, 0x00001f02, 0x0000ab95, 0x000013c5,
+	0x0000013d, 0x0000013e, 0x000001e4, 0x000001e5,
+	0x000001de, 0x000001df, 0x0000004f, 0x0000006f,
+	0x00010417, 0x0001043f, 0x00001ee2, 0x00001ee3,
+	0x00002c0c, 0x00002c3c, 0x00000226, 0x00000227,
+	0x0000216d, 0x0000217d, 0x00001f49, 0x00001f41,
+	0x00001c9f, 0x000010df, 0x000118ac, 0x000118cc,
+	0x00000050, 0x00000070, 0x000024b6, 0x000024d0,
+	0x0000a64c, 0x0000a64d, 0x000118a9, 0x000118c9,
+	0x00001e94, 0x00001e95, 0x00001e08, 0x00001e09,
+	0x00010ca5, 0x00010ce5, 0x00000179, 0x0000017a,
+	0x00001ca2, 0x000010e2, 0x00010c87, 0x00010cc7,
+	0x000004e2, 0x000004e3, 0x00001c98, 0x000010d8,
+	0x000001c8, 0x000001c9, 0x00001c9e, 0x000010de,
+	0x000001c5, 0x000001c6, 0x00001fda, 0x00001f76,
+	0x00001c95, 0x000010d5, 0x00001cb8, 0x000010f8,
+	0x000024c6, 0x000024e0, 0x00000191, 0x00000192,
+	0x00002c90, 0x00002c91, 0x0000ff2d, 0x0000ff4d,
+	0x00010c9e, 0x00010cde, 0x0000abb5, 0x000013e5,
+	0x0000aba1, 0x000013d1, 0x00002cde, 0x00002cdf,
+	0x00001ee4, 0x00001ee5, 0x00001f86, 0x020001d9,
+	0x000004c0, 0x000004cf, 0x00000370, 0x00000371,
+	0x0000041f, 0x0000043f, 0x0000017d, 0x0000017e,
+	0x000024c5, 0x000024df, 0x00010424, 0x0001044c,
+	0x0000a7da, 0x0000a7db, 0x0000004c, 0x0000006c,
+	0x00000041, 0x00000061, 0x000104b0, 0x000104d8,
+	0x00001e36, 0x00001e37, 0x000003da, 0x000003db,
+	0x000004b8, 0x000004b9, 0x00001c81, 0x00000434,
+	0x00000118, 0x00000119, 0x0000a668, 0x0000a669,
+	0x00010592, 0x000105b9, 0x000004ec, 0x000004ed,
+	0x00010c96, 0x00010cd6, 0x0000014c, 0x0000014d,
+	0x0000016a, 0x0000016b, 0x000000ca, 0x000000ea,
+	0x000004b6, 0x000004b7, 0x0000054f, 0x0000057f,
+	0x0000ab7b, 0x000013ab, 0x00000587, 0x020001a3,
+	0x00010ca3, 0x00010ce3, 0x00001fb4, 0x0200025d,
+	0x00001f29, 0x00001f21, 0x000003f7, 0x000003f8,
+	0x00002c69, 0x00002c6a, 0x0000a7b8, 0x0000a7b9,
+	0x000010c1, 0x00002d21, 0x00002cb2, 0x00002cb3,
+	0x0000042b, 0x0000044b, 0x0001e903, 0x0001e925,
+	0x0001041d, 0x00010445, 0x000118b8, 0x000118d8,
+	0x00010595, 0x000105bc, 0x0000ff24, 0x0000ff44,
+	0x000004aa, 0x000004ab, 0x00010c80, 0x00010cc0,
+	0x00000196, 0x00000269, 0x000024ca, 0x000024e4,
+	0x0000a738, 0x0000a739, 0x00001fa7, 0x0200023c,
+	0x00001e99, 0x020001af, 0x00000243, 0x00000180,
+	0x000104cb, 0x000104f3, 0x00010c91, 0x00010cd1,
+	0x0000ff30, 0x0000ff50, 0x00001fb6, 0x02000260,
+	0x00000400, 0x00000450, 0x0000a76a, 0x0000a76b,
+	0x00010c95, 0x00010cd5, 0x0000a652, 0x0000a653,
+	0x00002ce0, 0x00002ce1, 0x00001ca0, 0x000010e0,
+	0x0000a736, 0x0000a737, 0x00000372, 0x00000373,
+	0x000000c6, 0x000000e6, 0x000104b1, 0x000104d9,
+	0x00001fb2, 0x02000257, 0x000004f4, 0x000004f5,
+	0x000010a4, 0x00002d04, 0x00001e7e, 0x00001e7f,
+	0x0000041d, 0x0000043d, 0x0000016c, 0x0000016d,
+	0x00002cd8, 0x00002cd9, 0x00001fab, 0x02000248,
+	0x0001e906, 0x0001e928, 0x0001e902, 0x0001e924,
+	0x0000a768, 0x0000a769, 0x0000a7ac, 0x00000261,
+	0x00001e98, 0x020001ac, 0x0000abbc, 0x000013ec,
+	0x0000fb17, 0x020002d4, 0x00010d59, 0x00010d79,
+	0x00002cd6, 0x00002cd7, 0x00001eba, 0x00001ebb,
+	0x00001ee6, 0x00001ee7, 0x000004d0, 0x000004d1,
+	0x00001cb7, 0x000010f7, 0x000118b3, 0x000118d3,
+	0x0000a724, 0x0000a725, 0x0000a7c2, 0x0000a7c3,
+	0x0000051c, 0x0000051d, 0x00000392, 0x000003b2,
+	0x00010d64, 0x00010d84, 0x00000056, 0x00000076,
+	0x00001fcb, 0x00001f75, 0x00002161, 0x00002171,
+	0x00001e8c, 0x00001e8d, 0x000001cf, 0x000001d0,
+	0x00010576, 0x0001059d, 0x0000015a, 0x0000015b,
+	0x00002cca, 0x00002ccb, 0x00001e82, 0x00001e83,
+	0x00000472, 0x00000473, 0x00001c88, 0x0000a64b,
+	0x00000158, 0x00000159, 0x00010c84, 0x00010cc4,
+	0x00001f2c, 0x00001f24, 0x00001f68, 0x00001f60,
+	0x000003b0, 0x0300019f, 0x000104be, 0x000104e6,
+	0x00000147, 0x00000148, 0x0000a78d, 0x00000265,
+	0x00002c20, 0x00002c50, 0x00001ca6, 0x000010e6,
+	0x0000abb3, 0x000013e3, 0x00010413, 0x0001043b,
+	0x00000395, 0x000003b5, 0x00010418, 0x00010440,
+	0x0000a656, 0x0000a657, 0x00000414, 0x00000434,
+	0x00000462, 0x00000463, 0x000003ff, 0x0000037d,
+	0x00000534, 0x00000564, 0x00010d62, 0x00010d82,
+	0x00001fba, 0x00001f70, 0x000118a4, 0x000118c4,
+	0x00010c8f, 0x00010ccf, 0x00000128, 0x00000129,
+	0x00001c87, 0x00000463, 0x00001f5d, 0x00001f55,
+	0x00001f9b, 0x02000218, 0x00010581, 0x000105a8,
+	0x000001f1, 0x000001f3, 0x00000228, 0x00000229,
+	0x000104cc, 0x000104f4, 0x00002c11, 0x00002c41,
+	0x00001e9a, 0x020001b2, 0x0000048e, 0x0000048f,
+	0x000104c6, 0x000104ee, 0x0000ff32, 0x0000ff52,
+	0x00002c0e, 0x00002c3e, 0x000010bd, 0x00002d1d,
+	0x00001e62, 0x00001e63, 0x00000547, 0x00000577,
+	0x0000abab, 0x000013db, 0x00016e49, 0x00016e69,
+	0x00016e54, 0x00016e74, 0x00016e40, 0x00016e60,
+	0x000004e4, 0x000004e5, 0x000024c3, 0x000024dd,
+	0x00000102, 0x00000103, 0x00000214, 0x00000215,
+	0x00001f93, 0x02000200, 0x0000050a, 0x0000050b,
+	0x00001e5c, 0x00001e5d, 0x000024cf, 0x000024e9,
+	0x00002169, 0x00002179, 0x0000005a, 0x0000007a,
+	0x00002c92, 0x00002c93, 0x00001e90, 0x00001e91,
+	0x0000ab78, 0x000013a8, 0x00001f9a, 0x02000215,
+	0x00000120, 0x00000121, 0x00000168, 0x00000169,
+	0x00001fbc, 0x02000267, 0x0000a7c4, 0x0000a794,
+	0x00000399, 0x000003b9, 0x00001e40, 0x00001e41,
+	0x000004fe, 0x000004ff, 0x0000a7aa, 0x00000266,
+	0x0000abbe, 0x000013ee, 0x00001c99, 0x000010d9,
+	0x000024cd, 0x000024e7, 0x000104bc, 0x000104e4,
+	0x00010570, 0x00010597, 0x000000c1, 0x000000e1,
+	0x00002c82, 0x00002c83, 0x000003dc, 0x000003dd,
+	0x00000424, 0x00000444, 0x0000aba2, 0x000013d2,
+	0x00000506, 0x00000507, 0x0000ff2f, 0x0000ff4f,
+	0x00001f6d, 0x00001f65, 0x000118af, 0x000118cf,
+	0x000003e8, 0x000003e9, 0x0000015e, 0x0000015f,
+	0x0000012a, 0x0000012b, 0x0000004b, 0x0000006b,
+	0x00002c2b, 0x00002c5b, 0x00000536, 0x00000566,
+	0x00010d5f, 0x00010d7f, 0x000001f0, 0x02000198,
+	0x000000d2, 0x000000f2, 0x00001eec, 0x00001eed,
+	0x00001e2a, 0x00001e2b, 0x00001e04, 0x00001e05,
+	0x00001cb2, 0x000010f2, 0x00010c88, 0x00010cc8,
+	0x00002ce2, 0x00002ce3, 0x00016e48, 0x00016e68,
+	0x00000406, 0x00000456, 0x0001e905, 0x0001e927,
+	0x0000abb7, 0x000013e7, 0x00001ca7, 0x000010e7,
+	0x00016e56, 0x00016e76, 0x00001ff2, 0x0200029e,
+	0x000004ac, 0x000004ad, 0x00010cad, 0x00010ced,
+	0x00010cac, 0x00010cec, 0x00016e46, 0x00016e66,
+	0x00001f5b, 0x00001f53, 0x0000abb0, 0x000013e0,
+	0x00001e4e, 0x00001e4f, 0x000001b5, 0x000001b6,
+	0x0000022e, 0x0000022f, 0x0000a74c, 0x0000a74d,
+	0x000104b2, 0x000104da, 0x00001ca3, 0x000010e3,
+	0x00000402, 0x00000452, 0x0000a732, 0x0000a733,
+	0x00010d51, 0x00010d71, 0x000000d0, 0x000000f0,
+	0x0000a690, 0x0000a691, 0x00001efa, 0x00001efb,
+	0x0000aba4, 0x000013d4, 0x0000a7ad, 0x0000026c,
+	0x00016e5d, 0x00016e7d, 0x0001058e, 0x000105b5,
+	0x0000ab84, 0x000013b4, 0x0001040c, 0x00010434,
+	0x00001e56, 0x00001e57, 0x0000017b, 0x0000017c,
+	0x00000212, 0x00000213, 0x00001f6a, 0x00001f62,
+	0x00001cb3, 0x000010f3, 0x000003a4, 0x000003c4,
+	0x0000037f, 0x000003f3, 0x000118a8, 0x000118c8,
+	0x00000420, 0x00000440, 0x00002cda, 0x00002cdb,
+	0x0000ab9e, 0x000013ce, 0x00000492, 0x00000493,
+	0x00010c9c, 0x00010cdc, 0x0000fb04, 0x030002be,
+	0x00016e4f, 0x00016e6f, 0x0000a646, 0x0000a647,
+	0x0000ab73, 0x000013a3, 0x000004d2, 0x000004d3,
+	0x000003ee, 0x000003ef, 0x000001b8, 0x000001b9,
+	0x00002132, 0x0000214e, 0x00001f84, 0x020001d3,
+	0x00000549, 0x00000579, 0x00001fea, 0x00001f7a,
+	0x0000fb15, 0x020002ce, 0x00002166, 0x00002176,
+	0x0000a7ae, 0x0000026a, 0x00000428, 0x00000448,
+	0x00001ea4, 0x00001ea5, 0x00001c84, 0x00000442,
+	0x000004c5, 0x000004c6, 0x000000db, 0x000000fb,
+	0x00002ccc, 0x00002ccd, 0x00001ed4, 0x00001ed5,
+	0x00000474, 0x00000475, 0x00000245, 0x0000028c,
+	0x00010cb0, 0x00010cf0, 0x00002162, 0x00002172,
+	0x00001f0c, 0x00001f04, 0x00001f6c, 0x00001f64,
+	0x0000a7cc, 0x0000a7cd, 0x00000391, 0x000003b1,
+	0x0001e91b, 0x0001e93d, 0x00010d58, 0x00010d78,
+	0x00002c22, 0x00002c52, 0x00001e18, 0x00001e19,
+	0x00001e76, 0x00001e77, 0x00016e58, 0x00016e78,
+	0x0000020a, 0x0000020b, 0x0001041f, 0x00010447,
+	0x0000a658, 0x0000a659, 0x00001ec2, 0x00001ec3,
+	0x00002183, 0x00002184, 0x000000d1, 0x000000f1,
+	0x0000014e, 0x0000014f, 0x000004c3, 0x000004c4,
+	0x00001f0b, 0x00001f03, 0x0000a726, 0x0000a727,
+	0x00001ca8, 0x000010e8, 0x00001e7a, 0x00001e7b,
+	0x0000ab99, 0x000013c9, 0x00000053, 0x00000073,
+	0x00001fa4, 0x02000233, 0x00001fa1, 0x0200022a,
+	0x00001eac, 0x00001ead, 0x00010d57, 0x00010d77,
+	0x000104b4, 0x000104dc, 0x0001040d, 0x00010435,
+	0x00000405, 0x00000455, 0x00001edc, 0x00001edd,
+	0x000118bb, 0x000118db, 0x000001d3, 0x000001d4,
+	0x00002c05, 0x00002c35, 0x00002cf2, 0x00002cf3,
+	0x0000041e, 0x0000043e, 0x00001f6f, 0x00001f67,
+	0x0000ab71, 0x000013a1, 0x00016e5b, 0x00016e7b,
+	0x000104d2, 0x000104fa, 0x00001f4d, 0x00001f45,
+	0x00001ffc, 0x020002ae, 0x00010421, 0x00010449,
+	0x000001ca, 0x000001cc, 0x0000021e, 0x0000021f,
+	0x00001f95, 0x02000206, 0x00001fdb, 0x00001f77,
+	0x00001eca, 0x00001ecb, 0x00001fc4, 0x02000270,
+	0x00010578, 0x0001059f, 0x000000de, 0x000000fe,
+	0x00002c94, 0x00002c95, 0x00000554, 0x00000584,
+	0x000118ae, 0x000118ce, 0x0000aba0, 0x000013d0,
+	0x00000122, 0x00000123, 0x0000a7b3, 0x0000ab53,
+	0x0000040d, 0x0000045d, 0x0000048a, 0x0000048b,
+	0x00001fac, 0x0200024b, 0x00000248, 0x00000249,
+	0x00000166, 0x00000167, 0x00000541, 0x00000571,
+	0x00001f83, 0x020001d0, 0x00002c26, 0x00002c56,
+	0x00001e72, 0x00001e73, 0x000104bd, 0x000104e5,
+	0x0000a78b, 0x0000a78c, 0x000000c5, 0x000000e5,
+	0x00000522, 0x00000523, 0x000003de, 0x000003df,
+	0x00001c82, 0x0000043e, 0x0000ab9d, 0x000013cd,
+	0x00000116, 0x00000117, 0x0000a66c, 0x0000a66d,
+	0x00001ed6, 0x00001ed7, 0x0000047e, 0x0000047f,
+	0x00000198, 0x00000199, 0x000118a7, 0x000118c7,
+	0x000001ae, 0x00000288, 0x00000047, 0x00000067,
+	0x00001f92, 0x020001fd, 0x0000050c, 0x0000050d,
+	0x00000396, 0x000003b6, 0x000001f2, 0x000001f3,
+	0x00002c25, 0x00002c55, 0x000000b5, 0x000003bc,
+	0x00001e97, 0x020001a9, 0x00001e4c, 0x00001e4d,
+	0x00000393, 0x000003b3, 0x00010caa, 0x00010cea,
+	0x000118bf, 0x000118df, 0x00002cb4, 0x00002cb5,
+	0x00001ec0, 0x00001ec1, 0x0001e907, 0x0001e929,
+	0x0001e918, 0x0001e93a, 0x0000fb01, 0x020002b4,
+	0x00002c08, 0x00002c38, 0x000000ce, 0x000000ee,
+	0x000004ae, 0x000004af, 0x00001cac, 0x000010ec,
+	0x00000194, 0x00000263, 0x000001e6, 0x000001e7,
+	0x0000a73c, 0x0000a73d, 0x00001fa6, 0x02000239,
+	0x0000054e, 0x0000057e, 0x0000ff2e, 0x0000ff4e,
+	0x000003a1, 0x000003c1, 0x000004c7, 0x000004c8,
+	0x00001f87, 0x020001dc, 0x00001efe, 0x00001eff,
+	0x00000404, 0x00000454, 0x00001f2d, 0x00001f25,
+	0x00002c2d, 0x00002c5d, 0x00002caa, 0x00002cab,
+	0x0000a692, 0x0000a693, 0x00000200, 0x00000201,
+	0x0000048c, 0x0000048d, 0x00010d65, 0x00010d85,
+	0x00000186, 0x00000254, 0x00010ca9, 0x00010ce9,
+	0x0000053f, 0x0000056f, 0x000001d1, 0x000001d2,
+	0x00010401, 0x00010429, 0x00010c9a, 0x00010cda,
+	0x000024c9, 0x000024e3, 0x00001f91, 0x020001fa,
+	0x00000504, 0x00000505, 0x000003a6, 0x000003c6,
+	0x00001cab, 0x000010eb, 0x0000216f, 0x0000217f,
+	0x000024b7, 0x000024d1, 0x00002c9e, 0x00002c9f,
+	0x00001e66, 0x00001e67, 0x0000a7dc, 0x0000019b,
+	0x0000ab9c, 0x000013cc, 0x00016e57, 0x00016e77,
+	0x00016e4b, 0x00016e6b, 0x00001f0f, 0x00001f07,
+	0x00000422, 0x00000442, 0x000004d4, 0x000004d5,
+	0x0000abaf, 0x000013df, 0x00000508, 0x00000509,
+	0x0000a7b6, 0x0000a7b7, 0x00001f80, 0x020001c7,
+	0x000004bc, 0x000004bd, 0x00001e2c, 0x00001e2d,
+	0x00001ea6, 0x00001ea7, 0x00010d54, 0x00010d74,
+	0x00001f99, 0x02000212, 0x000004f0, 0x000004f1,
+	0x0000a786, 0x0000a787, 0x0001041e, 0x00010446,
+	0x00001c80, 0x00000432, 0x00000551, 0x00000581,
+	0x00002cce, 0x00002ccf, 0x00001ed2, 0x00001ed3,
+	0x00000476, 0x00000477, 0x000118a0, 0x000118c0,
+	0x00001e0e, 0x00001e0f, 0x00010589, 0x000105b0,
+	0x00002c12, 0x00002c42, 0x0000042d, 0x0000044d,
+	0x000104ce, 0x000104f6, 0x00001e0c, 0x00001e0d,
+	0x00001ca1, 0x000010e1, 0x000010c7, 0x00002d27,
+	0x00002c24, 0x00002c54, 0x00000552, 0x00000582,
+	0x000010cd, 0x00002d2d, 0x0000ab77, 0x000013a7,
+	0x00010cae, 0x00010cee, 0x000010ac, 0x00002d0c,
+	0x0000052a, 0x0000052b, 0x00000418, 0x00000438,
+	0x0000a764, 0x0000a765, 0x0001e904, 0x0001e926,
+	0x0000053a, 0x0000056a, 0x000024bb, 0x000024d5,
+	0x00001fe6, 0x02000297, 0x0000ab90, 0x000013c0,
+	0x000010a6, 0x00002d06, 0x00001e4a, 0x00001e4b,
+	0x000118bc, 0x000118dc, 0x0000a7b2, 0x0000029d,
+	0x00001fa2, 0x0200022d, 0x00000546, 0x00000576,
+	0x000003f1, 0x000003c1, 0x00002c75, 0x00002c76,
+	0x000104bb, 0x000104e3, 0x000010c0, 0x00002d20,
+	0x00001e64, 0x00001e65, 0x00001eb0, 0x00001eb1,
+	0x000003a7, 0x000003c7, 0x00010d56, 0x00010d76,
+	0x00002ca2, 0x00002ca3, 0x00000537, 0x00000567,
+	0x0001057a, 0x000105a1, 0x0000049c, 0x0000049d,
+	0x00002c0f, 0x00002c3f, 0x0000017f, 0x00000073,
+	0x00002cdc, 0x00002cdd, 0x00010c92, 0x00010cd2,
+	0x000004e8, 0x000004e9, 0x00001f8e, 0x020001f1,
+	0x00002c27, 0x00002c57, 0x0000a782, 0x0000a783,
+	0x00001f97, 0x0200020c, 0x00001f3d, 0x00001f35,
+	0x0000052e, 0x0000052f, 0x000010a5, 0x00002d05,
+	0x00000044, 0x00000064, 0x000000dd, 0x000000fd,
+	0x00002c96, 0x00002c97, 0x0000a7ba, 0x0000a7bb,
+	0x000010b8, 0x00002d18, 0x00001c91, 0x000010d1,
+	0x00000124, 0x00000125, 0x00016e4d, 0x00016e6d,
+	0x00001ee8, 0x00001ee9, 0x0000ab8c, 0x000013bc,
+	0x000118a5, 0x000118c5, 0x00001c94, 0x000010d4,
+	0x00010590, 0x000105b7, 0x00000049, 0x00000069,
+	0x000000c0, 0x000000e0, 0x00001ff4, 0x020002a4,
+	0x0000ab7f, 0x000013af, 0x0000021c, 0x0000021d,
+	0x0000a75e, 0x0000a75f, 0x00001fbb, 0x00001f71,
+	0x00016e50, 0x00016e70, 0x000003e0, 0x000003e1,
+	0x0000042e, 0x0000044e, 0x0001e91f, 0x0001e941,
+	0x00000110, 0x00000111, 0x00000403, 0x00000453,
+	0x00001e8a, 0x00001e8b, 0x000104c0, 0x000104e8,
+	0x00001fd2, 0x0300027d, 0x000104b9, 0x000104e1,
+	0x0000a686, 0x0000a687, 0x0000a7d0, 0x0000a7d1,
+	0x00010c90, 0x00010cd0, 0x0000050e, 0x0000050f,
+	0x000001c7, 0x000001c9, 0x000001f4, 0x000001f5,
+	0x000000df, 0x0200018f, 0x00001fb8, 0x00001fb0,
+	0x0000a7a6, 0x0000a7a7, 0x00000189, 0x00000256,
+	0x0000a684, 0x0000a685, 0x00002ced, 0x00002cee,
+	0x0000a796, 0x0000a797, 0x00002cbc, 0x00002cbd,
+	0x0000ab8b, 0x000013bb, 0x0001e909, 0x0001e92b,
+	0x0000abb9, 0x000013e9, 0x00010d61, 0x00010d81,
+	0x00010584, 0x000105ab, 0x00001f9d, 0x0200021e,
+	0x000004b0, 0x000004b1, 0x0001e90c, 0x0001e92e,
+	0x00010caf, 0x00010cef, 0x000001e0, 0x000001e1,
+	0x00001f5f, 0x00001f57, 0x00002c16, 0x00002c46,
+	0x00010425, 0x0001044d, 0x00001cb0, 0x000010f0,
+	0x00001cae, 0x000010ee, 0x000004c1, 0x000004c2,
+	0x00010cb1, 0x00010cf1, 0x000013f9, 0x000013f1,
+	0x00001eee, 0x00001eef, 0x00010585, 0x000105ac,
+	0x000000c4, 0x000000e4, 0x0000a65a, 0x0000a65b,
+	0x0000a694, 0x0000a695, 0x00010c85, 0x00010cc5,
+	0x0001e900, 0x0001e922, 0x00010587, 0x000105ae,
+	0x00000182, 0x00000183, 0x00002c21, 0x00002c51,
+	0x0000ab8a, 0x000013ba, 0x00000202, 0x00000203,
+	0x00000555, 0x00000585, 0x00001e46, 0x00001e47,
+	0x00000046, 0x00000066, 0x00001e06, 0x00001e07,
+	0x0000ab97, 0x000013c7, 0x000003a8, 0x000003c8,
+	0x000003a3, 0x000003c3, 0x00002c23, 0x00002c53,
+	0x00000162, 0x00000163, 0x00010415, 0x0001043d,
+	0x00001ef2, 0x00001ef3, 0x00001fd6, 0x02000285,
+	0x0001e921, 0x0001e943, 0x0000038a, 0x000003af,
+	0x0000a648, 0x0000a649, 0x00000540, 0x00000570,
+	0x0000049a, 0x0000049b, 0x00002c6b, 0x00002c6c,
+	0x00001e16, 0x00001e17, 0x000001bc, 0x000001bd,
+	0x0001057e, 0x000105a5, 0x00001f81, 0x020001ca,
+	0x00000429, 0x00000449, 0x000010b6, 0x00002d16,
+	0x0000039d, 0x000003bd, 0x0000fb13, 0x020002c8,
+	0x000003ec, 0x000003ed, 0x0000216b, 0x0000217b,
+	0x00000208, 0x00000209, 0x0000ff3a, 0x0000ff5a,
+	0x0000ab83, 0x000013b3, 0x0000a7c6, 0x00001d8e,
+	0x00002cd0, 0x00002cd1, 0x00001ebc, 0x00001ebd,
+	0x00000478, 0x00000479, 0x00000048, 0x00000068,
+	0x000001f7, 0x000001bf, 0x0000010c, 0x0000010d,
+	0x00000149, 0x02000195, 0x00000542, 0x00000572,
+	0x00010406, 0x0001042e, 0x00000181, 0x00000253,
+	0x00010412, 0x0001043a, 0x000010c5, 0x00002d25,
+	0x00001f4a, 0x00001f42, 0x0000a760, 0x0000a761,
+	0x000104ba, 0x000104e2, 0x000010bf, 0x00002d1f,
+	0x0001e916, 0x0001e938, 0x00000535, 0x00000565,
+	0x0000a65c, 0x0000a65d, 0x00001ec6, 0x00001ec7,
+	0x0000ab70, 0x000013a0, 0x0000ab9a, 0x000013ca,
+	0x0000014a, 0x0000014b, 0x0000a72e, 0x0000a72f,
+	0x0000039b, 0x000003bb, 0x000004a2, 0x000004a3,
+	0x0000a7cb, 0x00000264, 0x0000019c, 0x0000026f,
+	0x0001e91d, 0x0001e93f, 0x00001f59, 0x00001f51,
+	0x00001f56, 0x030001c3, 0x00000548, 0x00000578,
+	0x00002c09, 0x00002c39, 0x00000054, 0x00000074,
+	0x0000039f, 0x000003bf, 0x00001ff7, 0x030002aa,
+	0x00001e68, 0x00001e69, 0x00001e80, 0x00001e81,
+	0x0001041c, 0x00010444, 0x00000244, 0x00000289,
+	0x0000216e, 0x0000217e, 0x00002c19, 0x00002c49,
+	0x000004fa, 0x000004fb, 0x0000049e, 0x0000049f,
+	0x0001e90d, 0x0001e92f, 0x00000184, 0x00000185,
+	0x00000531, 0x00000561, 0x00000042, 0x00000062,
+	0x00001faa, 0x02000245, 0x000003ab, 0x000003cb,
+	0x00001ca9, 0x000010e9, 0x0000021a, 0x0000021b,
+	0x00002cae, 0x00002caf, 0x00001fe2, 0x0300028c,
+	0x00001f82, 0x020001cd, 0x00000376, 0x00000377,
+	0x0000a77d, 0x00001d79, 0x000000d9, 0x000000f9,
+	0x00002c98, 0x00002c99, 0x00001ea0, 0x00001ea1,
+	0x00001ebe, 0x00001ebf, 0x0000ff2a, 0x0000ff4a,
+	0x000003f5, 0x000003b5, 0x00000500, 0x00000501,
+	0x0000216a, 0x0000217a, 0x00001f38, 0x00001f30,
+	0x0000ab98, 0x000013c8, 0x0000ff26, 0x0000ff46,
+	0x000003a5, 0x000003c5, 0x000001b7, 0x00000292,
+	0x000118bd, 0x000118dd, 0x00002ca4, 0x00002ca5,
+	0x00001e1e, 0x00001e1f, 0x00000423, 0x00000443,
+	0x00002cb8, 0x00002cb9, 0x000000cc, 0x000000ec,
+	0x00002c04, 0x00002c34, 0x00001e8e, 0x00001e8f,
+	0x00001f98, 0x0200020f, 0x0000aba9, 0x000013d9,
+	0x000001a2, 0x000001a3, 0x00002cc2, 0x00002cc3,
+	0x00001e86, 0x00001e87, 0x000004f6, 0x000004f7,
+	0x00001c93, 0x000010d3, 0x00001c83, 0x00000441,
+	0x000001a9, 0x00000283, 0x00002c72, 0x00002c73,
+	0x000004d6, 0x000004d7, 0x00000510, 0x00000511,
+	0x00000388, 0x000003ad, 0x00010405, 0x0001042d,
+	0x000024c0, 0x000024da, 0x00002c17, 0x00002c47,
+	0x000013fd, 0x000013f5, 0x000010b2, 0x00002d12,
+	0x0000023a, 0x00002c65, 0x0000a7b0, 0x0000029e,
+	0x000001a6, 0x00000280, 0x00002cbe, 0x00002cbf,
+	0x00001ec4, 0x00001ec5, 0x00001f3b, 0x00001f33,
+	0x000000cf, 0x000000ef, 0x00010404, 0x0001042c,
+	0x00016e5e, 0x00016e7e, 0x00001f1d, 0x00001f15,
+	0x0000a790, 0x0000a791, 0x00001c92, 0x000010d2,
+	0x00001e42, 0x00001e43, 0x00002c14, 0x00002c44,
+	0x00001fa9, 0x02000242, 0x000104d1, 0x000104f9,
+	0x00001ca5, 0x000010e5, 0x00001f90, 0x020001f7,
+	0x0001057d, 0x000105a4, 0x000024c7, 0x000024e1,
+	0x00002c60, 0x00002c61, 0x00002cba, 0x00002cbb,
+	0x00000408, 0x00000458, 0x00016e43, 0x00016e63,
+	0x00000246, 0x00000247, 0x0000013b, 0x0000013c,
+	0x0000a696, 0x0000a697, 0x00001e44, 0x00001e45,
+	0x000004ee, 0x000004ef, 0x0001e90f, 0x0001e931,
+	0x000004cb, 0x000004cc, 0x00001cad, 0x000010ed,
+	0x000001a0, 0x000001a1, 0x0000abba, 0x000013ea,
+	0x00010572, 0x00010599, 0x00000174, 0x00000175,
+	0x0001040a, 0x00010432, 0x00010c93, 0x00010cd3,
+	0x00000528, 0x00000529, 0x0000042f, 0x0000044f,
+	0x0000ab92, 0x000013c2, 0x00000417, 0x00000437,
+	0x0000a74a, 0x0000a74b, 0x000010ad, 0x00002d0d,
+	0x00001ea2, 0x00001ea3, 0x00001e88, 0x00001e89,
+	0x0000ab87, 0x000013b7, 0x00010426, 0x0001044e,
+	0x00000176, 0x00000177, 0x00010594, 0x000105bb,
+	0x00001fc6, 0x02000273, 0x000004d8, 0x000004d9,
+	0x000118a2, 0x000118c2, 0x00010d53, 0x00010d73,
+	0x0000ff38, 0x0000ff58, 0x00001fa8, 0x0200023f,
+	0x00000526, 0x00000527, 0x00001fc2, 0x0200026a,
+	0x0000ab96, 0x000013c6, 0x0000a758, 0x0000a759,
+	0x00001fd3, 0x03000281, 0x00002c06, 0x00002c36,
+	0x00001efc, 0x00001efd, 0x0000042a, 0x0000044a,
+	0x0000ab8d, 0x000013bd, 0x00010423, 0x0001044b,
+	0x00000114, 0x00000115, 0x00001f88, 0x020001df,
+	0x0000047a, 0x0000047b, 0x000118ba, 0x000118da,
+	0x0001e910, 0x0001e932, 0x00002c15, 0x00002c45,
+	0x000013fb, 0x000013f3, 0x00001eb8, 0x00001eb9,
+	0x0000051a, 0x0000051b, 0x00010c8a, 0x00010cca,
+	0x00010ca0, 0x00010ce0, 0x000118be, 0x000118de,
+	0x00002c28, 0x00002c58, 0x00001e54, 0x00001e55,
+	0x000003d0, 0x000003b2, 0x0000a7ab, 0x0000025c,
+	0x0000ff29, 0x0000ff49, 0x000024cc, 0x000024e6,
+	0x0000a65e, 0x0000a65f, 0x0000abbd, 0x000013ed,
+	0x00010580, 0x000105a7, 0x0000a7c5, 0x00000282,
+	0x0000004e, 0x0000006e, 0x000118b2, 0x000118d2,
+	0x00001fb3, 0x0200025a, 0x00000494, 0x00000495,
+	0x00001f94, 0x02000203, 0x0000fb05, 0x020002c2,
+	0x000013fc, 0x000013f4, 0x00010403, 0x0001042b,
+	0x0000ab86, 0x000013b6, 0x0000054a, 0x0000057a,
+	0x0000a7d8, 0x0000a7d9, 0x00000230, 0x00000231,
+	0x00001c89, 0x00001c8a, 0x000010a1, 0x00002d01,
+	0x0000a64e, 0x0000a64f, 0x00001e2e, 0x00001e2f,
+	0x0000022a, 0x0000022b, 0x000000c8, 0x000000e8,
+	0x00000553, 0x00000583, 0x000024c2, 0x000024dc,
+	0x00010ca2, 0x00010ce2, 0x000004a0, 0x000004a1,
+	0x0000ab85, 0x000013b5, 0x00001e14, 0x00001e15,
+	0x0000a64a, 0x0000a64b, 0x00001f4c, 0x00001f44,
+	0x00001fe3, 0x03000290, 0x00001e60, 0x00001e61,
+	0x000003aa, 0x000003ca, 0x0000212b, 0x000000e5,
+	0x00010c99, 0x00010cd9, 0x00001f52, 0x030001bb,
+	0x00000409, 0x00000459, 0x0000abad, 0x000013dd,
+	0x00001cb4, 0x000010f4, 0x00002c02, 0x00002c32,
+	0x00002c9a, 0x00002c9b, 0x00001ec8, 0x00001ec9,
+	0x000118b7, 0x000118d7, 0x00000210, 0x00000211,
+	0x00010422, 0x0001044a, 0x00016e51, 0x00016e71,
+	0x0000ff22, 0x0000ff42, 0x00001f3f, 0x00001f37,
+	0x000010c3, 0x00002d23, 0x0000ab8f, 0x000013bf,
+	0x00010402, 0x0001042a, 0x00010d52, 0x00010d72,
+	0x000000d8, 0x000000f8, 0x0001058a, 0x000105b1,
+	0x00000398, 0x000003b8, 0x000104c2, 0x000104ea,
+	0x00002165, 0x00002175, 0x000000cb, 0x000000eb,
+	0x00002c07, 0x00002c37, 0x0000ff31, 0x0000ff51,
+	0x000104c9, 0x000104f1, 0x0001040f, 0x00010437,
+	0x00010d55, 0x00010d75, 0x00000544, 0x00000574,
+	0x000118a1, 0x000118c1, 0x00001fca, 0x00001f74,
+	0x000003fd, 0x0000037b, 0x0001041a, 0x00010442,
+	0x0000010a, 0x0000010b, 0x0000ff34, 0x0000ff54,
+	0x00001f96, 0x02000209, 0x00000512, 0x00000513,
+	0x000001a4, 0x000001a5, 0x000001fe, 0x000001ff,
+	0x00002c1b, 0x00002c4b, 0x0000aba8, 0x000013d8,
+	0x00001e30, 0x00001e31, 0x0000a7a8, 0x0000a7a9,
+	0x000003d1, 0x000003b8, 0x00001cbd, 0x000010fd,
+	0x00010582, 0x000105a9, 0x00002cc0, 0x00002cc1,
+	0x00000416, 0x00000436, 0x00000468, 0x00000469,
+	0x00010ca1, 0x00010ce1, 0x000001b3, 0x000001b4,
+	0x00010400, 0x00010428, 0x0000a75a, 0x0000a75b,
+	0x000004b4, 0x000004b5, 0x0000a79e, 0x0000a79f,
+	0x0001e91c, 0x0001e93e, 0x0000053b, 0x0000056b,
+	0x00002c29, 0x00002c59, 0x00002c18, 0x00002c48,
+	0x00001e24, 0x00001e25, 0x0000004a, 0x0000006a,
+	0x0000a7a4, 0x0000a7a5, 0x00002168, 0x00002178,
+	0x00002c62, 0x0000026b, 0x0000a72c, 0x0000a72d,
+	0x0000040a, 0x0000045a, 0x00001c97, 0x000010d7,
+	0x00002c6f, 0x00000250, 0x00000345, 0x000003b9,
+	0x0000a698, 0x0000a699, 0x0000ff23, 0x0000ff43,
+	0x0000a766, 0x0000a767, 0x0000abb1, 0x000013e1,
+	0x00010420, 0x00010448, 0x0000a762, 0x0000a763,
+	0x00001e84, 0x00001e85, 0x000004e6, 0x000004e7,
+	0x00000160, 0x00000161, 0x00016e52, 0x00016e72,
+	0x00000216, 0x00000217, 0x00001e50, 0x00001e51,
+	0x00001f69, 0x00001f61, 0x00001eae, 0x00001eaf,
+	0x000003fa, 0x000003fb, 0x00010c94, 0x00010cd4,
+	0x000000dc, 0x000000fc, 0x00000545, 0x00000575,
+	0x0000040f, 0x0000045f, 0x00001ef4, 0x00001ef5,
+	0x000003f4, 0x000003b8, 0x0000023b, 0x0000023c,
+	0x0000216c, 0x0000217c, 0x00002c1f, 0x00002c4f,
+	0x0000ab7e, 0x000013ae, 0x000004da, 0x000004db,
+	0x000001d5, 0x000001d6, 0x00010d5a, 0x00010d7a,
+	0x00002c70, 0x00000252, 0x0000a682, 0x0000a683,
+	0x0000fb06, 0x020002c5, 0x00001e20, 0x00001e21,
+	0x000003e4, 0x000003e5, 0x000003d5, 0x000003c6,
+	0x000000c9, 0x000000e9, 0x00002c88, 0x00002c89,
+	0x00000520, 0x00000521, 0x00001caf, 0x000010ef,
+	0x0001e91e, 0x0001e940, 0x0000040b, 0x0000045b,
+	0x00002cd4, 0x00002cd5, 0x00001f9c, 0x0200021b,
+	0x0000047c, 0x0000047d, 0x00016e4a, 0x00016e6a,
+	0x00016e47, 0x00016e67, 0x000001ac, 0x000001ad,
+	0x00002c1c, 0x00002c4c, 0x0000ff27, 0x0000ff47,
+	0x00000464, 0x00000465, 0x00001e7c, 0x00001e7d,
+	0x000104b5, 0x000104dd, 0x0000054d, 0x0000057d,
+	0x00002c2a, 0x00002c5a, 0x000024bf, 0x000024d9,
+	0x0000ab76, 0x000013a6, 0x00001c85, 0x00000442,
+	0x00010ca4, 0x00010ce4, 0x00000100, 0x00000101,
+	0x0000a660, 0x0000a661, 0x00001e32, 0x00001e33,
+	0x0001e908, 0x0001e92a, 0x00010c8e, 0x00010cce,
+	0x000001a7, 0x000001a8, 0x000024bd, 0x000024d7,
+	0x00000533, 0x00000563, 0x000118b9, 0x000118d9,
+	0x00010c86, 0x00010cc6, 0x00001e3e, 0x00001e3f,
+	0x00010ca8, 0x00010ce8, 0x00000059, 0x00000079,
+	0x00002c1a, 0x00002c4a, 0x0000054c, 0x0000057c,
+	0x000010a9, 0x00002d09, 0x000104c5, 0x000104ed,
+	0x00002c2f, 0x00002c5f, 0x00001ffb, 0x00001f7d,
+	0x00001cbe, 0x000010fe, 0x00010cab, 0x00010ceb,
+	0x00000206, 0x00000207, 0x000010a7, 0x00002d07,
+	0x000010aa, 0x00002d0a, 0x000104cf, 0x000104f7,
+	0x0000ff21, 0x0000ff41, 0x00010427, 0x0001044f,
+	0x00001c9d, 0x000010dd, 0x000104bf, 0x000104e7,
+	0x00002ceb, 0x00002cec, 0x0000ab82, 0x000013b2,
+	0x0000a75c, 0x0000a75d, 0x00001e96, 0x020001a6,
+	0x00000172, 0x00000173, 0x0000a73a, 0x0000a73b,
+	0x00002c13, 0x00002c43, 0x00001ff3, 0x020002a1,
+	0x00000413, 0x00000433, 0x000001d9, 0x000001da,
+	0x00000218, 0x00000219, 0x000000da, 0x000000fa,
+	0x00002c9c, 0x00002c9d, 0x00002ca6, 0x00002ca7,
+	0x0000ab7c, 0x000013ac, 0x0000ab81, 0x000013b1,
+	0x000010b4, 0x00002d14, 0x00016e53, 0x00016e73,
+	0x000024c8, 0x000024e2, 0x00001e78, 0x00001e79,
+	0x000004fc, 0x000004fd, 0x0000018f, 0x00000259,
+	0x000010bc, 0x00002d1c, 0x0000a722, 0x0000a723,
+	0x00010c83, 0x00010cc3, 0x000104d0, 0x000104f8,
 	0x0000039a, 0x000003ba, 0x00001eb2, 0x00001eb3,
-	0x000010c2, 0x00002d22, 0x0000a750, 0x0000a751,
-	0x00001e3e, 0x00001e3f, 0x000010a5, 0x00002d05,
-	0x00002126, 0x000003c9, 0x0000abb7, 0x000013e7,
-	0x0000051e, 0x0000051f, 0x000024b9, 0x000024d3,
-	0x0000ff22, 0x0000ff42, 0x000004e0, 0x000004e1,
-	0x000001e6, 0x000001e7, 0x0001e90a, 0x0001e92c,
-	0x00002c69, 0x00002c6a, 0x0000041f, 0x0000043f,
-	0x00002c07, 0x00002c37, 0x0000020c, 0x0000020d,
-	0x0000a640, 0x0000a641, 0x000001d5, 0x000001d6,
-	0x00010403, 0x0001042b, 0x0000a7ad, 0x0000026c,
-	0x00000506, 0x00000507, 0x00000049, 0x00000069,
-	0x0000a796, 0x0000a797, 0x0000abac, 0x000013dc,
-	0x00001fe4, 0x02000294, 0x0000a64e, 0x0000a64f,
-	0x00002c7e, 0x0000023f, 0x00000395, 0x000003b5,
-	0x00001ca5, 0x000010e5, 0x00000164, 0x00000165,
-	0x00001f8a, 0x020001e5, 0x0000ab8d, 0x000013bd,
-	0x0000a7aa, 0x00000266, 0x00001fa9, 0x02000242,
-	0x00016e42, 0x00016e62, 0x000003fa, 0x000003fb,
-	0x00000404, 0x00000454, 0x00000420, 0x00000440,
-	0x0000024a, 0x0000024b, 0x00010404, 0x0001042c,
-	0x000004be, 0x000004bf, 0x00010c90, 0x00010cd0,
-	0x00000141, 0x00000142, 0x0000039c, 0x000003bc,
-	0x00001ed8, 0x00001ed9, 0x00002c17, 0x00002c47,
-	0x00002c0e, 0x00002c3e, 0x0000a7c7, 0x0000a7c8,
-	0x0000019d, 0x00000272, 0x00000230, 0x00000231,
-	0x00010ca6, 0x00010ce6, 0x00000514, 0x00000515,
-	0x000024bf, 0x000024d9, 0x00001ea4, 0x00001ea5,
-	0x00000422, 0x00000442, 0x00001f81, 0x020001ca,
-	0x0000017f, 0x00000073, 0x000003aa, 0x000003ca,
-	0x00001f08, 0x00001f00, 0x0000ab96, 0x000013c6,
-	0x000000c4, 0x000000e4, 0x00001e3c, 0x00001e3d,
-	0x0000ff27, 0x0000ff47, 0x00000216, 0x00000217,
-	0x0001057a, 0x000105a1, 0x00002c9a, 0x00002c9b,
-	0x000118a1, 0x000118c1, 0x000010a7, 0x00002d07,
-	0x000004f0, 0x000004f1, 0x00000124, 0x00000125,
-	0x00001c85, 0x00000442, 0x00000134, 0x00000135,
-	0x00001f2c, 0x00001f24, 0x00001f8d, 0x020001ee,
-	0x00002c72, 0x00002c73, 0x00001ca2, 0x000010e2,
-	0x00010589, 0x000105b0, 0x00000136, 0x00000137,
-	0x00016e46, 0x00016e66, 0x00016e4d, 0x00016e6d,
-	0x00000537, 0x00000567, 0x00010c8e, 0x00010cce,
-	0x0001e915, 0x0001e937, 0x0000039f, 0x000003bf,
-	0x00001e5a, 0x00001e5b, 0x0000042a, 0x0000044a,
-	0x00010cad, 0x00010ced, 0x000104c4, 0x000104ec,
-	0x000003e6, 0x000003e7, 0x00001f8b, 0x020001e8,
-	0x000010c3, 0x00002d23, 0x0000a7d6, 0x0000a7d7,
-	0x00002c03, 0x00002c33, 0x000001f1, 0x000001f3,
-	0x00000222, 0x00000223, 0x000003cf, 0x000003d7,
-	0x000104d3, 0x000104fb, 0x0000a660, 0x0000a661,
-	0x00001e9e, 0x020001b5, 0x0000046a, 0x0000046b,
-	0x0000a7b6, 0x0000a7b7, 0x000003a5, 0x000003c5,
-	0x00002cf2, 0x00002cf3, 0x00000214, 0x00000215,
-	0x0000ab92, 0x000013c2, 0x000003a0, 0x000003c0,
-	0x00001e40, 0x00001e41, 0x000001d3, 0x000001d4,
-	0x0000a738, 0x0000a739, 0x0000a790, 0x0000a791,
-	0x00002c19, 0x00002c49, 0x000001a0, 0x000001a1,
-	0x00001eb8, 0x00001eb9, 0x0001e917, 0x0001e939,
-	0x0000014a, 0x0000014b, 0x0000a64c, 0x0000a64d,
-	0x000003f4, 0x000003b8, 0x0000004c, 0x0000006c,
-	0x00001f0b, 0x00001f03, 0x00002cd2, 0x00002cd3,
-	0x00001eb4, 0x00001eb5, 0x0000ab7d, 0x000013ad,
-	0x0000a7f5, 0x0000a7f6, 0x0000aba9, 0x000013d9,
-	0x000000c9, 0x000000e9, 0x000001e0, 0x000001e1,
-	0x00001e28, 0x00001e29, 0x000004ea, 0x000004eb,
-	0x00000118, 0x00000119, 0x00001c90, 0x000010d0,
-	0x0000049c, 0x0000049d, 0x000000cf, 0x000000ef,
-	0x0000abbd, 0x000013ed, 0x00002c6f, 0x00000250,
-	0x000000b5, 0x000003bc, 0x0000ab7e, 0x000013ae,
-	0x000000c2, 0x000000e2, 0x00001e06, 0x00001e07,
-	0x0000ab9c, 0x000013cc, 0x0000023e, 0x00002c66,
-	0x00001e66, 0x00001e67, 0x0000041d, 0x0000043d,
-	0x0000a668, 0x0000a669, 0x00001c94, 0x000010d4,
-	0x00000472, 0x00000473, 0x000004d8, 0x000004d9,
-	0x0000053f, 0x0000056f, 0x000003d6, 0x000003c0,
-	0x0000a784, 0x0000a785, 0x0000abbe, 0x000013ee,
-	0x0000a756, 0x0000a757, 0x00001f3d, 0x00001f35,
-	0x0000050c, 0x0000050d, 0x00000212, 0x00000213,
-	0x0000a7c9, 0x0000a7ca, 0x00000145, 0x00000146,
-	0x0000053b, 0x0000056b, 0x00001caa, 0x000010ea,
-	0x0001e91f, 0x0001e941, 0x00001fda, 0x00001f76,
-	0x0000ab95, 0x000013c5, 0x00010421, 0x00010449,
-	0x00001ef6, 0x00001ef7, 0x0001058e, 0x000105b5,
-	0x00002c6d, 0x00000251, 0x00001eb6, 0x00001eb7,
-	0x000010b4, 0x00002d14, 0x0000a7a0, 0x0000a7a1,
-	0x000004c9, 0x000004ca, 0x00016e5f, 0x00016e7f,
-	0x000001e4, 0x000001e5, 0x00001c95, 0x000010d5,
-	0x000000c6, 0x000000e6, 0x0000010c, 0x0000010d,
-	0x0000fb05, 0x020002c2, 0x0000ab85, 0x000013b5,
-	0x00010c93, 0x00010cd3, 0x00001e7c, 0x00001e7d,
-	0x00002cb4, 0x00002cb5, 0x00001e94, 0x00001e95,
-	0x00010cae, 0x00010cee, 0x00002c28, 0x00002c58,
-	0x0000050e, 0x0000050f, 0x000001d1, 0x000001d2,
-	0x00000224, 0x00000225, 0x00001f2d, 0x00001f25,
-	0x00000200, 0x00000201, 0x00002c15, 0x00002c45,
-	0x00001c86, 0x0000044a, 0x0000ab7a, 0x000013aa,
-	0x000000db, 0x000000fb, 0x0000013f, 0x00000140,
-	0x000003c2, 0x000003c3, 0x00000549, 0x00000579,
-	0x00002c96, 0x00002c97, 0x00002c60, 0x00002c61,
-	0x00001e4e, 0x00001e4f, 0x00000424, 0x00000444,
-	0x000118bb, 0x000118db, 0x00010584, 0x000105ab,
-	0x00016e47, 0x00016e67, 0x000001a2, 0x000001a3,
-	0x0000ab73, 0x000013a3, 0x000004b4, 0x000004b5,
-	0x00001fe2, 0x0300028c, 0x000010bf, 0x00002d1f,
-	0x00001cb7, 0x000010f7, 0x00001ef8, 0x00001ef9,
-	0x00001fba, 0x00001f70, 0x00002ca0, 0x00002ca1,
-	0x00001ca6, 0x000010e6, 0x0000abb6, 0x000013e6,
-	0x0000a73e, 0x0000a73f, 0x00001f0d, 0x00001f05,
-	0x00016e57, 0x00016e77, 0x000000c8, 0x000000e8,
-	0x00001e68, 0x00001e69, 0x00002c0c, 0x00002c3c,
-	0x000001f7, 0x000001bf, 0x00001c9e, 0x000010de,
-	0x00010591, 0x000105b8, 0x00001f1b, 0x00001f13,
-	0x00010ca8, 0x00010ce8, 0x00002ce0, 0x00002ce1,
-	0x0000a742, 0x0000a743, 0x00001f3c, 0x00001f34,
-	0x00002ca6, 0x00002ca7, 0x00001e00, 0x00001e01,
-	0x000010b7, 0x00002d17, 0x000024bd, 0x000024d7,
-	0x00001e80, 0x00001e81, 0x00016e40, 0x00016e60,
-	0x00002c02, 0x00002c32, 0x00001ca7, 0x000010e7,
-	0x00000478, 0x00000479, 0x000000d6, 0x000000f6,
-	0x00000389, 0x000003ae, 0x000003e0, 0x000003e1,
-	0x000003fe, 0x0000037c, 0x00002c01, 0x00002c31,
-	0x00002c18, 0x00002c48, 0x00000193, 0x00000260,
-	0x00001eb0, 0x00001eb1, 0x000118b9, 0x000118d9,
-	0x00001f2e, 0x00001f26, 0x00016e43, 0x00016e63,
-	0x000003a7, 0x000003c7, 0x00001ec6, 0x00001ec7,
-	0x000004b8, 0x000004b9, 0x00001ffa, 0x00001f7c,
-	0x00001fbe, 0x000003b9, 0x000001f2, 0x000001f3,
-	0x000004dc, 0x000004dd, 0x000104ca, 0x000104f2,
-	0x00002cac, 0x00002cad, 0x00001e90, 0x00001e91,
-	0x0000ab9f, 0x000013cf, 0x00010427, 0x0001044f,
-	0x00010426, 0x0001044e, 0x0001040a, 0x00010432,
-	0x0000fb03, 0x030002ba, 0x000004c3, 0x000004c4,
-	0x00002c2a, 0x00002c5a, 0x0000a656, 0x0000a657,
-	0x00001cab, 0x000010eb, 0x0000040a, 0x0000045a,
-	0x00001fd3, 0x03000281, 0x00000191, 0x00000192,
-	0x00002c9e, 0x00002c9f, 0x00001ed0, 0x00001ed1,
-	0x000010a0, 0x00002d00, 0x00002c98, 0x00002c99,
-	0x00001e14, 0x00001e15, 0x00002165, 0x00002175,
-	0x0000a732, 0x0000a733, 0x000010a9, 0x00002d09,
-	0x00002c75, 0x00002c76, 0x00000196, 0x00000269,
-	0x0000a652, 0x0000a653, 0x0000047a, 0x0000047b,
-	0x00010cb0, 0x00010cf0, 0x00002c0b, 0x00002c3b,
-	0x0001057d, 0x000105a4, 0x00001ff2, 0x0200029e,
-	0x00001c9d, 0x000010dd, 0x000104b7, 0x000104df,
-	0x00000533, 0x00000563, 0x0000040f, 0x0000045f,
-	0x000118bd, 0x000118dd, 0x00001ea6, 0x00001ea7,
-	0x00000202, 0x00000203, 0x0000a692, 0x0000a693,
-	0x000024cc, 0x000024e6, 0x00002cd6, 0x00002cd7,
-	0x0000015a, 0x0000015b, 0x00000204, 0x00000205,
-	0x00001ca9, 0x000010e9, 0x00001f50, 0x020001b8,
-	0x000024ca, 0x000024e4, 0x00000403, 0x00000453,
-	0x00010594, 0x000105bb, 0x000010a2, 0x00002d02,
-	0x00000042, 0x00000062, 0x00001ff7, 0x030002aa,
-	0x00000531, 0x00000561, 0x000000cb, 0x000000eb,
-	0x0001e908, 0x0001e92a, 0x000104c7, 0x000104ef,
-	0x00000156, 0x00000157, 0x00001e88, 0x00001e89,
-	0x00001e2c, 0x00001e2d, 0x00001f98, 0x0200020f,
-	0x00001c91, 0x000010d1, 0x0001041f, 0x00010447,
-	0x00001e48, 0x00001e49, 0x00001f6a, 0x00001f62,
-	0x0000a7ae, 0x0000026a, 0x00001f85, 0x020001d6,
-	0x00000480, 0x00000481, 0x0000038a, 0x000003af,
-	0x00010412, 0x0001043a, 0x0000051c, 0x0000051d,
-	0x00002132, 0x0000214e, 0x00001eaa, 0x00001eab,
-	0x00002163, 0x00002173, 0x00010c89, 0x00010cc9,
-	0x000010ac, 0x00002d0c, 0x00010577, 0x0001059e,
-	0x00010c9d, 0x00010cdd, 0x00010ca0, 0x00010ce0,
-	0x000001b2, 0x0000028b, 0x00001e6e, 0x00001e6f,
-	0x0000aba2, 0x000013d2, 0x00010401, 0x00010429,
-	0x00010402, 0x0001042a, 0x00002cc2, 0x00002cc3,
-	0x0000ab97, 0x000013c7, 0x000024c9, 0x000024e3,
-	0x00010400, 0x00010428, 0x000004d6, 0x000004d7,
-	0x00016e56, 0x00016e76, 0x0000018f, 0x00000259,
-	0x00001e46, 0x00001e47, 0x000000c7, 0x000000e7,
-	0x0000ab9e, 0x000013ce, 0x00002ceb, 0x00002cec,
-	0x0000a7b3, 0x0000ab53, 0x0000a760, 0x0000a761,
-	0x0000054d, 0x0000057d, 0x00016e49, 0x00016e69,
-	0x000000de, 0x000000fe, 0x0001e900, 0x0001e922,
-	0x00000184, 0x00000185, 0x0001e920, 0x0001e942,
-	0x00001fbc, 0x02000267, 0x00002c24, 0x00002c54,
-	0x00010cb2, 0x00010cf2, 0x00001e1a, 0x00001e1b,
-	0x00002cdc, 0x00002cdd, 0x00001ede, 0x00001edf,
-	0x0001e912, 0x0001e934, 0x0000a764, 0x0000a765,
-	0x00001e7a, 0x00001e7b, 0x00010581, 0x000105a8,
-	0x0000a7b1, 0x00000287, 0x00001c9a, 0x000010da,
-	0x00000520, 0x00000521, 0x0000a65c, 0x0000a65d,
-	0x00001eac, 0x00001ead, 0x000004ac, 0x000004ad,
-	0x00001fa3, 0x02000230, 0x00010c88, 0x00010cc8,
-	0x0001057f, 0x000105a6, 0x00001f0a, 0x00001f02,
-	0x0000048e, 0x0000048f, 0x00002cce, 0x00002ccf,
-	0x00001e4a, 0x00001e4b, 0x00001f09, 0x00001f01,
-	0x00002160, 0x00002170, 0x0001057e, 0x000105a5,
-	0x0000ff31, 0x0000ff51, 0x0000a68a, 0x0000a68b,
-	0x0000ff39, 0x0000ff59, 0x0001040b, 0x00010433,
-	0x0000abb9, 0x000013e9, 0x00001ef0, 0x00001ef1,
-	0x0000fb14, 0x020002cb, 0x00000048, 0x00000068,
-	0x00001fa7, 0x0200023c, 0x000003d5, 0x000003c6,
-	0x00001ff4, 0x020002a4, 0x00000406, 0x00000456,
-	0x000104ce, 0x000104f6, 0x000024cb, 0x000024e5,
-	0x00002cc8, 0x00002cc9, 0x000000ce, 0x000000ee,
-	0x00000541, 0x00000571, 0x000004e6, 0x000004e7,
-	0x00002c2e, 0x00002c5e, 0x000000cd, 0x000000ed,
-	0x00000470, 0x00000471, 0x00010ca1, 0x00010ce1,
-	0x000010bd, 0x00002d1d, 0x00000370, 0x00000371,
-	0x0000a7c6, 0x00001d8e, 0x00000490, 0x00000491,
-	0x000104be, 0x000104e6, 0x00001e02, 0x00001e03,
-	0x000001b7, 0x00000292, 0x0000021c, 0x0000021d,
-	0x00000391, 0x000003b1, 0x000118a2, 0x000118c2,
-	0x000000dc, 0x000000fc, 0x00010588, 0x000105af,
-	0x00000197, 0x00000268, 0x00001f0e, 0x00001f06,
-	0x00000587, 0x020001a3, 0x000104b1, 0x000104d9,
-	0x00010ca4, 0x00010ce4, 0x0000ab98, 0x000013c8,
-	0x0000a642, 0x0000a643, 0x000024cd, 0x000024e7,
-	0x00016e4f, 0x00016e6f, 0x0000a73a, 0x0000a73b,
-	0x00001ffc, 0x020002ae, 0x00000059, 0x00000079,
-	0x000001a6, 0x00000280, 0x00000047, 0x00000067,
-	0x0001e91b, 0x0001e93d, 0x00001fd6, 0x02000285,
-	0x00001cae, 0x000010ee, 0x00000412, 0x00000432,
-	0x00001fca, 0x00001f74, 0x0000abba, 0x000013ea,
-	0x00002cda, 0x00002cdb, 0x00001ff3, 0x020002a1,
-	0x000010b9, 0x00002d19, 0x0000a79c, 0x0000a79d,
-	0x00001c9c, 0x000010dc, 0x0000abbf, 0x000013ef,
-	0x00010c87, 0x00010cc7, 0x000004d4, 0x000004d5,
-	0x0001e903, 0x0001e925, 0x00000122, 0x00000123,
-	0x00001ca0, 0x000010e0, 0x00010595, 0x000105bc,
-	0x0000abb2, 0x000013e2, 0x00016e5e, 0x00016e7e,
-	0x00002cae, 0x00002caf, 0x000010af, 0x00002d0f,
-	0x0000ab89, 0x000013b9, 0x00010417, 0x0001043f,
-	0x00000189, 0x00000256, 0x000001a7, 0x000001a8,
-	0x00000228, 0x00000229, 0x00010585, 0x000105ac,
-	0x0000052e, 0x0000052f, 0x000001bc, 0x000001bd,
-	0x00001f6f, 0x00001f67, 0x0000048c, 0x0000048d,
-	0x00001eea, 0x00001eeb, 0x0000017d, 0x0000017e,
-	0x00002cb0, 0x00002cb1, 0x00010c92, 0x00010cd2,
-	0x00001fc3, 0x0200026d, 0x0000a644, 0x0000a645,
-	0x00001e78, 0x00001e79, 0x00002cc6, 0x00002cc7,
-	0x0000a768, 0x0000a769, 0x0000ab91, 0x000013c1,
-	0x00002c90, 0x00002c91, 0x000001f4, 0x000001f5,
-	0x00001e38, 0x00001e39, 0x0001e91d, 0x0001e93f,
-	0x00010c9f, 0x00010cdf, 0x00000419, 0x00000439,
-	0x000104c1, 0x000104e9, 0x00000052, 0x00000072,
-	0x0000ab81, 0x000013b1, 0x000104bb, 0x000104e3,
-	0x0000a654, 0x0000a655, 0x000010b2, 0x00002d12,
-	0x000118b7, 0x000118d7, 0x00010410, 0x00010438,
-	0x0000ab8c, 0x000013bc, 0x0000024c, 0x0000024d,
-	0x00001f3b, 0x00001f33, 0x00000460, 0x00000461,
-	0x00000421, 0x00000441, 0x00001e2e, 0x00001e2f,
-	0x00000526, 0x00000527, 0x00010c91, 0x00010cd1,
-	0x00001f99, 0x02000212, 0x00002c9c, 0x00002c9d,
-	0x00001ed4, 0x00001ed5, 0x0000ab84, 0x000013b4,
-	0x0000024e, 0x0000024f, 0x00001e0c, 0x00001e0d,
-	0x000118aa, 0x000118ca, 0x0000a726, 0x0000a727,
-	0x00010caa, 0x00010cea, 0x000104d1, 0x000104f9,
-	0x00000386, 0x000003ac, 0x000104d2, 0x000104fa,
-	0x00000474, 0x00000475, 0x000000d2, 0x000000f2,
-	0x0000a77d, 0x00001d79, 0x000003dc, 0x000003dd,
-	0x00000206, 0x00000207, 0x00016e41, 0x00016e61,
-	0x00002c6b, 0x00002c6c, 0x00001f2f, 0x00001f27,
-	0x000024bc, 0x000024d6, 0x00000166, 0x00000167,
-	0x00002c23, 0x00002c53, 0x0001e90d, 0x0001e92f,
-	0x0000fb01, 0x020002b4, 0x00000417, 0x00000437,
-	0x000004a4, 0x000004a5, 0x00000112, 0x00000113,
-	0x00001e7e, 0x00001e7f, 0x000004aa, 0x000004ab,
-	0x00000056, 0x00000076, 0x00010c9e, 0x00010cde,
-	0x00010407, 0x0001042f, 0x00001e8c, 0x00001e8d,
-	0x00001fa6, 0x02000239, 0x0000a7a6, 0x0000a7a7,
-	0x00001f6e, 0x00001f66, 0x00016e5d, 0x00016e7d,
-	0x00000176, 0x00000177, 0x0000fb17, 0x020002d4,
-	0x000004f4, 0x000004f5, 0x000004fa, 0x000004fb,
-	0x00001e1e, 0x00001e1f, 0x0000023d, 0x0000019a,
-	0x00010c95, 0x00010cd5, 0x00016e48, 0x00016e68,
-	0x000001ec, 0x000001ed, 0x00001ecc, 0x00001ecd,
-	0x0000ab88, 0x000013b8, 0x00002c26, 0x00002c56,
-	0x000013f8, 0x000013f0, 0x000024be, 0x000024d8,
-	0x0000a72e, 0x0000a72f, 0x000024cf, 0x000024e9,
-	0x0000013b, 0x0000013c, 0x0000a758, 0x0000a759,
-	0x0000ff2d, 0x0000ff4d, 0x0001e909, 0x0001e92b,
-	0x000000da, 0x000000fa, 0x00001f87, 0x020001dc,
-	0x0000abb4, 0x000013e4, 0x00001f0c, 0x00001f04,
-	0x0001e91a, 0x0001e93c, 0x000104b3, 0x000104db,
-	0x00001ed2, 0x00001ed3, 0x000003a9, 0x000003c9,
-	0x000118a9, 0x000118c9, 0x0001e918, 0x0001e93a,
-	0x0000013d, 0x0000013e, 0x000001e2, 0x000001e3,
-	0x000104c2, 0x000104ea, 0x000004ba, 0x000004bb,
-	0x0000011a, 0x0000011b, 0x00010580, 0x000105a7,
-	0x00000429, 0x00000449, 0x00001f4c, 0x00001f44,
-	0x00000402, 0x00000452, 0x000104b0, 0x000104d8,
-	0x00002c2b, 0x00002c5b, 0x00001f4b, 0x00001f43,
-	0x00002162, 0x00002172, 0x00002c1d, 0x00002c4d,
-	0x00000528, 0x00000529, 0x0000a74e, 0x0000a74f,
-	0x00001ca8, 0x000010e8, 0x00000516, 0x00000517,
-	0x0000019f, 0x00000275, 0x00001c82, 0x0000043e,
-	0x0000fb06, 0x020002c5, 0x00010c97, 0x00010cd7,
-	0x00001f19, 0x00001f11, 0x000001b8, 0x000001b9,
-	0x00016e52, 0x00016e72, 0x000010bc, 0x00002d1c,
-	0x000104b2, 0x000104da, 0x00010570, 0x00010597,
-	0x000024c6, 0x000024e0, 0x0000a734, 0x0000a735,
-	0x00010414, 0x0001043c, 0x000104cb, 0x000104f3,
-	0x00001c98, 0x000010d8, 0x00001eae, 0x00001eaf,
-	0x0000041e, 0x0000043e, 0x00001f9e, 0x02000221,
-	0x00001c99, 0x000010d9, 0x00010573, 0x0001059a
+	0x0000a756, 0x0000a757, 0x00001f09, 0x00001f01,
+	0x00002163, 0x00002173, 0x00001e92, 0x00001e93,
+	0x0000ab7a, 0x000013aa, 0x00010574, 0x0001059b,
+	0x000001af, 0x000001b0, 0x0000015c, 0x0000015d,
+	0x00001ede, 0x00001edf, 0x0000046e, 0x0000046f,
+	0x000003ea, 0x000003eb, 0x000104d3, 0x000104fb,
+	0x00000190, 0x0000025b, 0x0000a742, 0x0000a743,
+	0x00001f8a, 0x020001e5, 0x00000514, 0x00000515,
+	0x00001e0a, 0x00001e0b, 0x000001c4, 0x000001c6,
+	0x0000a748, 0x0000a749, 0x00001fc3, 0x0200026d,
+	0x00001e34, 0x00001e35, 0x00001eb4, 0x00001eb5,
+	0x000010b9, 0x00002d19, 0x0000a784, 0x0000a785,
+	0x00000407, 0x00000457, 0x0000a66a, 0x0000a66b,
+	0x000010a8, 0x00002d08, 0x0000046a, 0x0000046b,
+	0x00010c9f, 0x00010cdf, 0x00000150, 0x00000151,
+	0x00002c1d, 0x00002c4d, 0x00001f1c, 0x00001f14,
+	0x0000ff25, 0x0000ff45, 0x00000108, 0x00000109,
+	0x00002c00, 0x00002c30, 0x0001040e, 0x00010436,
+	0x0000a746, 0x0000a747, 0x00001fae, 0x02000251,
+	0x0001058d, 0x000105b4, 0x00010c98, 0x00010cd8,
+	0x00016e44, 0x00016e64, 0x00002c67, 0x00002c68,
+	0x00002c64, 0x0000027d, 0x00001e6c, 0x00001e6d,
+	0x0000040c, 0x0000045c, 0x000104b7, 0x000104df,
+	0x0000a640, 0x0000a641, 0x000118b4, 0x000118d4,
+	0x0000a69a, 0x0000a69b, 0x00001fd9, 0x00001fd1,
+	0x0001e90b, 0x0001e92d, 0x000003f9, 0x000003f2,
+	0x00016e59, 0x00016e79, 0x0000ab9f, 0x000013cf,
+	0x0000ab8e, 0x000013be, 0x00001fe4, 0x02000294,
+	0x00001e52, 0x00001e53, 0x00016e4e, 0x00016e6e,
+	0x00000220, 0x0000019e, 0x000104c4, 0x000104ec,
+	0x00001fec, 0x00001fe5, 0x00001e5a, 0x00001e5b,
+	0x00001cb9, 0x000010f9, 0x0000ab75, 0x000013a5,
+	0x00000104, 0x00000105, 0x00002c8e, 0x00002c8f,
+	0x000118ad, 0x000118cd, 0x0000abbf, 0x000013ef,
+	0x0000abbb, 0x000013eb, 0x0001e90e, 0x0001e930,
+	0x00010d60, 0x00010d80, 0x00002ca8, 0x00002ca9,
+	0x00001f3c, 0x00001f34, 0x000004dc, 0x000004dd,
+	0x00010591, 0x000105b8, 0x00001e48, 0x00001e49,
+	0x0000a650, 0x0000a651, 0x0000abae, 0x000013de,
+	0x000118b0, 0x000118d0, 0x0001e914, 0x0001e936,
+	0x00001cba, 0x000010fa, 0x0001e91a, 0x0001e93c,
+	0x000000c7, 0x000000e7, 0x00002c8a, 0x00002c8b,
+	0x00001e9e, 0x020001b5, 0x000004f8, 0x000004f9,
+	0x000104b6, 0x000104de, 0x00010407, 0x0001042f,
+	0x000104ca, 0x000104f2, 0x00001eb6, 0x00001eb7,
+	0x00001f2a, 0x00001f22, 0x00001f9f, 0x02000224,
+	0x00000139, 0x0000013a, 0x00000106, 0x00000107,
+	0x000118b1, 0x000118d1, 0x0000abb4, 0x000013e4,
+	0x0000051e, 0x0000051f, 0x00010d50, 0x00010d70,
+	0x000001e8, 0x000001e9, 0x00016e4c, 0x00016e6c,
+	0x00002c2c, 0x00002c5c, 0x00000401, 0x00000451,
+	0x00001f39, 0x00001f31, 0x0000024e, 0x0000024f,
+	0x000024ce, 0x000024e8, 0x0000a7c0, 0x0000a7c1,
+	0x0000a662, 0x0000a663, 0x00000539, 0x00000569,
+	0x000104c1, 0x000104e9, 0x000104b8, 0x000104e0,
+	0x00000543, 0x00000573, 0x00010410, 0x00010438,
+	0x00001f1b, 0x00001f13, 0x00001f6e, 0x00001f66,
+	0x00001fd7, 0x03000288, 0x00001c96, 0x000010d6,
+	0x000118aa, 0x000118ca, 0x00010414, 0x0001043c,
+	0x00001fb9, 0x00001fb1, 0x0000abaa, 0x000013da,
+	0x00000389, 0x000003ae, 0x00000232, 0x00000233,
+	0x00002cb0, 0x00002cb1, 0x00002c6e, 0x00000271,
+	0x00001e6e, 0x00001e6f, 0x0000ab93, 0x000013c3,
+	0x0001e90a, 0x0001e92c, 0x0000a740, 0x0000a741,
+	0x000118a3, 0x000118c3, 0x0000052c, 0x0000052d,
+	0x00001ffa, 0x00001f7c, 0x000004a4, 0x000004a5,
+	0x00010d5d, 0x00010d7d, 0x0000018a, 0x00000257,
+	0x000001d7, 0x000001d8, 0x0000004d, 0x0000006d,
+	0x000004f2, 0x000004f3, 0x00000164, 0x00000165,
+	0x000010b7, 0x00002d17, 0x00002160, 0x00002170,
+	0x0000a7b4, 0x0000a7b5, 0x00001feb, 0x00001f7b,
+	0x00001e58, 0x00001e59, 0x00001eda, 0x00001edb,
+	0x00010d5c, 0x00010d7c, 0x000010ae, 0x00002d0e,
+	0x000001db, 0x000001dc, 0x0000a688, 0x0000a689,
+	0x00000411, 0x00000431, 0x000104b3, 0x000104db,
+	0x00002c01, 0x00002c31, 0x00016e55, 0x00016e75,
+	0x0000a7a2, 0x0000a7a3, 0x00001f3e, 0x00001f36,
+	0x0000054b, 0x0000057b, 0x0000024a, 0x0000024b,
+	0x00001e74, 0x00001e75, 0x000118a6, 0x000118c6,
+	0x00001f8d, 0x020001ee, 0x00002c7f, 0x00000240,
+	0x0000039c, 0x000003bc, 0x000003fe, 0x0000037c,
+	0x00000052, 0x00000072, 0x000024cb, 0x000024e5,
+	0x00016e5a, 0x00016e7a, 0x0000ff35, 0x0000ff55,
+	0x00001f2b, 0x00001f23, 0x000104c7, 0x000104ef,
+	0x0000011e, 0x0000011f, 0x00002164, 0x00002174,
+	0x0000a7c9, 0x0000a7ca, 0x00001f28, 0x00001f20,
+	0x0000ab79, 0x000013a9, 0x00000126, 0x00000127,
+	0x00010588, 0x000105af, 0x0000020e, 0x0000020f,
+	0x0000abb2, 0x000013e2, 0x00000516, 0x00000517,
+	0x0000019f, 0x00000275, 0x000001fc, 0x000001fd,
+	0x0000a7a0, 0x0000a7a1, 0x00001f0d, 0x00001f05,
+	0x00001ece, 0x00001ecf, 0x00000193, 0x00000260,
+	0x0000ab7d, 0x000013ad, 0x00001ca4, 0x000010e4,
+	0x000010b0, 0x00002d10, 0x00002cc4, 0x00002cc5,
+	0x00001f1a, 0x00001f12, 0x0000046c, 0x0000046d,
+	0x00002126, 0x000003c9, 0x00016e45, 0x00016e65,
+	0x00002c0a, 0x00002c3a, 0x00001f18, 0x00001f10,
+	0x00000524, 0x00000525, 0x0001041b, 0x00010443,
+	0x00001caa, 0x000010ea, 0x000001ee, 0x000001ef,
+	0x00000051, 0x00000071, 0x0000053e, 0x0000056e,
+	0x00001e28, 0x00001e29, 0x0001e915, 0x0001e937,
+	0x000010c4, 0x00002d24, 0x00002c84, 0x00002c85,
+	0x00001ff9, 0x00001f79, 0x00001ff6, 0x020002a7,
+	0x0000040e, 0x0000045e, 0x0000fb14, 0x020002cb,
+	0x00001cb1, 0x000010f1, 0x00010d63, 0x00010d83,
+	0x00000498, 0x00000499, 0x000010b1, 0x00002d11,
+	0x0000a79a, 0x0000a79b, 0x0000a7bc, 0x0000a7bd,
+	0x00010d5b, 0x00010d7b, 0x00010d5e, 0x00010d7e,
+	0x00010ca7, 0x00010ce7, 0x00002c1e, 0x00002c4e,
+	0x000024c4, 0x000024de, 0x0000038f, 0x000003ce,
+	0x0000a7f5, 0x0000a7f6, 0x0000012e, 0x0000012f,
+	0x00001fe8, 0x00001fe0, 0x00001eea, 0x00001eeb,
+	0x000003f0, 0x000003ba, 0x00001f0e, 0x00001f06,
+	0x00000058, 0x00000078, 0x00002cac, 0x00002cad,
+	0x00010575, 0x0001059c, 0x00001ef8, 0x00001ef9,
+	0x00000397, 0x000003b7, 0x00010c82, 0x00010cc2,
+	0x000024c1, 0x000024db, 0x00000532, 0x00000562,
+	0x00000496, 0x00000497, 0x000004de, 0x000004df,
+	0x00000170, 0x00000171, 0x00000415, 0x00000435,
+	0x00000241, 0x00000242, 0x00001f85, 0x020001d6,
+	0x00001e1c, 0x00001e1d, 0x000013fa, 0x000013f2,
+	0x0001058f, 0x000105b6, 0x00010c97, 0x00010cd7,
+	0x00000057, 0x00000077, 0x00002c8c, 0x00002c8d,
+	0x00001ef0, 0x00001ef1, 0x000104c8, 0x000104f0,
+	0x00001f2f, 0x00001f27, 0x00000112, 0x00000113,
+	0x00010419, 0x00010441, 0x00000419, 0x00000439,
+	0x00000480, 0x00000481, 0x0000ab9b, 0x000013cb,
+	0x00010573, 0x0001059a, 0x00010409, 0x00010431,
+	0x0000fb02, 0x020002b7, 0x00001fa5, 0x02000236,
+	0x00000556, 0x00000586, 0x0000038e, 0x000003cd,
+	0x000001fa, 0x000001fb, 0x000000d6, 0x000000f6,
+	0x00002c2e, 0x00002c5e, 0x0000a76e, 0x0000a76f,
+	0x000003d6, 0x000003c0, 0x00010577, 0x0001059e,
+	0x000010ab, 0x00002d0b, 0x0000a77e, 0x0000a77f,
+	0x0000a664, 0x0000a665, 0x00001ecc, 0x00001ecd,
+	0x00000425, 0x00000445, 0x00001faf, 0x02000254,
+	0x000024bc, 0x000024d6, 0x00016e42, 0x00016e62,
+	0x00001fad, 0x0200024e, 0x000004b2, 0x000004b3,
+	0x0000012c, 0x0000012d, 0x000104cd, 0x000104f5,
+	0x000001e2, 0x000001e3, 0x000003cf, 0x000003d7,
+	0x00002c10, 0x00002c40, 0x00000550, 0x00000580,
+	0x0001057c, 0x000105a3, 0x00000204, 0x00000205,
+	0x00002c03, 0x00002c33, 0x0000fb03, 0x030002ba,
+	0x00001e22, 0x00001e23, 0x000010ba, 0x00002d1a,
+	0x00000490, 0x00000491, 0x0000a74e, 0x0000a74f,
+	0x00000145, 0x00000146, 0x0000a68e, 0x0000a68f,
+	0x0000ab72, 0x000013a2, 0x000004a6, 0x000004a7,
+	0x0000fb16, 0x020002d1, 0x0001e913, 0x0001e935,
+	0x0000016e, 0x0000016f, 0x00001f50, 0x020001b8,
+	0x00001f8b, 0x020001e8, 0x00001e3c, 0x00001e3d,
+	0x00010c9b, 0x00010cdb, 0x0000a73e, 0x0000a73f,
+	0x00000143, 0x00000144, 0x00000502, 0x00000503,
+	0x00001e70, 0x00001e71, 0x00001cbf, 0x000010ff,
+	0x00010ca6, 0x00010ce6, 0x000000cd, 0x000000ed,
+	0x00002ca0, 0x00002ca1, 0x0000a68a, 0x0000a68b,
+	0x0000ab89, 0x000013b9, 0x00001f48, 0x00001f40,
+	0x00002c6d, 0x00000251, 0x00000178, 0x000000ff,
+	0x0000212a, 0x0000006b, 0x00001fe7, 0x0300029a,
+	0x0000a798, 0x0000a799, 0x0001e920, 0x0001e942,
+	0x0001040b, 0x00010433, 0x00000055, 0x00000075,
+	0x00010416, 0x0001043e, 0x00001f54, 0x030001bf,
+	0x00000390, 0x0300019b, 0x000003e2, 0x000003e3,
+	0x000024b8, 0x000024d2, 0x00010571, 0x00010598,
+	0x0001e912, 0x0001e934, 0x0000ff37, 0x0000ff57,
+	0x0000023d, 0x0000019a, 0x000024be, 0x000024d8,
+	0x0000011a, 0x0000011b, 0x00002cd2, 0x00002cd3,
+	0x000118b6, 0x000118d6, 0x0000041c, 0x0000043c,
+	0x000000d5, 0x000000f5, 0x00010579, 0x000105a0,
+	0x0000019d, 0x00000272, 0x000010b3, 0x00002d13,
+	0x00010c81, 0x00010cc1, 0x00000518, 0x00000519,
+	0x0000a752, 0x0000a753, 0x00000136, 0x00000137,
+	0x00002c63, 0x00001d7d, 0x00001fc7, 0x03000276,
+	0x00002c7e, 0x0000023f, 0x0000a7c7, 0x0000a7c8,
+	0x0000042c, 0x0000044c, 0x00010408, 0x00010430,
+	0x00010c9d, 0x00010cdd, 0x00002cc6, 0x00002cc7,
+	0x00016e5c, 0x00016e7c, 0x00000460, 0x00000461,
+	0x00001f8c, 0x020001eb, 0x00000154, 0x00000155,
+	0x000004c9, 0x000004ca, 0x00001f19, 0x00001f11,
+	0x00001f9e, 0x02000221, 0x00000386, 0x000003ac,
+	0x00002c0b, 0x00002c3b, 0x000001ea, 0x000001eb,
+	0x000010bb, 0x00002d1b, 0x0000abac, 0x000013dc,
+	0x00000426, 0x00000446, 0x000118b5, 0x000118d5,
+	0x0000024c, 0x0000024d, 0x000010af, 0x00002d0f,
+	0x00001c9c, 0x000010dc, 0x00002cb6, 0x00002cb7,
+	0x00000410, 0x00000430, 0x0000ff28, 0x0000ff48,
+	0x0000038c, 0x000003cc, 0x000010c2, 0x00002d22,
+	0x00000427, 0x00000447
 };
 
 static const unsigned _uccase_extra_table[] = {
diff --git a/ext/mysqli/mysqli_arginfo.h b/ext/mysqli/mysqli_arginfo.h
index a76905fad3209..4e624d623d807 100644
--- a/ext/mysqli/mysqli_arginfo.h
+++ b/ext/mysqli/mysqli_arginfo.h
@@ -1150,7 +1150,7 @@ static void register_mysqli_symbols(int module_number)
 
 	zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "mysqli_connect", sizeof("mysqli_connect") - 1), 2, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
 
-	zend_attribute *attribute_Deprecated_func_mysqli_kill_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mysqli_kill", sizeof("mysqli_kill") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_mysqli_kill_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mysqli_kill", sizeof("mysqli_kill") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_mysqli_kill_0_arg0;
 	zend_string *attribute_Deprecated_func_mysqli_kill_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_mysqli_kill_0_arg0, attribute_Deprecated_func_mysqli_kill_0_arg0_str);
@@ -1162,7 +1162,7 @@ static void register_mysqli_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_mysqli_kill_0->args[1].value, &attribute_Deprecated_func_mysqli_kill_0_arg1);
 	attribute_Deprecated_func_mysqli_kill_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_mysqli_ping_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mysqli_ping", sizeof("mysqli_ping") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_mysqli_ping_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mysqli_ping", sizeof("mysqli_ping") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_mysqli_ping_0_arg0;
 	zend_string *attribute_Deprecated_func_mysqli_ping_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_mysqli_ping_0_arg0, attribute_Deprecated_func_mysqli_ping_0_arg0_str);
@@ -1176,7 +1176,7 @@ static void register_mysqli_symbols(int module_number)
 
 	zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "mysqli_real_connect", sizeof("mysqli_real_connect") - 1), 3, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
 
-	zend_attribute *attribute_Deprecated_func_mysqli_refresh_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mysqli_refresh", sizeof("mysqli_refresh") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_mysqli_refresh_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "mysqli_refresh", sizeof("mysqli_refresh") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_mysqli_refresh_0_arg0;
 	zend_string *attribute_Deprecated_func_mysqli_refresh_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_mysqli_refresh_0_arg0, attribute_Deprecated_func_mysqli_refresh_0_arg0_str);
@@ -1345,7 +1345,7 @@ static zend_class_entry *register_class_mysqli(void)
 
 	zend_add_parameter_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "connect", sizeof("connect") - 1), 2, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
 
-	zend_attribute *attribute_Deprecated_func_get_client_info_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "get_client_info", sizeof("get_client_info") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_get_client_info_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "get_client_info", sizeof("get_client_info") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_get_client_info_0_arg0;
 	zend_string *attribute_Deprecated_func_get_client_info_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_get_client_info_0_arg0, attribute_Deprecated_func_get_client_info_0_arg0_str);
@@ -1357,7 +1357,7 @@ static zend_class_entry *register_class_mysqli(void)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_get_client_info_0->args[1].value, &attribute_Deprecated_func_get_client_info_0_arg1);
 	attribute_Deprecated_func_get_client_info_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_init_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "init", sizeof("init") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_init_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "init", sizeof("init") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_init_0_arg0;
 	zend_string *attribute_Deprecated_func_init_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_init_0_arg0, attribute_Deprecated_func_init_0_arg0_str);
@@ -1369,7 +1369,7 @@ static zend_class_entry *register_class_mysqli(void)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_init_0->args[1].value, &attribute_Deprecated_func_init_0_arg1);
 	attribute_Deprecated_func_init_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_kill_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "kill", sizeof("kill") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_kill_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "kill", sizeof("kill") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_kill_0_arg0;
 	zend_string *attribute_Deprecated_func_kill_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_kill_0_arg0, attribute_Deprecated_func_kill_0_arg0_str);
@@ -1381,7 +1381,7 @@ static zend_class_entry *register_class_mysqli(void)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_kill_0->args[1].value, &attribute_Deprecated_func_kill_0_arg1);
 	attribute_Deprecated_func_kill_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_ping_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "ping", sizeof("ping") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_ping_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "ping", sizeof("ping") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_ping_0_arg0;
 	zend_string *attribute_Deprecated_func_ping_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_ping_0_arg0, attribute_Deprecated_func_ping_0_arg0_str);
@@ -1395,7 +1395,7 @@ static zend_class_entry *register_class_mysqli(void)
 
 	zend_add_parameter_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "real_connect", sizeof("real_connect") - 1), 2, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
 
-	zend_attribute *attribute_Deprecated_func_refresh_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "refresh", sizeof("refresh") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_refresh_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "refresh", sizeof("refresh") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_refresh_0_arg0;
 	zend_string *attribute_Deprecated_func_refresh_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_refresh_0_arg0, attribute_Deprecated_func_refresh_0_arg0_str);
@@ -1444,9 +1444,7 @@ static zend_class_entry *register_class_mysqli_result(zend_class_entry *class_en
 
 	zval property_type_default_value;
 	ZVAL_UNDEF(&property_type_default_value);
-	zend_string *property_type_name = zend_string_init("type", sizeof("type") - 1, 1);
-	zend_declare_typed_property(class_entry, property_type_name, &property_type_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(property_type_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_TYPE), &property_type_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 
 	return class_entry;
 }
@@ -1530,9 +1528,7 @@ static zend_class_entry *register_class_mysqli_warning(void)
 
 	zval property_message_default_value;
 	ZVAL_UNDEF(&property_message_default_value);
-	zend_string *property_message_name = zend_string_init("message", sizeof("message") - 1, 1);
-	zend_declare_typed_property(class_entry, property_message_name, &property_message_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_message_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_MESSAGE), &property_message_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_sqlstate_default_value;
 	ZVAL_UNDEF(&property_sqlstate_default_value);
diff --git a/ext/odbc/odbc_arginfo.h b/ext/odbc/odbc_arginfo.h
index 43868b54aa757..d586f5a948edc 100644
--- a/ext/odbc/odbc_arginfo.h
+++ b/ext/odbc/odbc_arginfo.h
@@ -461,7 +461,7 @@ static void register_odbc_symbols(int module_number)
 #endif
 
 
-	zend_attribute *attribute_Deprecated_func_odbc_result_all_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "odbc_result_all", sizeof("odbc_result_all") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_odbc_result_all_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "odbc_result_all", sizeof("odbc_result_all") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_odbc_result_all_0_arg0;
 	zend_string *attribute_Deprecated_func_odbc_result_all_0_arg0_str = zend_string_init("8.1", strlen("8.1"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_odbc_result_all_0_arg0, attribute_Deprecated_func_odbc_result_all_0_arg0_str);
diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c
index 108c2f663ad1a..464e0f0d45935 100644
--- a/ext/odbc/php_odbc.c
+++ b/ext/odbc/php_odbc.c
@@ -1995,10 +1995,10 @@ PHP_FUNCTION(odbc_result_all)
 	}
 
 	/* Start table tag */
-	if (ZEND_NUM_ARGS() == 1) {
-		php_printf("");
-	} else {
+	if (pv_format != NULL) {
 		php_printf("", pv_format);
+	} else {
+		php_printf("");
 	}
 
 	for (i = 0; i < result->numcols; i++) {
@@ -2284,7 +2284,6 @@ void odbc_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
 	size_t db_len, uid_len, pwd_len;
 	zend_long pv_opt = SQL_CUR_DEFAULT;
 	odbc_connection *db_conn;
-	int cur_opt;
 
 	ZEND_PARSE_PARAMETERS_START(1, 4)
 		Z_PARAM_STRING(db, db_len)
@@ -2294,19 +2293,17 @@ void odbc_do_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent)
 		Z_PARAM_LONG(pv_opt)
 	ZEND_PARSE_PARAMETERS_END();
 
-	cur_opt = pv_opt;
-
-	if (ZEND_NUM_ARGS() > 3) {
-		/* Confirm the cur_opt range */
-		if (! (cur_opt == SQL_CUR_USE_IF_NEEDED ||
-			cur_opt == SQL_CUR_USE_ODBC ||
-			cur_opt == SQL_CUR_USE_DRIVER ||
-			cur_opt == SQL_CUR_DEFAULT) ) {
-			zend_argument_value_error(4, "must be one of SQL_CUR_USE_IF_NEEDED, "
-				"SQL_CUR_USE_ODBC, or SQL_CUR_USE_DRIVER");
-			RETURN_THROWS();
-		}
+	if (
+		pv_opt != SQL_CUR_DEFAULT
+		&& pv_opt != SQL_CUR_USE_IF_NEEDED
+		&& pv_opt != SQL_CUR_USE_ODBC
+		&& pv_opt != SQL_CUR_USE_DRIVER
+	) {
+		zend_argument_value_error(4, "must be one of SQL_CUR_USE_IF_NEEDED, "
+			"SQL_CUR_USE_ODBC, or SQL_CUR_USE_DRIVER");
+		RETURN_THROWS();
 	}
+	int cur_opt = (int) pv_opt;
 
 	if (!ODBCG(allow_persistent)) {
 		persistent = 0;
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index f9514d4807c4e..3e8bdea9c7a6b 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -2428,9 +2428,22 @@ static zend_class_entry* zend_accel_inheritance_cache_add(zend_class_entry *ce,
 		} ZEND_HASH_FOREACH_END();
 		ZCG(mem) = (char*)ZCG(mem) + zend_hash_num_elements(dependencies) * sizeof(zend_class_dependency);
 	}
+
+	/* See GH-15657: `zend_persist_class_entry` can JIT property hook code via
+	 * `zend_persist_property_info`, but the inheritance cache should not
+	 * JIT those at this point in time. */
+#ifdef HAVE_JIT
+	bool jit_on_old = JIT_G(on);
+	JIT_G(on) = false;
+#endif
+
 	entry->ce = new_ce = zend_persist_class_entry(ce);
 	zend_update_parent_ce(new_ce);
 
+#ifdef HAVE_JIT
+	JIT_G(on) = jit_on_old;
+#endif
+
 	entry->num_warnings = EG(num_errors);
 	entry->warnings = zend_persist_warnings(EG(num_errors), EG(errors));
 	entry->next = proto->inheritance_cache;
@@ -2598,10 +2611,6 @@ static void accel_reset_pcre_cache(void)
 {
 	Bucket *p;
 
-	if (PCRE_G(per_request_cache)) {
-		return;
-	}
-
 	ZEND_HASH_MAP_FOREACH_BUCKET(&PCRE_G(pcre_cache), p) {
 		/* Remove PCRE cache entries with inconsistent keys */
 		if (zend_accel_in_shm(p->key)) {
@@ -3422,6 +3431,11 @@ void zend_accel_schedule_restart(zend_accel_restart_reason reason)
 		/* don't schedule twice */
 		return;
 	}
+
+	if (UNEXPECTED(zend_accel_schedule_restart_hook)) {
+		zend_accel_schedule_restart_hook(reason);
+	}
+
 	zend_accel_error(ACCEL_LOG_DEBUG, "Restart Scheduled! Reason: %s",
 			zend_accel_restart_reason_text[reason]);
 
diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h
index 682677441e413..162892bf2c279 100644
--- a/ext/opcache/ZendAccelerator.h
+++ b/ext/opcache/ZendAccelerator.h
@@ -311,7 +311,7 @@ extern const char *zps_api_failure_reason;
 BEGIN_EXTERN_C()
 
 void accel_shutdown(void);
-zend_result  accel_activate(INIT_FUNC_ARGS);
+zend_result accel_activate(INIT_FUNC_ARGS);
 zend_result accel_post_deactivate(void);
 void zend_accel_schedule_restart(zend_accel_restart_reason reason);
 void zend_accel_schedule_restart_if_necessary(zend_accel_restart_reason reason);
diff --git a/ext/opcache/config.w32 b/ext/opcache/config.w32
index d0af7258ac66f..16c137f47a810 100644
--- a/ext/opcache/config.w32
+++ b/ext/opcache/config.w32
@@ -1,10 +1,9 @@
 ARG_ENABLE("opcache", "whether to enable Zend OPcache support", "yes");
+ARG_ENABLE("opcache-jit", "whether to enable JIT", "yes");
 
 
 if (PHP_OPCACHE != "no") {
 
-	ARG_ENABLE("opcache-jit", "whether to enable JIT", "yes");
-
 	ZEND_EXTENSION('opcache', "\
 		ZendAccelerator.c \
 		zend_accelerator_blacklist.c \
diff --git a/ext/opcache/jit/ir/ir_cfg.c b/ext/opcache/jit/ir/ir_cfg.c
index 81ecc09c9ea4d..c2893dcf292d6 100644
--- a/ext/opcache/jit/ir/ir_cfg.c
+++ b/ext/opcache/jit/ir/ir_cfg.c
@@ -97,7 +97,7 @@ int ir_build_cfg(ir_ctx *ctx)
 		/* Some successors of IF and SWITCH nodes may be inaccessible by backward DFS */
 		use_list = &ctx->use_lists[end];
 		n = use_list->count;
-		if (n > 1) {
+		if (n > 1 || (n == 1 && (ir_op_flags[insn->op] & IR_OP_FLAG_TERMINATOR) != 0)) {
 			for (p = &ctx->use_edges[use_list->refs]; n > 0; p++, n--) {
 				/* Remember possible inaccessible successors */
 				ir_bitset_incl(bb_leaks, *p);
@@ -245,6 +245,7 @@ int ir_build_cfg(ir_ctx *ctx)
 				IR_ASSERT(ref);
 				ir_ref pred_b = _blocks[ref];
 				ir_block *pred_bb = &blocks[pred_b];
+				IR_ASSERT(pred_b > 0);
 				*q = pred_b;
 				edges[pred_bb->successors + pred_bb->successors_count++] = b;
 			}
@@ -661,7 +662,7 @@ int ir_build_dominators_tree(ir_ctx *ctx)
 		uint32_t idom = *p;
 		ir_block *idom_bb;
 
-		if (UNEXPECTED(idom > b)) {
+		if (UNEXPECTED(idom >= b)) {
 			/* In rare cases, LOOP_BEGIN.op1 may be a back-edge. Skip back-edges. */
 			ctx->flags2 &= ~IR_NO_LOOPS;
 			IR_ASSERT(k > 1 && "Wrong blocks order: BB is before its single predecessor");
@@ -1032,6 +1033,20 @@ int ir_find_loops(ir_ctx *ctx)
 				bb->loop_depth = loop_depth;
 				if (bb->flags & (IR_BB_ENTRY|IR_BB_LOOP_WITH_ENTRY)) {
 					loop->flags |= IR_BB_LOOP_WITH_ENTRY;
+					if (loop_depth > 1) {
+						/* Set IR_BB_LOOP_WITH_ENTRY flag for all the enclosing loops */
+						bb = &blocks[loop->loop_header];
+						while (1) {
+							if (bb->flags & IR_BB_LOOP_WITH_ENTRY) {
+								break;
+							}
+							bb->flags |= IR_BB_LOOP_WITH_ENTRY;
+							if (bb->loop_depth == 1) {
+								break;
+							}
+							bb = &blocks[loop->loop_header];
+						}
+					}
 				}
 			}
 		}
diff --git a/ext/opcache/jit/ir/ir_gcm.c b/ext/opcache/jit/ir/ir_gcm.c
index 0dbde2fecec8e..0d816ab88e229 100644
--- a/ext/opcache/jit/ir/ir_gcm.c
+++ b/ext/opcache/jit/ir/ir_gcm.c
@@ -112,6 +112,25 @@ static uint32_t ir_gcm_select_best_block(ir_ctx *ctx, ir_ref ref, uint32_t lca)
 		bb = &ctx->cfg_blocks[b];
 		if (bb->loop_depth < loop_depth) {
 			if (!bb->loop_depth) {
+#if 1
+				/* Avoid LICM if LOOP doesn't have a pre-header block */
+				ir_block *loop_bb = &ctx->cfg_blocks[best];
+
+				if (!(loop_bb->flags & IR_BB_LOOP_HEADER)) {
+					loop_bb = &ctx->cfg_blocks[loop_bb->loop_header];
+				}
+				if (loop_bb->predecessors_count > 2) {
+					int n = loop_bb->predecessors_count;
+					uint32_t *p = ctx->cfg_edges + loop_bb->predecessors;
+
+					while (n && *p != b) {
+						n--; p++;
+					}
+					if (!n) {
+						break;
+					}
+				}
+#endif
 				best = b;
 				break;
 			}
diff --git a/ext/opcache/jit/ir/ir_gdb.c b/ext/opcache/jit/ir/ir_gdb.c
index cf3a507d25371..ecaf880301e65 100644
--- a/ext/opcache/jit/ir/ir_gdb.c
+++ b/ext/opcache/jit/ir/ir_gdb.c
@@ -500,13 +500,14 @@ typedef struct _ir_gdbjit_descriptor {
 	struct _ir_gdbjit_code_entry *first_entry;
 } ir_gdbjit_descriptor;
 
+#ifdef IR_EXTERNAL_GDB_ENTRY
+extern ir_gdbjit_descriptor __jit_debug_descriptor;
+void __jit_debug_register_code(void);
+#else
 ir_gdbjit_descriptor __jit_debug_descriptor = {
 	1, IR_GDBJIT_NOACTION, NULL, NULL
 };
 
-#ifdef IR_EXTERNAL_GDB_ENTRY
-void __jit_debug_register_code(void);
-#else
 IR_NEVER_INLINE void __jit_debug_register_code(void)
 {
 	__asm__ __volatile__("");
diff --git a/ext/opcache/jit/ir/ir_php.h b/ext/opcache/jit/ir/ir_php.h
index d26f78c99bc7a..370611f1ac3e2 100644
--- a/ext/opcache/jit/ir/ir_php.h
+++ b/ext/opcache/jit/ir/ir_php.h
@@ -30,8 +30,6 @@
 # define ir_mem_free    efree
 #endif
 
-#if defined(IR_TARGET_AARCH64)
-# define IR_EXTERNAL_GDB_ENTRY
-#endif
+#define IR_EXTERNAL_GDB_ENTRY
 
 #endif /* IR_PHP_H */
diff --git a/ext/opcache/jit/ir/ir_ra.c b/ext/opcache/jit/ir/ir_ra.c
index 5c1eee0f34be7..dcc67e0074fa4 100644
--- a/ext/opcache/jit/ir/ir_ra.c
+++ b/ext/opcache/jit/ir/ir_ra.c
@@ -2007,7 +2007,7 @@ int ir_coalesce(ir_ctx *ctx)
 							if (ctx->binding) {
 								ir_ref b1 = ir_binding_find(ctx, i);
 								ir_ref b2 = ir_binding_find(ctx, insn->op1);
-								if (b1 != b2) {
+								if (b1 && b1 != b2) {
 									continue;
 								}
 							}
diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c
index 56d8cc7afe9ed..da3dacf338d57 100644
--- a/ext/opcache/jit/zend_jit.c
+++ b/ext/opcache/jit/zend_jit.c
@@ -558,6 +558,43 @@ static bool zend_jit_is_persistent_constant(zval *key, uint32_t flags)
 	return c && (ZEND_CONSTANT_FLAGS(c) & CONST_PERSISTENT);
 }
 
+static zend_class_entry* zend_get_known_class(const zend_op_array *op_array, const zend_op *opline, uint8_t op_type, znode_op op)
+{
+	zend_class_entry *ce = NULL;
+
+	if (op_type == IS_CONST) {
+		zval *zv = RT_CONSTANT(opline, op);
+		zend_string *class_name;
+
+		ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING);
+		class_name = Z_STR_P(zv);
+		ce = zend_lookup_class_ex(class_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
+		if (ce && (ce->type == ZEND_INTERNAL_CLASS || ce->info.user.filename != op_array->filename)) {
+			ce = NULL;
+		}
+	} else {
+		ZEND_ASSERT(op_type == IS_UNUSED);
+		if ((op.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF) {
+			ce = op_array->scope;
+		} else {
+			ZEND_ASSERT((op.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT);
+			ce = op_array->scope;
+			if (ce) {
+				if (ce->parent) {
+					ce = ce->parent;
+					if (ce->type == ZEND_INTERNAL_CLASS || ce->info.user.filename != op_array->filename) {
+						ce = NULL;
+					}
+				} else {
+					ce = NULL;
+				}
+			}
+		}
+	}
+
+	return ce;
+}
+
 static zend_property_info* zend_get_known_property_info(const zend_op_array *op_array, zend_class_entry *ce, zend_string *member, bool on_this, zend_string *filename)
 {
 	zend_property_info *info = NULL;
@@ -706,7 +743,7 @@ static bool zend_may_be_dynamic_property(zend_class_entry *ce, zend_string *memb
 # endif
 #endif
 
-void zend_jit_status(zval *ret)
+ZEND_EXT_API void zend_jit_status(zval *ret)
 {
 	zval stats;
 	array_init(&stats);
@@ -1286,6 +1323,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
 	bool ce_is_instanceof;
 	bool on_this;
 
+	ZEND_ASSERT(!(op_array->fn_flags & ZEND_ACC_CLOSURE) || !(op_array->scope));
+
 	if (JIT_G(bisect_limit)) {
 		jit_bisect_pos++;
 		if (jit_bisect_pos >= JIT_G(bisect_limit)) {
@@ -1702,7 +1741,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
 							break;
 						}
 						if (!zend_jit_assign_dim_op(&ctx, opline,
-								OP1_INFO(), OP1_DEF_INFO(), OP1_REG_ADDR(),
+								OP1_INFO(), OP1_DEF_INFO(), OP1_REG_ADDR(), 0,
 								OP2_INFO(), (opline->op2_type != IS_UNUSED) ? OP2_REG_ADDR() : 0,
 								(opline->op2_type != IS_UNUSED) ? OP2_RANGE() : NULL,
 								OP1_DATA_INFO(), OP1_DATA_REG_ADDR(), OP1_DATA_RANGE(), IS_UNKNOWN,
@@ -1718,7 +1757,7 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
 							break;
 						}
 						if (!zend_jit_assign_dim(&ctx, opline,
-								OP1_INFO(), OP1_REG_ADDR(),
+								OP1_INFO(), OP1_REG_ADDR(), 0,
 								OP2_INFO(), (opline->op2_type != IS_UNUSED) ? OP2_REG_ADDR() : 0,
 								(opline->op2_type != IS_UNUSED) ? OP2_RANGE() : NULL,
 								OP1_DATA_INFO(), OP1_DATA_REG_ADDR(),
@@ -2349,6 +2388,22 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
 							goto jit_failure;
 						}
 						goto done;
+					case ZEND_FETCH_STATIC_PROP_R:
+					case ZEND_FETCH_STATIC_PROP_IS:
+					case ZEND_FETCH_STATIC_PROP_W:
+					case ZEND_FETCH_STATIC_PROP_RW:
+					case ZEND_FETCH_STATIC_PROP_UNSET:
+						if (!(opline->op1_type == IS_CONST
+						 && (opline->op2_type == IS_CONST
+						  || (opline->op2_type == IS_UNUSED
+						   && ((opline->op2.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF
+						    || (opline->op2.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT))))) {
+							break;
+						}
+						if (!zend_jit_fetch_static_prop(&ctx, opline, op_array)) {
+							goto jit_failure;
+						}
+						goto done;
 					case ZEND_BIND_GLOBAL:
 						if (!ssa->ops || !ssa->var_info) {
 							op1_info = MAY_BE_ANY|MAY_BE_REF;
@@ -2504,6 +2559,19 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
 							goto jit_failure;
 						}
 						goto done;
+					case ZEND_INIT_STATIC_METHOD_CALL:
+						if (!(opline->op2_type == IS_CONST
+						 && (opline->op1_type == IS_CONST
+						  || (opline->op1_type == IS_UNUSED
+						   && ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF
+						    || (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT))))) {
+							break;
+						}
+						if (!zend_jit_init_static_method_call(&ctx, opline, b, op_array, ssa, ssa_op, call_level,
+								NULL, 0)) {
+							goto jit_failure;
+						}
+						goto done;
 					case ZEND_ROPE_INIT:
 					case ZEND_ROPE_ADD:
 					case ZEND_ROPE_END:
@@ -2537,7 +2605,13 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
 				case ZEND_OP_DATA:
 				case ZEND_SWITCH_LONG:
 				case ZEND_SWITCH_STRING:
+					break;
 				case ZEND_MATCH:
+					/* We have to exit to the VM because the MATCH handler performs an N-way jump for
+					 * which we can't generate simple (opcache.jit=1201) JIT code. */
+					if (!zend_jit_tail_handler(&ctx, opline)) {
+						goto jit_failure;
+					}
 					break;
 				case ZEND_JMP:
 					if (JIT_G(opt_level) < ZEND_JIT_LEVEL_INLINE) {
@@ -2797,21 +2871,36 @@ static void zend_jit_cleanup_func_info(zend_op_array *op_array)
 	}
 }
 
-static int zend_real_jit_func(zend_op_array *op_array, zend_script *script, const zend_op *rt_opline)
+static int zend_real_jit_func(zend_op_array *op_array, zend_script *script, const zend_op *rt_opline, uint8_t trigger)
 {
 	zend_ssa ssa;
 	void *checkpoint;
 	zend_func_info *func_info;
+	uint8_t orig_trigger;
 
 	if (*dasm_ptr == dasm_end) {
 		return FAILURE;
 	}
 
+	orig_trigger = JIT_G(trigger);
+	JIT_G(trigger) = trigger;
 	checkpoint = zend_arena_checkpoint(CG(arena));
 
 	/* Build SSA */
 	memset(&ssa, 0, sizeof(zend_ssa));
 
+	if (op_array->fn_flags & ZEND_ACC_CLOSURE) {
+		if (trigger == ZEND_JIT_ON_FIRST_EXEC) {
+			zend_jit_op_array_extension *jit_extension = (zend_jit_op_array_extension*)ZEND_FUNC_INFO(op_array);
+			op_array = (zend_op_array*) jit_extension->op_array;
+		} else if (trigger == ZEND_JIT_ON_HOT_COUNTERS) {
+			zend_jit_op_array_hot_extension *jit_extension = (zend_jit_op_array_hot_extension*)ZEND_FUNC_INFO(op_array);
+			op_array = (zend_op_array*) jit_extension->op_array;
+		} else {
+			ZEND_ASSERT(!op_array->scope);
+		}
+	}
+
 	if (zend_jit_op_array_analyze1(op_array, script, &ssa) != SUCCESS) {
 		goto jit_failure;
 	}
@@ -2839,11 +2928,13 @@ static int zend_real_jit_func(zend_op_array *op_array, zend_script *script, cons
 
 	zend_jit_cleanup_func_info(op_array);
 	zend_arena_release(&CG(arena), checkpoint);
+	JIT_G(trigger) = orig_trigger;
 	return SUCCESS;
 
 jit_failure:
 	zend_jit_cleanup_func_info(op_array);
 	zend_arena_release(&CG(arena), checkpoint);
+	JIT_G(trigger) = orig_trigger;
 	return FAILURE;
 }
 
@@ -2874,7 +2965,7 @@ static int ZEND_FASTCALL zend_runtime_jit(void)
 			opline->handler = jit_extension->orig_handler;
 
 			/* perform real JIT for this function */
-			zend_real_jit_func(op_array, NULL, NULL);
+			zend_real_jit_func(op_array, NULL, NULL, ZEND_JIT_ON_FIRST_EXEC);
 		} zend_catch {
 			do_bailout = true;
 		} zend_end_try();
@@ -2920,7 +3011,7 @@ void zend_jit_check_funcs(HashTable *function_table, bool is_method) {
 			jit_extension = (zend_jit_op_array_extension*)ZEND_FUNC_INFO(op_array);
 			opline->handler = jit_extension->orig_handler;
 			if (((double)counter / (double)zend_jit_profile_counter) > JIT_G(prof_threshold)) {
-				zend_real_jit_func(op_array, NULL, NULL);
+				zend_real_jit_func(op_array, NULL, NULL, ZEND_JIT_ON_PROF_REQUEST);
 			}
 		}
 	} ZEND_HASH_FOREACH_END();
@@ -2946,7 +3037,7 @@ void ZEND_FASTCALL zend_jit_hot_func(zend_execute_data *execute_data, const zend
 			}
 
 			/* perform real JIT for this function */
-			zend_real_jit_func(op_array, NULL, opline);
+			zend_real_jit_func(op_array, NULL, opline, ZEND_JIT_ON_HOT_COUNTERS);
 		} zend_catch {
 			do_bailout = 1;
 		} zend_end_try();
@@ -3029,6 +3120,7 @@ static int zend_jit_setup_hot_counters(zend_op_array *op_array)
 	}
 	memset(&jit_extension->func_info, 0, sizeof(zend_func_info));
 	jit_extension->func_info.flags = ZEND_FUNC_JIT_ON_HOT_COUNTERS;
+	jit_extension->op_array = op_array;
 	jit_extension->counter = &zend_jit_hot_counters[zend_jit_op_array_hash(op_array) & (ZEND_HOT_COUNTERS_COUNT - 1)];
 	for (i = 0; i < op_array->last; i++) {
 		jit_extension->orig_handlers[i] = op_array->opcodes[i].handler;
@@ -3073,6 +3165,7 @@ int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
 		}
 		memset(&jit_extension->func_info, 0, sizeof(zend_func_info));
 		jit_extension->func_info.flags = ZEND_FUNC_JIT_ON_FIRST_EXEC;
+		jit_extension->op_array = op_array;
 		jit_extension->orig_handler = (void*)opline->handler;
 		ZEND_SET_FUNC_INFO(op_array, (void*)jit_extension);
 		opline->handler = (const void*)zend_jit_runtime_jit_handler;
@@ -3102,6 +3195,7 @@ int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
 			}
 			memset(&jit_extension->func_info, 0, sizeof(zend_func_info));
 			jit_extension->func_info.flags = ZEND_FUNC_JIT_ON_PROF_REQUEST;
+			jit_extension->op_array = op_array;
 			jit_extension->orig_handler = (void*)opline->handler;
 			ZEND_SET_FUNC_INFO(op_array, (void*)jit_extension);
 			opline->handler = (const void*)zend_jit_profile_jit_handler;
@@ -3114,7 +3208,7 @@ int zend_jit_op_array(zend_op_array *op_array, zend_script *script)
 	} else if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
 		return zend_jit_setup_hot_trace_counters(op_array);
 	} else if (JIT_G(trigger) == ZEND_JIT_ON_SCRIPT_LOAD) {
-		return zend_real_jit_func(op_array, script, NULL);
+		return zend_real_jit_func(op_array, script, NULL, ZEND_JIT_ON_SCRIPT_LOAD);
 	} else {
 		ZEND_UNREACHABLE();
 	}
@@ -3342,7 +3436,7 @@ static int zend_jit_parse_config_num(zend_long jit)
 	JIT_G(opt_level) = jit % 10;
 
 	jit /= 10;
-	if (jit % 10 > 5) return FAILURE;
+	if (jit % 10 > 5 || jit % 10 == 4) return FAILURE;
 	JIT_G(trigger) = jit % 10;
 
 	jit /= 10;
diff --git a/ext/opcache/jit/zend_jit.h b/ext/opcache/jit/zend_jit.h
index 1e0176a4f4f55..0ce6c1a4409a2 100644
--- a/ext/opcache/jit/zend_jit.h
+++ b/ext/opcache/jit/zend_jit.h
@@ -162,7 +162,8 @@ void zend_jit_startup(void *jit_buffer, size_t size, bool reattached);
 void zend_jit_shutdown(void);
 void zend_jit_activate(void);
 void zend_jit_deactivate(void);
-void zend_jit_status(zval *ret);
+ZEND_EXT_API void zend_jit_status(zval *ret);
+ZEND_EXT_API void zend_jit_blacklist_function(zend_op_array *op_array);
 void zend_jit_restart(void);
 
 #define ZREG_LOAD           (1<<0)
diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c
index a1370ea0723a8..3eec4df0ecc7e 100644
--- a/ext/opcache/jit/zend_jit_helpers.c
+++ b/ext/opcache/jit/zend_jit_helpers.c
@@ -42,7 +42,7 @@ static zend_never_inline zend_op_array* ZEND_FASTCALL zend_jit_init_func_run_tim
 {
 	void **run_time_cache;
 
-	if (!RUN_TIME_CACHE(op_array)) {
+	if (op_array->type == ZEND_USER_FUNCTION && !RUN_TIME_CACHE(op_array)) {
 		run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size);
 		memset(run_time_cache, 0, op_array->cache_size);
 		ZEND_MAP_PTR_SET(op_array->run_time_cache, run_time_cache);
@@ -189,14 +189,100 @@ static zend_function* ZEND_FASTCALL zend_jit_find_method_tmp_helper(zend_object
 	return fbc;
 }
 
-static zend_execute_data* ZEND_FASTCALL zend_jit_push_static_metod_call_frame(zend_object *obj, zend_function *fbc, uint32_t num_args)
+
+static zend_class_entry* ZEND_FASTCALL zend_jit_find_class_helper(zend_execute_data *execute_data)
+{
+	const zend_op *opline = EX(opline);
+	zend_class_entry *ce;
+
+	if (opline->op1_type == IS_CONST) {
+		/* no function found. try a static method in class */
+		ce = CACHED_PTR(opline->result.num);
+		if (UNEXPECTED(ce == NULL)) {
+			ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op1)), Z_STR_P(RT_CONSTANT(opline, opline->op1) + 1), ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
+		}
+	} else if (opline->op1_type == IS_UNUSED) {
+		ce = zend_fetch_class(NULL, opline->op1.num);
+	} else {
+		ce = Z_CE_P(EX_VAR(opline->op1.var));
+	}
+	return ce;
+}
+
+static zend_function* ZEND_FASTCALL zend_jit_find_static_method_helper(zend_execute_data *execute_data, zend_class_entry *ce)
+{
+	const zend_op *opline = EX(opline);
+	zend_function *fbc;
+
+	ZEND_ASSERT(opline->op2_type == IS_CONST);
+
+	if (opline->op1_type == IS_CONST &&
+	    EXPECTED((fbc = CACHED_PTR(opline->result.num + sizeof(void*))) != NULL)) {
+		/* nothing to do */
+	} else if (opline->op1_type != IS_CONST &&
+	           EXPECTED(CACHED_PTR(opline->result.num) == ce)) {
+		fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+	} else if (opline->op2_type != IS_UNUSED) {
+		zval *function_name = RT_CONSTANT(opline, opline->op2);
+
+		ZEND_ASSERT(Z_TYPE_P(function_name) == IS_STRING);
+		if (ce->get_static_method) {
+			fbc = ce->get_static_method(ce, Z_STR_P(function_name));
+		} else {
+			fbc = zend_std_get_static_method(ce, Z_STR_P(function_name), RT_CONSTANT(opline, opline->op2) + 1);
+		}
+		if (UNEXPECTED(fbc == NULL)) {
+			if (EXPECTED(!EG(exception))) {
+				zend_undefined_method(ce, Z_STR_P(function_name));
+			}
+			return NULL;
+		}
+		if (EXPECTED(!(fbc->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE))) &&
+			EXPECTED(!(fbc->common.scope->ce_flags & ZEND_ACC_TRAIT))) {
+			CACHE_POLYMORPHIC_PTR(opline->result.num, ce, fbc);
+		}
+		if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+			zend_init_func_run_time_cache(&fbc->op_array);
+		}
+	} else {
+		if (UNEXPECTED(ce->constructor == NULL)) {
+			zend_throw_error(NULL, "Cannot call constructor");
+			return NULL;
+		}
+		if (Z_TYPE(EX(This)) == IS_OBJECT && Z_OBJ(EX(This))->ce != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
+			zend_throw_error(NULL, "Cannot call private %s::__construct()", ZSTR_VAL(ce->name));
+			return NULL;;
+		}
+		fbc = ce->constructor;
+		if (EXPECTED(fbc->type == ZEND_USER_FUNCTION) && UNEXPECTED(!RUN_TIME_CACHE(&fbc->op_array))) {
+			zend_init_func_run_time_cache(&fbc->op_array);
+		}
+	}
+
+	return fbc;
+}
+
+static zend_execute_data* ZEND_FASTCALL zend_jit_push_this_method_call_frame(zend_class_entry *scope, zend_function *fbc, uint32_t num_args)
+{
+	zend_execute_data *execute_data = EG(current_execute_data);
+
+	if (Z_TYPE(EX(This)) != IS_OBJECT || !instanceof_function(Z_OBJCE(EX(This)), scope)) {
+		zend_non_static_method_call(fbc);
+		return NULL;
+	}
+
+	scope = (zend_class_entry*)Z_OBJ(EX(This));
+	return zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION | ZEND_CALL_HAS_THIS, fbc, num_args, scope);
+}
+
+static zend_execute_data* ZEND_FASTCALL zend_jit_push_static_method_call_frame(zend_object *obj, zend_function *fbc, uint32_t num_args)
 {
 	zend_class_entry *scope = obj->ce;
 
 	return zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION, fbc, num_args, scope);
 }
 
-static zend_execute_data* ZEND_FASTCALL zend_jit_push_static_metod_call_frame_tmp(zend_object *obj, zend_function *fbc, uint32_t num_args)
+static zend_execute_data* ZEND_FASTCALL zend_jit_push_static_method_call_frame_tmp(zend_object *obj, zend_function *fbc, uint32_t num_args)
 {
 	zend_class_entry *scope = obj->ce;
 
@@ -2065,22 +2151,6 @@ static zend_always_inline bool check_type_array_assignable(zend_type type) {
 	return (ZEND_TYPE_FULL_MASK(type) & MAY_BE_ARRAY) != 0;
 }
 
-static zend_property_info *zend_object_fetch_property_type_info(
-		zend_object *obj, zval *slot)
-{
-	if (EXPECTED(!ZEND_CLASS_HAS_TYPE_HINTS(obj->ce))) {
-		return NULL;
-	}
-
-	/* Not a declared property */
-	if (UNEXPECTED(slot < obj->properties_table ||
-			slot >= obj->properties_table + obj->ce->default_properties_count)) {
-		return NULL;
-	}
-
-	return zend_get_typed_property_info_for_slot(obj, slot);
-}
-
 static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(zend_property_info *prop, const char *type) {
 	zend_string *type_str = zend_type_to_string(prop->type);
 	zend_type_error(
@@ -2107,10 +2177,7 @@ static zend_never_inline bool zend_handle_fetch_obj_flags(
 		case ZEND_FETCH_DIM_WRITE:
 			if (promotes_to_array(ptr)) {
 				if (!prop_info) {
-					prop_info = zend_object_fetch_property_type_info(obj, ptr);
-					if (!prop_info) {
-						break;
-					}
+					break;
 				}
 				if (!check_type_array_assignable(prop_info->type)) {
 					zend_throw_auto_init_in_prop_error(prop_info, "array");
@@ -2122,10 +2189,7 @@ static zend_never_inline bool zend_handle_fetch_obj_flags(
 		case ZEND_FETCH_REF:
 			if (Z_TYPE_P(ptr) != IS_REFERENCE) {
 				if (!prop_info) {
-					prop_info = zend_object_fetch_property_type_info(obj, ptr);
-					if (!prop_info) {
-						break;
-					}
+					break;
 				}
 				if (Z_TYPE_P(ptr) == IS_UNDEF) {
 					if (!ZEND_TYPE_ALLOW_NULL(prop_info->type)) {
@@ -2154,6 +2218,7 @@ static void ZEND_FASTCALL zend_jit_fetch_obj_w_slow(zend_object *zobj)
 	zend_string *name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
 	zval *result = EX_VAR(opline->result.var);
 	void **cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS);
+	ZEND_ASSERT(cache_slot);
 
 	retval = zobj->handlers->get_property_ptr_ptr(zobj, name, BP_VAR_W, cache_slot);
 	if (NULL == retval) {
@@ -2180,13 +2245,10 @@ static void ZEND_FASTCALL zend_jit_fetch_obj_w_slow(zend_object *zobj)
 		uint32_t flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS;
 
 		if (flags) {
-			zend_property_info *prop_info = NULL;
+			zend_property_info *prop_info = CACHED_PTR_EX(cache_slot + 2);
 
-			if (opline->op2_type == IS_CONST) {
-				prop_info = CACHED_PTR_EX(cache_slot + 2);
-				if (!prop_info) {
-					break;
-				}
+			if (!prop_info) {
+				break;
 			}
 			if (UNEXPECTED(!zend_handle_fetch_obj_flags(result, retval, zobj, prop_info, flags))) {
 				return;
@@ -3236,6 +3298,18 @@ static void ZEND_FASTCALL zend_jit_post_dec_obj_helper(zend_object *zobj, zend_s
 	}
 }
 
+static void ZEND_FASTCALL zend_jit_uninit_static_prop(void)
+{
+	zend_execute_data *execute_data = EG(current_execute_data);
+	const zend_op *opline = EX(opline);
+	uint32_t cache_slot = opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS;
+	const zend_property_info *property_info = CACHED_PTR(cache_slot + sizeof(void *) * 2);
+
+	zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization",
+		ZSTR_VAL(property_info->ce->name),
+		zend_get_unmangled_property_name(property_info->name));
+}
+
 static void ZEND_FASTCALL zend_jit_free_trampoline_helper(zend_function *func)
 {
 	ZEND_ASSERT(func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE);
diff --git a/ext/opcache/jit/zend_jit_internal.h b/ext/opcache/jit/zend_jit_internal.h
index 2007f28e91fd2..9a09be49f1bd5 100644
--- a/ext/opcache/jit/zend_jit_internal.h
+++ b/ext/opcache/jit/zend_jit_internal.h
@@ -123,6 +123,7 @@ static zend_always_inline bool zend_jit_same_addr(zend_jit_addr addr1, zend_jit_
 
 typedef struct _zend_jit_op_array_extension {
 	zend_func_info func_info;
+	const zend_op_array *op_array;
 	const void *orig_handler;
 } zend_jit_op_array_extension;
 
@@ -160,6 +161,7 @@ void ZEND_FASTCALL zend_jit_hot_func(zend_execute_data *execute_data, const zend
 
 typedef struct _zend_jit_op_array_hot_extension {
 	zend_func_info func_info;
+	const zend_op_array *op_array;
 	int16_t    *counter;
 	const void *orig_handlers[1];
 } zend_jit_op_array_hot_extension;
@@ -231,6 +233,7 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_loop_counter_helper(ZEND_OPCODE_H
 void ZEND_FASTCALL zend_jit_copy_extra_args_helper(EXECUTE_DATA_D);
 bool ZEND_FASTCALL zend_jit_deprecated_helper(OPLINE_D);
 void ZEND_FASTCALL zend_jit_undefined_long_key(EXECUTE_DATA_D);
+void ZEND_FASTCALL zend_jit_undefined_long_key_ex(zend_long key EXECUTE_DATA_DC);
 void ZEND_FASTCALL zend_jit_undefined_string_key(EXECUTE_DATA_D);
 
 zend_constant* ZEND_FASTCALL zend_jit_get_constant(const zval *key, uint32_t flags);
@@ -245,8 +248,11 @@ zend_constant* ZEND_FASTCALL zend_jit_check_constant(const zval *key);
 	_(RECURSIVE_CALL,    "recursive call") \
 	_(RECURSIVE_RET,     "recursive return") \
 	_(RETURN,            "return") \
-	_(INTERPRETER,       "exit to VM interpreter") \
 	_(LINK,              "link to another trace") \
+	_(INTERPRETER,       "exit to VM interpreter") \
+	_(TRAMPOLINE,        "trampoline call") \
+	_(PROP_HOOK_CALL,    "property hook call") \
+	_(BAD_FUNC,          "bad function call") \
 	/* compilation and linking successful */ \
 	_(COMPILED,          "compiled") \
 	_(ALREADY_DONE,      "already prcessed") \
@@ -264,9 +270,6 @@ zend_constant* ZEND_FASTCALL zend_jit_check_constant(const zval *key);
 	_(BLACK_LIST,        "trace blacklisted") \
 	_(INNER_LOOP,        "inner loop")                     /* trace it */ \
 	_(COMPILED_LOOP,     "compiled loop") \
-	_(TRAMPOLINE,        "trampoline call") \
-	_(PROP_HOOK_CALL,    "property hook call") \
-	_(BAD_FUNC,          "bad function call") \
 	_(COMPILER_ERROR,    "JIT compilation error") \
 	/* no recoverable error (blacklist immediately) */ \
 	_(NO_SHM,            "insufficient shared memory") \
@@ -377,6 +380,12 @@ typedef enum _zend_jit_trace_op {
 #define ZEND_JIT_TRACE_FAKE_INFO(level) \
 	(((level) << ZEND_JIT_TRACE_FAKE_LEVEL_SHIFT) | ZEND_JIT_TRACE_FAKE_INIT_CALL)
 
+#define ZEND_JIT_TRACE_NUM_ARGS_INFO(count) \
+	((count) << ZEND_JIT_TRACE_FAKE_LEVEL_SHIFT)
+
+#define ZEND_JIT_TRACE_NUM_ARGS(info) \
+	(((info) & ZEND_JIT_TRACE_FAKE_LEVEL_MASK) >> ZEND_JIT_TRACE_FAKE_LEVEL_SHIFT)
+
 #define ZEND_JIT_TRACE_SET_FIRST_SSA_VAR(_info, var) do { \
 		_info |= (var << ZEND_JIT_TRACE_SSA_VAR_SHIFT); \
 	} while (0)
@@ -646,7 +655,12 @@ ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_ret_trace_helper(ZEND_OPCODE_HAND
 ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_jit_loop_trace_helper(ZEND_OPCODE_HANDLER_ARGS);
 
 int ZEND_FASTCALL zend_jit_trace_hot_root(zend_execute_data *execute_data, const zend_op *opline);
-zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *execute_data, const zend_op *opline, zend_jit_trace_rec *trace_buffer, uint8_t start, uint32_t is_megamorphc);
+zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data  *execute_data,
+                                                         const zend_op      *opline,
+                                                         zend_jit_trace_rec *trace_buffer,
+                                                         uint8_t             start,
+                                                         uint32_t            is_megamorphc,
+                                                         int                 ret_depth);
 
 static zend_always_inline const zend_op* zend_jit_trace_get_exit_opline(zend_jit_trace_rec *trace, const zend_op *opline, bool *exit_if_true)
 {
diff --git a/ext/opcache/jit/zend_jit_ir.c b/ext/opcache/jit/zend_jit_ir.c
index b24b61748456e..b50dfc2bc058e 100644
--- a/ext/opcache/jit/zend_jit_ir.c
+++ b/ext/opcache/jit/zend_jit_ir.c
@@ -1298,6 +1298,14 @@ static bool zend_jit_spilling_may_cause_conflict(zend_jit_ctx *jit, int var, ir_
 		 && EX_VAR_TO_NUM(jit->ctx.ir_base[jit->ctx.ir_base[jit->ctx.ir_base[val].op2].op2].val.addr) < jit->current_op_array->last_var) {
 			/* binding between different CVs may cause spill conflict */
 			return 1;
+		} else if (jit->ssa->vars[var].definition >= 0
+		 && jit->ssa->ops[jit->ssa->vars[var].definition].op1_def == var
+		 && jit->ssa->ops[jit->ssa->vars[var].definition].op1_use >= 0
+		 && jit->ssa->vars[jit->ssa->ops[jit->ssa->vars[var].definition].op1_use].no_val
+		 && jit->ssa->vars[jit->ssa->ops[jit->ssa->vars[var].definition].op1_use].definition_phi
+		 && (jit->ssa->cfg.blocks[jit->ssa->vars[jit->ssa->ops[jit->ssa->vars[var].definition].op1_use].definition_phi->block].flags & ZEND_BB_LOOP_HEADER)) {
+			/* Avoid moving spill store out of loop */
+			return 1;
 		}
 		return 0;
 	}
@@ -3010,12 +3018,16 @@ static void zend_jit_setup_disasm(void)
 	REGISTER_HELPER(zend_jit_invalid_method_call_tmp);
 	REGISTER_HELPER(zend_jit_find_method_helper);
 	REGISTER_HELPER(zend_jit_find_method_tmp_helper);
-	REGISTER_HELPER(zend_jit_push_static_metod_call_frame);
-	REGISTER_HELPER(zend_jit_push_static_metod_call_frame_tmp);
+	REGISTER_HELPER(zend_jit_push_static_method_call_frame);
+	REGISTER_HELPER(zend_jit_push_static_method_call_frame_tmp);
+	REGISTER_HELPER(zend_jit_find_class_helper);
+	REGISTER_HELPER(zend_jit_find_static_method_helper);
+	REGISTER_HELPER(zend_jit_push_this_method_call_frame);
 	REGISTER_HELPER(zend_jit_free_trampoline_helper);
 	REGISTER_HELPER(zend_jit_verify_return_slow);
 	REGISTER_HELPER(zend_jit_deprecated_helper);
 	REGISTER_HELPER(zend_jit_undefined_long_key);
+	REGISTER_HELPER(zend_jit_undefined_long_key_ex);
 	REGISTER_HELPER(zend_jit_undefined_string_key);
 	REGISTER_HELPER(zend_jit_copy_extra_args_helper);
 	REGISTER_HELPER(zend_jit_vm_stack_free_args_helper);
@@ -3084,6 +3096,7 @@ static void zend_jit_setup_disasm(void)
 	REGISTER_HELPER(zend_jit_post_inc_obj_helper);
 	REGISTER_HELPER(zend_jit_pre_dec_obj_helper);
 	REGISTER_HELPER(zend_jit_post_dec_obj_helper);
+	REGISTER_HELPER(zend_jit_uninit_static_prop);
 	REGISTER_HELPER(zend_jit_rope_end);
 	REGISTER_HELPER(zend_fcall_interrupt);
 
@@ -4544,7 +4557,7 @@ static struct jit_observer_fcall_is_unobserved_data jit_observer_fcall_is_unobse
 	if (func && (func->common.fn_flags & ZEND_ACC_CLOSURE) == 0 && ZEND_MAP_PTR_IS_OFFSET(func->common.run_time_cache)) {
 		// JIT: ZEND_MAP_PTR_GET_IMM(func->common.runtime_cache)
 		run_time_cache = ir_LOAD_A(ir_ADD_OFFSET(ir_LOAD_A(jit_CG(map_ptr_base)), (uintptr_t)ZEND_MAP_PTR(func->common.run_time_cache)));
-#if !ZTS
+#ifndef ZTS
 	} else if (func && rx == IS_UNUSED) { // happens for internal functions only
 		ZEND_ASSERT(!ZEND_USER_CODE(func->type));
 		run_time_cache = ir_LOAD_A(ir_ADD_OFFSET(ir_CONST_ADDR(func), offsetof(zend_op_array, run_time_cache__ptr)));
@@ -8418,13 +8431,21 @@ static int zend_jit_push_call_frame(zend_jit_ctx *jit, const zend_op *opline, co
 			used_stack_ref);
 
 		if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
-			int32_t exit_point = zend_jit_trace_get_exit_point(opline, ZEND_JIT_EXIT_TO_VM);
+			bool may_be_trampoline = !func && (opline->opcode == ZEND_INIT_METHOD_CALL);
+			int32_t exit_point = zend_jit_trace_get_exit_point(opline,
+				may_be_trampoline ?
+					(ZEND_JIT_EXIT_TO_VM | ZEND_JIT_EXIT_METHOD_CALL) : ZEND_JIT_EXIT_TO_VM);
 			const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
 
 			if (!exit_addr) {
 				return 0;
 			}
 
+			if (may_be_trampoline) {
+				jit->trace->exit_info[exit_point].poly_func_ref = func_ref;
+				jit->trace->exit_info[exit_point].poly_this_ref = this_ref;
+			}
+
 			ir_GUARD(ref, ir_CONST_ADDR(exit_addr));
 		} else {
 			if_enough_stack = ir_IF(ref);
@@ -8532,6 +8553,9 @@ static int zend_jit_push_call_frame(zend_jit_ctx *jit, const zend_op *opline, co
 						ir_CONST_U32(ZEND_CALL_HAS_THIS | ZEND_CALL_RELEASE_THIS)));
 			}
 	    }
+	} else if (opline->opcode == ZEND_INIT_STATIC_METHOD_CALL) {
+		// JIT: Z_CE(call->This) = called_scope;
+		ir_STORE(jit_CALL(rx, This), this_ref);
 	} else if (!is_closure) {
 		// JIT: Z_CE(call->This) = called_scope;
 		ir_STORE(jit_CALL(rx, This), IR_NULL);
@@ -8785,6 +8809,14 @@ jit_SET_EX_OPLINE(jit, opline);
 		delayed_call_chain = 1;
 	}
 
+	if (trace
+	 && trace->op == ZEND_JIT_TRACE_END
+	 && trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER) {
+		if (!zend_jit_set_ip(jit, opline + 1)) {
+			return 0;
+		}
+	}
+
 	return 1;
 }
 
@@ -9005,12 +9037,12 @@ static int zend_jit_init_method_call(zend_jit_ctx         *jit,
 		ir_ref ret;
 
 		if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) && !delayed_fetch_this) {
-			ret = ir_CALL_3(IR_ADDR, ir_CONST_FC_FUNC(zend_jit_push_static_metod_call_frame_tmp),
+			ret = ir_CALL_3(IR_ADDR, ir_CONST_FC_FUNC(zend_jit_push_static_method_call_frame_tmp),
 					this_ref,
 					func_ref,
 					ir_CONST_U32(opline->extended_value));
 		} else {
-			ret = ir_CALL_3(IR_ADDR, ir_CONST_FC_FUNC(zend_jit_push_static_metod_call_frame),
+			ret = ir_CALL_3(IR_ADDR, ir_CONST_FC_FUNC(zend_jit_push_static_method_call_frame),
 					this_ref,
 					func_ref,
 					ir_CONST_U32(opline->extended_value));
@@ -9048,6 +9080,196 @@ static int zend_jit_init_method_call(zend_jit_ctx         *jit,
 		jit->delayed_call_level = call_level;
 	}
 
+	if (trace
+	 && trace->op == ZEND_JIT_TRACE_END
+	 && trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER) {
+		if (!zend_jit_set_ip(jit, opline + 1)) {
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+static int zend_jit_init_static_method_call(zend_jit_ctx         *jit,
+                                            const zend_op        *opline,
+                                            uint32_t              b,
+                                            const zend_op_array  *op_array,
+                                            zend_ssa             *ssa,
+                                            const zend_ssa_op    *ssa_op,
+                                            int                   call_level,
+                                            zend_jit_trace_rec   *trace,
+                                            int                   checked_stack)
+{
+	zend_func_info *info = ZEND_FUNC_INFO(op_array);
+	zend_call_info *call_info = NULL;
+	zend_class_entry *ce;
+	zend_function *func = NULL;
+	ir_ref func_ref, func_ref2, scope_ref, scope_ref2, if_cached, cold_path, ref;
+	ir_ref if_static = IR_UNUSED;
+
+	if (info) {
+		call_info = info->callee_info;
+		while (call_info && call_info->caller_init_opline != opline) {
+			call_info = call_info->next_callee;
+		}
+		if (call_info && call_info->callee_func && !call_info->is_prototype) {
+			func = call_info->callee_func;
+		}
+	}
+
+	ce = zend_get_known_class(op_array, opline, opline->op1_type, opline->op1);
+	if (!func && ce) {
+		zval *zv = RT_CONSTANT(opline, opline->op2);
+		zend_string *method_name;
+
+		ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING);
+		method_name = Z_STR_P(zv);
+		zv = zend_hash_find(&ce->function_table, method_name);
+		if (zv) {
+			zend_function *fn = Z_PTR_P(zv);
+
+			if (fn->common.scope == op_array->scope
+			 || (fn->common.fn_flags & ZEND_ACC_PUBLIC)
+			 || ((fn->common.fn_flags & ZEND_ACC_PROTECTED)
+			  && op_array->scope
+			  && instanceof_function_slow(op_array->scope, fn->common.scope))) {
+				func = fn;
+			}
+		}
+	}
+
+	if (jit->delayed_call_level) {
+		if (!zend_jit_save_call_chain(jit, jit->delayed_call_level)) {
+			return 0;
+		}
+	}
+
+	// JIT: fbc = CACHED_PTR(opline->result.num + sizeof(void*));
+	func_ref = ir_LOAD_A(ir_ADD_OFFSET(ir_LOAD_A(jit_EX(run_time_cache)), opline->result.num + sizeof(void*)));
+
+	// JIT: if (fbc)
+	if_cached = ir_IF(func_ref);
+	ir_IF_FALSE_cold(if_cached);
+
+	jit_SET_EX_OPLINE(jit, opline);
+	scope_ref2 = ir_CALL_1(IR_ADDR, ir_CONST_FC_FUNC(zend_jit_find_class_helper), jit_FP(jit));
+	ir_GUARD(scope_ref2, jit_STUB_ADDR(jit, jit_stub_exception_handler));
+
+	func_ref2 = ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(zend_jit_find_static_method_helper), jit_FP(jit), scope_ref2);
+	ir_GUARD(func_ref2, jit_STUB_ADDR(jit, jit_stub_exception_handler));
+
+	cold_path = ir_END();
+
+	ir_IF_TRUE(if_cached);
+	if (ce && (ce->ce_flags & ZEND_ACC_IMMUTABLE) && (ce->ce_flags & ZEND_ACC_LINKED)) {
+		scope_ref = ir_CONST_ADDR(ce);
+	} else {
+		scope_ref = ir_LOAD_A(ir_ADD_OFFSET(ir_LOAD_A(jit_EX(run_time_cache)), opline->result.num));
+	}
+
+	ir_MERGE_2(cold_path, ir_END());
+	func_ref = ir_PHI_2(IR_ADDR, func_ref2, func_ref);
+	scope_ref = ir_PHI_2(IR_ADDR, scope_ref2, scope_ref);
+
+	if ((!func || zend_jit_may_be_modified(func, op_array))
+	 && trace
+	 && trace->op == ZEND_JIT_TRACE_INIT_CALL
+	 && trace->func
+#ifdef _WIN32
+	 && trace->func->type != ZEND_INTERNAL_FUNCTION
+#endif
+	) {
+		int32_t exit_point;
+		const void *exit_addr;
+
+		exit_point = zend_jit_trace_get_exit_point(opline, func ? ZEND_JIT_EXIT_INVALIDATE : 0);
+		exit_addr = zend_jit_trace_get_exit_addr(exit_point);
+		if (!exit_addr) {
+			return 0;
+		}
+
+//		jit->trace->exit_info[exit_point].poly_func_ref = func_ref;
+//		jit->trace->exit_info[exit_point].poly_this_ref = scope_ref;
+
+		func = (zend_function*)trace->func;
+
+		if (func->type == ZEND_USER_FUNCTION &&
+		    (!(func->common.fn_flags & ZEND_ACC_IMMUTABLE) ||
+		     (func->common.fn_flags & ZEND_ACC_CLOSURE) ||
+		     !func->common.function_name)) {
+			const zend_op *opcodes = func->op_array.opcodes;
+
+			ir_GUARD(
+				ir_EQ(
+					ir_LOAD_A(ir_ADD_OFFSET(func_ref, offsetof(zend_op_array, opcodes))),
+					ir_CONST_ADDR(opcodes)),
+				ir_CONST_ADDR(exit_addr));
+		} else {
+			ir_GUARD(ir_EQ(func_ref, ir_CONST_ADDR(func)), ir_CONST_ADDR(exit_addr));
+		}
+	}
+
+	if (!func || !(func->common.fn_flags & ZEND_ACC_STATIC)) {
+		if (!func) {
+			// JIT: if (fbc->common.fn_flags & ZEND_ACC_STATIC) {
+			if_static = ir_IF(ir_AND_U32(
+				ir_LOAD_U32(ir_ADD_OFFSET(func_ref, offsetof(zend_function, common.fn_flags))),
+				ir_CONST_U32(ZEND_ACC_STATIC)));
+			ir_IF_FALSE_cold(if_static);
+		}
+
+		ref = ir_CALL_3(IR_ADDR, ir_CONST_FC_FUNC(zend_jit_push_this_method_call_frame),
+				scope_ref,
+				func_ref,
+				ir_CONST_U32(opline->extended_value));
+		ir_GUARD(ref, jit_STUB_ADDR(jit, jit_stub_exception_handler));
+		jit_STORE_IP(jit, ref);
+
+		if (!func) {
+			cold_path = ir_END();
+			ir_IF_TRUE(if_static);
+		}
+	}
+
+	if (!func || (func->common.fn_flags & ZEND_ACC_STATIC)) {
+		if (opline->op1_type == IS_UNUSED
+		 && ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT ||
+		     (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF)) {
+			if (op_array->fn_flags & ZEND_ACC_STATIC) {
+				scope_ref = ir_LOAD_A(jit_EX(This.value.ref));
+			} else {
+				scope_ref = ir_LOAD_A(ir_ADD_OFFSET(ir_LOAD_A(jit_EX(This.value.ref)), offsetof(zend_object, ce)));
+			}
+		}
+		if (!zend_jit_push_call_frame(jit, opline, op_array, func, 0, 0, checked_stack, func_ref, scope_ref)) {
+			return 0;
+		}
+
+		if (!func) {
+			ir_MERGE_2(cold_path, ir_END());
+		}
+	}
+
+	zend_jit_start_reuse_ip(jit);
+	if (zend_jit_needs_call_chain(call_info, b, op_array, ssa, ssa_op, opline, call_level, trace)) {
+		if (!zend_jit_save_call_chain(jit, call_level)) {
+			return 0;
+		}
+	} else {
+		ZEND_ASSERT(call_level > 0);
+		jit->delayed_call_level = call_level;
+		delayed_call_chain = 1;
+	}
+
+	if (trace
+	 && trace->op == ZEND_JIT_TRACE_END
+	 && trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER) {
+		if (!zend_jit_set_ip(jit, opline + 1)) {
+			return 0;
+		}
+	}
+
 	return 1;
 }
 
@@ -9134,7 +9356,7 @@ static int zend_jit_init_closure_call(zend_jit_ctx         *jit,
 
 	if (trace
 	 && trace->op == ZEND_JIT_TRACE_END
-	 && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) {
+	 && trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER) {
 		if (!zend_jit_set_ip(jit, opline + 1)) {
 			return 0;
 		}
@@ -9743,7 +9965,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
 
 	if (trace && !func) {
 		if (trace->op == ZEND_JIT_TRACE_DO_ICALL) {
-			ZEND_ASSERT(trace->func->type == ZEND_INTERNAL_FUNCTION);
+			ZEND_ASSERT(!trace->func || trace->func->type == ZEND_INTERNAL_FUNCTION);
 #ifndef ZEND_WIN32
 			// TODO: ASLR may cause different addresses in different workers ???
 			func = trace->func;
@@ -9925,7 +10147,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
 
 			if (call_num_args <= func->op_array.num_args) {
 				if (!trace || (trace->op == ZEND_JIT_TRACE_END
-				 && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER)) {
+				 && trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER)) {
 					uint32_t num_args;
 
 					if ((func->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0) {
@@ -9959,7 +10181,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
 				}
 			} else {
 				if (!trace || (trace->op == ZEND_JIT_TRACE_END
-				 && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER)) {
+				 && trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER)) {
 					ir_ref ip;
 
 					if (zend_accel_in_shm(func->op_array.opcodes)) {
@@ -10085,7 +10307,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
 			ir_ref observer_handler;
 			ir_ref rx = jit_FP(jit);
 			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)) {
+			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);
 			} else if (GCC_GLOBAL_REGS) {
@@ -10093,6 +10315,20 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
 				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);
+
 			jit_observer_fcall_is_unobserved_end(jit, &unobserved_data);
 		}
 
@@ -10364,7 +10600,7 @@ static int zend_jit_do_fcall(zend_jit_ctx *jit, const zend_op *opline, const zen
 			jit_LOAD_IP_ADDR(jit, opline + 1);
 		} else if (trace
 		 && trace->op == ZEND_JIT_TRACE_END
-		 && trace->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) {
+		 && trace->stop >= ZEND_JIT_TRACE_STOP_INTERPRETER) {
 			jit_LOAD_IP_ADDR(jit, opline + 1);
 		}
 	}
@@ -11708,6 +11944,7 @@ static int zend_jit_fetch_dimension_address_inner(zend_jit_ctx  *jit,
 					if (!op2_loaded) {
 						// JIT: hval = Z_LVAL_P(dim);
 						h = jit_Z_LVAL(jit, op2_addr);
+						op2_loaded = 1;
 					}
 					if (packed_loaded) {
 						ref = ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(_zend_hash_index_find), ht_ref, h);
@@ -11757,6 +11994,7 @@ static int zend_jit_fetch_dimension_address_inner(zend_jit_ctx  *jit,
 					if (!op2_loaded) {
 						// JIT: hval = Z_LVAL_P(dim);
 						h = jit_Z_LVAL(jit, op2_addr);
+						op2_loaded = 1;
 					}
 					if (packed_loaded) {
 						ref = ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(_zend_hash_index_find), ht_ref, h);
@@ -11800,7 +12038,19 @@ static int zend_jit_fetch_dimension_address_inner(zend_jit_ctx  *jit,
 							// JIT: zend_error(E_WARNING,"Undefined array key " ZEND_LONG_FMT, hval);
 							// JIT: retval = &EG(uninitialized_zval);
 							jit_SET_EX_OPLINE(jit, opline);
-							ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_undefined_offset, IR_FASTCALL_FUNC));
+							if (Z_MODE(op2_addr) == IS_REG) {
+								if (!op2_loaded) {
+									// JIT: hval = Z_LVAL_P(dim);
+									h = jit_Z_LVAL(jit, op2_addr);
+								}
+								if (GCC_GLOBAL_REGS) {
+									ir_CALL_1(IR_VOID, ir_CONST_FC_FUNC(zend_jit_undefined_long_key_ex), h);
+								} else {
+									ir_CALL_2(IR_VOID, ir_CONST_FC_FUNC(zend_jit_undefined_long_key_ex), h, jit_FP(jit));
+								}
+							} else {
+								ir_CALL(IR_VOID, jit_STUB_FUNC_ADDR(jit, jit_stub_undefined_offset, IR_FASTCALL_FUNC));
+							}
 							ir_END_list(*end_inputs);
 							break;
 						case BP_VAR_IS:
@@ -12962,6 +13212,7 @@ static int zend_jit_assign_dim(zend_jit_ctx  *jit,
                                const zend_op *opline,
                                uint32_t       op1_info,
                                zend_jit_addr  op1_addr,
+                               bool           op1_indirect,
                                uint32_t       op2_info,
                                zend_jit_addr  op2_addr,
                                zend_ssa_range *op2_range,
@@ -13054,8 +13305,8 @@ static int zend_jit_assign_dim(zend_jit_ctx  *jit,
 				// JIT: value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE);
 				if (opline->op1_type == IS_VAR
 				 && Z_MODE(op3_addr) != IS_REG
+				 && opline->result_type == IS_UNUSED
 				 && (res_addr == 0 || Z_MODE(res_addr) != IS_REG)) {
-					ZEND_ASSERT(opline->result_type == IS_UNUSED);
 					if (!zend_jit_assign_to_variable_call(jit, opline, var_addr, var_addr, var_info, -1, (opline+1)->op1_type, op3_addr, val_info, res_addr, 0)) {
 						return 0;
 					}
@@ -13122,6 +13373,10 @@ static int zend_jit_assign_dim(zend_jit_ctx  *jit,
 	ir_MERGE_list(end_inputs);
 	jit_FREE_OP(jit, opline->op2_type, opline->op2, op2_info, opline);
 
+	if (!op1_indirect) {
+		jit_FREE_OP(jit, opline->op1_type, opline->op1, op1_info, opline);
+	}
+
 	if (may_throw) {
 		zend_jit_check_exception(jit);
 	}
@@ -13134,6 +13389,7 @@ static int zend_jit_assign_dim_op(zend_jit_ctx   *jit,
                                   uint32_t        op1_info,
                                   uint32_t        op1_def_info,
                                   zend_jit_addr   op1_addr,
+                                  bool            op1_indirect,
                                   uint32_t        op2_info,
                                   zend_jit_addr   op2_addr,
                                   zend_ssa_range *op2_range,
@@ -13332,6 +13588,9 @@ static int zend_jit_assign_dim_op(zend_jit_ctx   *jit,
 
 	jit_FREE_OP(jit, (opline+1)->op1_type, (opline+1)->op1, op1_data_info, NULL);
 	jit_FREE_OP(jit, opline->op2_type, opline->op2, op2_info, NULL);
+	if (!op1_indirect) {
+		jit_FREE_OP(jit, opline->op1_type, opline->op1, op1_info, NULL);
+	}
 	if (may_throw) {
 		zend_jit_check_exception(jit);
 	}
@@ -13732,7 +13991,9 @@ static int zend_jit_load_this(zend_jit_ctx *jit, uint32_t var)
 
 static int zend_jit_fetch_this(zend_jit_ctx *jit, const zend_op *opline, const zend_op_array *op_array, bool check_only)
 {
-	if (!op_array->scope || (op_array->fn_flags & ZEND_ACC_STATIC)) {
+	if (!op_array->scope ||
+			(op_array->fn_flags & ZEND_ACC_STATIC) ||
+			((op_array->fn_flags & (ZEND_ACC_CLOSURE|ZEND_ACC_IMMUTABLE)) == ZEND_ACC_CLOSURE)) {
 		if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE) {
 			if (!JIT_G(current_frame) ||
 			    !TRACE_FRAME_IS_THIS_CHECKED(JIT_G(current_frame))) {
@@ -15570,6 +15831,157 @@ static int zend_jit_incdec_obj(zend_jit_ctx         *jit,
 	return 1;
 }
 
+static int zend_jit_fetch_static_prop(zend_jit_ctx *jit, const zend_op *opline, const zend_op_array *op_array)
+{
+	zend_jit_addr res_addr = RES_ADDR();
+	uint32_t cache_slot = opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS;
+	uint32_t flags;
+	ir_ref ref, ref2, if_cached, fast_path, cold_path, prop_info_ref, if_typed, if_def;
+	int fetch_type;
+	zend_property_info *known_prop_info = NULL;
+	zend_class_entry *ce;
+
+	ce = zend_get_known_class(op_array, opline, opline->op2_type, opline->op2);
+	if (ce) {
+		zval *zv = RT_CONSTANT(opline, opline->op1);
+		zend_string *prop_name;
+
+		ZEND_ASSERT(Z_TYPE_P(zv) == IS_STRING);
+		prop_name = Z_STR_P(zv);
+		zv = zend_hash_find(&ce->properties_info, prop_name);
+		if (zv) {
+			zend_property_info *prop_info = Z_PTR_P(zv);
+
+			if (prop_info->flags & ZEND_ACC_STATIC) {
+				if (prop_info->ce == op_array->scope
+				 || (prop_info->flags & ZEND_ACC_PUBLIC)
+				 || ((prop_info->flags & ZEND_ACC_PROTECTED)
+				  && op_array->scope
+				  && instanceof_function_slow(op_array->scope, prop_info->ce))) {
+					known_prop_info = prop_info;
+				}
+			}
+		}
+	}
+
+	switch (opline->opcode) {
+		case ZEND_FETCH_STATIC_PROP_R:
+		case ZEND_FETCH_STATIC_PROP_FUNC_ARG:
+			fetch_type = BP_VAR_R;
+			break;
+		case ZEND_FETCH_STATIC_PROP_IS:
+			fetch_type = BP_VAR_IS;
+			break;
+		case ZEND_FETCH_STATIC_PROP_W:
+			fetch_type = BP_VAR_W;
+			break;
+		case ZEND_FETCH_STATIC_PROP_RW:
+			fetch_type = BP_VAR_RW;
+			break;
+		case ZEND_FETCH_STATIC_PROP_UNSET:
+			fetch_type = BP_VAR_UNSET;
+			break;
+		EMPTY_SWITCH_DEFAULT_CASE();
+	}
+
+	// JIT: result = CACHED_PTR(cache_slot + sizeof(void *));
+	ref = ir_LOAD_A(
+		ir_ADD_OFFSET(ir_LOAD_A(jit_EX(run_time_cache)), cache_slot + sizeof(void*)));
+
+	// JIT: if (result)
+	if_cached = ir_IF(ref);
+	ir_IF_TRUE(if_cached);
+
+	if (fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) {
+		if (!known_prop_info || ZEND_TYPE_IS_SET(known_prop_info->type)) {
+			ir_ref merge = IR_UNUSED;
+
+			// JIT: if (UNEXPECTED(Z_TYPE_P(result) == IS_UNDEF)
+			if_typed = IR_UNUSED;
+			if_def = ir_IF(jit_Z_TYPE_ref(jit, ref));
+			ir_IF_FALSE_cold(if_def);
+			if (!known_prop_info) {
+				// JIT: if (ZEND_TYPE_IS_SET(property_info->type))
+				prop_info_ref = ir_LOAD_L(
+					ir_ADD_OFFSET(ir_LOAD_A(jit_EX(run_time_cache)), cache_slot + sizeof(void*) * 2));
+				if_typed = ir_IF(ir_AND_U32(
+					ir_LOAD_U32(ir_ADD_OFFSET(prop_info_ref, offsetof(zend_property_info, type.type_mask))),
+					ir_CONST_U32(_ZEND_TYPE_MASK)));
+				ir_IF_FALSE(if_typed);
+				ir_END_list(merge);
+				ir_IF_TRUE(if_typed);
+			}
+			// JIT:	zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization",
+			//			ZSTR_VAL(property_info->ce->name),
+			//			zend_get_unmangled_property_name(property_info->name));
+			jit_SET_EX_OPLINE(jit, opline);
+			ir_CALL(IR_VOID, ir_CONST_FC_FUNC(zend_jit_uninit_static_prop));
+			ir_IJMP(jit_STUB_ADDR(jit, jit_stub_exception_handler_undef));
+
+			ir_IF_TRUE(if_def);
+			if (!known_prop_info) {
+				ir_END_list(merge);
+				ir_MERGE_list(merge);
+			}
+		}
+	} else if (fetch_type == BP_VAR_W) {
+		flags = opline->extended_value & ZEND_FETCH_OBJ_FLAGS;
+		if (flags && (!known_prop_info || ZEND_TYPE_IS_SET(known_prop_info->type))) {
+		    ir_ref merge = IR_UNUSED;
+
+			if (!known_prop_info) {
+				// JIT: if (ZEND_TYPE_IS_SET(property_info->type))
+				prop_info_ref = ir_LOAD_L(
+					ir_ADD_OFFSET(ir_LOAD_A(jit_EX(run_time_cache)), cache_slot + sizeof(void*) * 2));
+				if_typed = ir_IF(ir_AND_U32(
+					ir_LOAD_U32(ir_ADD_OFFSET(prop_info_ref, offsetof(zend_property_info, type.type_mask))),
+					ir_CONST_U32(_ZEND_TYPE_MASK)));
+				ir_IF_FALSE(if_typed);
+				ir_END_list(merge);
+				ir_IF_TRUE(if_typed);
+			} else {
+				prop_info_ref = ir_CONST_ADDR(known_prop_info);
+			}
+
+			// JIT: zend_handle_fetch_obj_flags(NULL, *retval, NULL, property_info, flags);
+			ir_ref if_ok = ir_IF(ir_CALL_5(IR_BOOL, ir_CONST_FUNC(zend_handle_fetch_obj_flags),
+				IR_NULL, ref, IR_NULL, prop_info_ref, ir_CONST_U32(flags)));
+			ir_IF_FALSE_cold(if_ok);
+			ir_IJMP(jit_STUB_ADDR(jit, jit_stub_exception_handler_undef));
+			ir_IF_TRUE(if_ok);
+			if (!known_prop_info) {
+				ir_END_list(merge);
+				ir_MERGE_list(merge);
+			}
+		}
+	}
+
+	fast_path = ir_END();
+
+	ir_IF_FALSE_cold(if_cached);
+	jit_SET_EX_OPLINE(jit, opline);
+	ref2 = ir_CALL_2(IR_ADDR, ir_CONST_FC_FUNC(zend_fetch_static_property), jit_FP(jit), ir_CONST_I32(fetch_type));
+	zend_jit_check_exception_undef_result(jit, opline);
+	cold_path = ir_END();
+
+	ir_MERGE_2(fast_path, cold_path);
+	ref = ir_PHI_2(IR_ADDR, ref, ref2);
+
+	if (fetch_type == BP_VAR_R || fetch_type == BP_VAR_IS) {
+		// JIT: ZVAL_COPY_DEREF(EX_VAR(opline->result.var), result);
+		if (!zend_jit_zval_copy_deref(jit, res_addr, ZEND_ADDR_REF_ZVAL(ref),
+				jit_Z_TYPE_INFO_ref(jit, ref))) {
+			return 0;
+		}
+	} else {
+		// JIT: ZVAL_INDIRECT(EX_VAR(opline->result.var), result);
+		jit_set_Z_PTR(jit, res_addr, ref);
+		jit_set_Z_TYPE_INFO(jit, res_addr, IS_INDIRECT);
+	}
+
+	return 1;
+}
+
 static int zend_jit_switch(zend_jit_ctx *jit, const zend_op *opline, const zend_op_array *op_array, zend_ssa *ssa, zend_jit_trace_rec *trace, zend_jit_trace_info *trace_info)
 {
 	HashTable *jumptable = Z_ARRVAL_P(RT_CONSTANT(opline, opline->op2));
@@ -16528,7 +16940,7 @@ static int zend_jit_trace_handler(zend_jit_ctx *jit, const zend_op_array *op_arr
 			if (zend_jit_vm_kind == ZEND_VM_KIND_HYBRID) {
 				if (trace->op != ZEND_JIT_TRACE_END ||
 				    (trace->stop != ZEND_JIT_TRACE_STOP_RETURN &&
-				     trace->stop != ZEND_JIT_TRACE_STOP_INTERPRETER)) {
+				     trace->stop < ZEND_JIT_TRACE_STOP_INTERPRETER)) {
 					/* this check may be handled by the following OPLINE guard or jmp [IP] */
 					ir_GUARD(ir_NE(jit_IP(jit), ir_CONST_ADDR(zend_jit_halt_op)),
 						jit_STUB_ADDR(jit, jit_stub_trace_halt));
@@ -16546,7 +16958,7 @@ static int zend_jit_trace_handler(zend_jit_ctx *jit, const zend_op_array *op_arr
 		}
 		if (trace->op != ZEND_JIT_TRACE_END ||
 		    (trace->stop != ZEND_JIT_TRACE_STOP_RETURN &&
-		     trace->stop != ZEND_JIT_TRACE_STOP_INTERPRETER)) {
+		     trace->stop < ZEND_JIT_TRACE_STOP_INTERPRETER)) {
 
 			const zend_op *next_opline = trace->opline;
 			const zend_op *exit_opline = NULL;
@@ -17185,7 +17597,10 @@ static void jit_frameless_icall1(zend_jit_ctx *jit, const zend_op *opline, uint3
 	ir_ref op1_ref = jit_ZVAL_ADDR(jit, op1_addr);
 	jit_set_Z_TYPE_INFO(jit, res_addr, IS_NULL);
 	if (opline->op1_type == IS_CV && (op1_info & MAY_BE_UNDEF)) {
-		zend_jit_zval_check_undef(jit, op1_ref, opline->op1.var, opline, 1);
+		op1_ref = zend_jit_zval_check_undef(jit, op1_ref, opline->op1.var, opline, 1);
+		op1_info &= ~MAY_BE_UNDEF;
+		op1_info |= MAY_BE_NULL;
+		op1_addr = ZEND_ADDR_REF_ZVAL(op1_ref);
 	}
 	if (op1_info & MAY_BE_REF) {
 		op1_ref = jit_ZVAL_DEREF_ref(jit, op1_ref);
@@ -17227,10 +17642,16 @@ static void jit_frameless_icall2(zend_jit_ctx *jit, const zend_op *opline, uint3
 	ir_ref op2_ref = jit_ZVAL_ADDR(jit, op2_addr);
 	jit_set_Z_TYPE_INFO(jit, res_addr, IS_NULL);
 	if (opline->op1_type == IS_CV && (op1_info & MAY_BE_UNDEF)) {
-		zend_jit_zval_check_undef(jit, op1_ref, opline->op1.var, opline, 1);
+		op1_ref = zend_jit_zval_check_undef(jit, op1_ref, opline->op1.var, opline, 1);
+		op1_info &= ~MAY_BE_UNDEF;
+		op1_info |= MAY_BE_NULL;
+		op1_addr = ZEND_ADDR_REF_ZVAL(op1_ref);
 	}
 	if (opline->op2_type == IS_CV && (op2_info & MAY_BE_UNDEF)) {
-		zend_jit_zval_check_undef(jit, op2_ref, opline->op2.var, opline, 1);
+		op2_ref = zend_jit_zval_check_undef(jit, op2_ref, opline->op2.var, opline, 1);
+		op2_info &= ~MAY_BE_UNDEF;
+		op2_info |= MAY_BE_NULL;
+		op2_addr = ZEND_ADDR_REF_ZVAL(op2_ref);
 	}
 	if (op1_info & MAY_BE_REF) {
 		op1_ref = jit_ZVAL_DEREF_ref(jit, op1_ref);
@@ -17286,13 +17707,22 @@ static void jit_frameless_icall3(zend_jit_ctx *jit, const zend_op *opline, uint3
 	ir_ref op3_ref = jit_ZVAL_ADDR(jit, op3_addr);
 	jit_set_Z_TYPE_INFO(jit, res_addr, IS_NULL);
 	if (opline->op1_type == IS_CV && (op1_info & MAY_BE_UNDEF)) {
-		zend_jit_zval_check_undef(jit, op1_ref, opline->op1.var, opline, 1);
+		op1_ref = zend_jit_zval_check_undef(jit, op1_ref, opline->op1.var, opline, 1);
+		op1_info &= ~MAY_BE_UNDEF;
+		op1_info |= MAY_BE_NULL;
+		op1_addr = ZEND_ADDR_REF_ZVAL(op1_ref);
 	}
 	if (opline->op2_type == IS_CV && (op2_info & MAY_BE_UNDEF)) {
-		zend_jit_zval_check_undef(jit, op2_ref, opline->op2.var, opline, 1);
+		op2_ref = zend_jit_zval_check_undef(jit, op2_ref, opline->op2.var, opline, 1);
+		op2_info &= ~MAY_BE_UNDEF;
+		op2_info |= MAY_BE_NULL;
+		op2_addr = ZEND_ADDR_REF_ZVAL(op2_ref);
 	}
 	if ((opline+1)->op1_type == IS_CV && (op1_data_info & MAY_BE_UNDEF)) {
-		zend_jit_zval_check_undef(jit, op3_ref, (opline+1)->op1.var, opline, 1);
+		op3_ref = zend_jit_zval_check_undef(jit, op3_ref, (opline+1)->op1.var, opline, 1);
+		op1_data_info &= ~MAY_BE_UNDEF;
+		op1_data_info |= MAY_BE_NULL;
+		op3_addr = ZEND_ADDR_REF_ZVAL(op3_ref);
 	}
 	if (op1_info & MAY_BE_REF) {
 		op1_ref = jit_ZVAL_DEREF_ref(jit, op1_ref);
diff --git a/ext/opcache/jit/zend_jit_trace.c b/ext/opcache/jit/zend_jit_trace.c
index 79c89c80b8212..a3abbc1217900 100644
--- a/ext/opcache/jit/zend_jit_trace.c
+++ b/ext/opcache/jit/zend_jit_trace.c
@@ -427,25 +427,25 @@ static zend_always_inline void zend_jit_trace_add_op_guard(zend_ssa
 #define CHECK_OP1_DATA_TRACE_TYPE() \
 	CHECK_OP_TRACE_TYPE((opline+1)->op1.var, (ssa_op+1)->op1_use, op1_data_info, op3_type)
 
-static zend_always_inline size_t zend_jit_trace_frame_size(const zend_op_array *op_array)
+static zend_always_inline size_t zend_jit_trace_frame_size(const zend_op_array *op_array, uint32_t num_args)
 {
 	if (op_array && op_array->type == ZEND_USER_FUNCTION) {
 		return ZEND_MM_ALIGNED_SIZE(offsetof(zend_jit_trace_stack_frame, stack) + ZEND_MM_ALIGNED_SIZE((op_array->last_var + op_array->T) * sizeof(zend_jit_trace_stack)));
 	} else if (op_array) {
 		return ZEND_MM_ALIGNED_SIZE(offsetof(zend_jit_trace_stack_frame, stack) + ZEND_MM_ALIGNED_SIZE(op_array->num_args * sizeof(zend_jit_trace_stack)));
 	} else {
-		return ZEND_MM_ALIGNED_SIZE(offsetof(zend_jit_trace_stack_frame, stack));
+		return ZEND_MM_ALIGNED_SIZE(offsetof(zend_jit_trace_stack_frame, stack) + ZEND_MM_ALIGNED_SIZE(num_args * sizeof(zend_jit_trace_stack)));
 	}
 }
 
-static zend_jit_trace_stack_frame* zend_jit_trace_call_frame(zend_jit_trace_stack_frame *frame, const zend_op_array *op_array)
+static zend_jit_trace_stack_frame* zend_jit_trace_call_frame(zend_jit_trace_stack_frame *frame, const zend_op_array *op_array, uint32_t num_args)
 {
-	return (zend_jit_trace_stack_frame*)((char*)frame + zend_jit_trace_frame_size(op_array));
+	return (zend_jit_trace_stack_frame*)((char*)frame + zend_jit_trace_frame_size(op_array, num_args));
 }
 
 static zend_jit_trace_stack_frame* zend_jit_trace_ret_frame(zend_jit_trace_stack_frame *frame, const zend_op_array *op_array)
 {
-	return (zend_jit_trace_stack_frame*)((char*)frame - zend_jit_trace_frame_size(op_array));
+	return (zend_jit_trace_stack_frame*)((char*)frame - zend_jit_trace_frame_size(op_array, 0));
 }
 
 static void zend_jit_trace_send_type(const zend_op *opline, zend_jit_trace_stack_frame *call, uint8_t type)
@@ -1297,6 +1297,39 @@ typedef struct _zend_tssa {
 
 static const zend_op _nop_opcode = {0};
 
+static uint32_t find_trampoline_num_args(zend_jit_trace_rec *start, zend_jit_trace_rec *p)
+{
+	int inline_level = 0, call_level = 0;
+
+	p--;
+	while (p != start) {
+		if (p->op == ZEND_JIT_TRACE_INIT_CALL) {
+			if (inline_level == 0) {
+				if (call_level == 0) {
+					ZEND_ASSERT(!p->op_array);
+					return ZEND_JIT_TRACE_NUM_ARGS(p->info);
+				} else {
+					call_level--;
+				}
+			}
+		} else if (p->op == ZEND_JIT_TRACE_DO_ICALL) {
+			if (inline_level == 0) {
+				call_level++;
+			}
+		} else if (p->op == ZEND_JIT_TRACE_ENTER) {
+			if (inline_level) {
+				inline_level--;
+			} else {
+				return 0;
+			}
+		} else if (p->op == ZEND_JIT_TRACE_BACK) {
+			inline_level++;
+		}
+		p--;
+	}
+	return 0;
+}
+
 static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uint32_t parent_trace, uint32_t exit_num, zend_script *script, const zend_op_array **op_arrays, int *num_op_arrays_ptr)
 {
 	zend_ssa *tssa;
@@ -1323,7 +1356,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 	 *    Calculate size of abstract stack;
 	 *    Construct regular SSA for involved op_array */
 	op_array = trace_buffer->op_array;
-	stack_top = stack_size = zend_jit_trace_frame_size(op_array);
+	stack_top = stack_size = zend_jit_trace_frame_size(op_array, 0);
 	stack_bottom = 0;
 	p = trace_buffer + ZEND_JIT_TRACE_START_REC_SIZE;
 	ssa_ops_count = 0;
@@ -1363,20 +1396,26 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 			ssa_ops_count += zend_jit_trace_op_len(p->opline);
 		} else if (p->op == ZEND_JIT_TRACE_INIT_CALL) {
 			call_level++;
-			stack_top += zend_jit_trace_frame_size(p->op_array);
+			stack_top += zend_jit_trace_frame_size(p->op_array, ZEND_JIT_TRACE_NUM_ARGS(p->info));
 			if (stack_top > stack_size) {
 				stack_size = stack_top;
 			}
 		} else if (p->op == ZEND_JIT_TRACE_DO_ICALL) {
+			uint32_t num_args = 0;
 			if (JIT_G(opt_level) < ZEND_JIT_LEVEL_OPT_FUNC) {
-				if (p->func != (zend_function*)&zend_pass_function
+				if (p->func
+				 && p->func != (zend_function*)&zend_pass_function
 				 && (zend_string_equals_literal(p->func->common.function_name, "extract")
 				  || zend_string_equals_literal(p->func->common.function_name, "compact")
 				  || zend_string_equals_literal(p->func->common.function_name, "get_defined_vars"))) {
 					ssa->cfg.flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
 				}
 			}
-			frame_size = zend_jit_trace_frame_size(p->op_array);
+			if (!p->func) {
+				/* Find num_args in the corresponding ZEND_JIT_TRACE_INIT_CALL record */
+				num_args = find_trampoline_num_args(trace_buffer + ZEND_JIT_TRACE_START_REC_SIZE, p);
+			}
+			frame_size = zend_jit_trace_frame_size(p->op_array, num_args);
 			if (call_level == 0) {
 				if (stack_top + frame_size > stack_size) {
 					stack_size = stack_top + frame_size;
@@ -1388,7 +1427,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 		} else if (p->op == ZEND_JIT_TRACE_ENTER) {
 			op_array = p->op_array;
 			if (call_level == 0) {
-				stack_top += zend_jit_trace_frame_size(op_array);
+				stack_top += zend_jit_trace_frame_size(op_array, 0);
 				if (stack_top > stack_size) {
 					stack_size = stack_top;
 				}
@@ -1413,7 +1452,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 			}
 		} else if (p->op == ZEND_JIT_TRACE_BACK) {
 			if (level == 0) {
-				stack_bottom += zend_jit_trace_frame_size(p->op_array);
+				stack_bottom += zend_jit_trace_frame_size(p->op_array, 0);
 				jit_extension =
 					(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(op_array);
 				ssa = &jit_extension->func_info.ssa;
@@ -1430,7 +1469,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 					ssa = zend_jit_trace_build_ssa(op_array, script);
 				}
 			} else {
-				stack_top -= zend_jit_trace_frame_size(op_array);
+				stack_top -= zend_jit_trace_frame_size(op_array, 0);
 				level--;
 			}
 			op_array = p->op_array;
@@ -1533,7 +1572,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 				len--;
 			}
 		} else if (p->op == ZEND_JIT_TRACE_ENTER) {
-			frame = zend_jit_trace_call_frame(frame, op_array);
+			frame = zend_jit_trace_call_frame(frame, op_array, 0);
 			stack = frame->stack;
 			op_array = p->op_array;
 			level++;
@@ -1753,7 +1792,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 	}
 
 	frame = JIT_G(current_frame);
-	top = zend_jit_trace_call_frame(frame, op_array);
+	top = zend_jit_trace_call_frame(frame, op_array, 0);
 	TRACE_FRAME_INIT(frame, op_array, 0, 0);
 	TRACE_FRAME_SET_RETURN_SSA_VAR(frame, -1);
 	frame->used_stack = 0;
@@ -2447,7 +2486,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 				call = top;
 				TRACE_FRAME_INIT(call, op_array, 0, 0);
 				call->used_stack = 0;
-				top = zend_jit_trace_call_frame(top, op_array);
+				top = zend_jit_trace_call_frame(top, op_array, 0);
 			} else {
 				ZEND_ASSERT(&call->func->op_array == op_array);
 			}
@@ -2582,7 +2621,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 			call->prev = frame->call;
 			call->used_stack = 0;
 			frame->call = call;
-			top = zend_jit_trace_call_frame(top, p->op_array);
+			top = zend_jit_trace_call_frame(top, p->op_array, ZEND_JIT_TRACE_NUM_ARGS(p->info));
 			if (p->func && p->func->type == ZEND_USER_FUNCTION) {
 				for (i = 0; i < p->op_array->last_var + p->op_array->T; i++) {
 					SET_STACK_INFO(call->stack, i, -1);
@@ -2601,7 +2640,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 						case ZEND_INIT_NS_FCALL_BY_NAME:
 						case ZEND_INIT_METHOD_CALL:
 						case ZEND_INIT_DYNAMIC_CALL:
-						//case ZEND_INIT_STATIC_METHOD_CALL:
+						case ZEND_INIT_STATIC_METHOD_CALL:
 						//case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL:
 						//case ZEND_INIT_USER_CALL:
 						//case ZEND_NEW:
@@ -2625,6 +2664,7 @@ static zend_ssa *zend_jit_trace_build_tssa(zend_jit_trace_rec *trace_buffer, uin
 
 			if (idx > 0
 			 && ssa_ops[idx-1].result_def >= 0
+			 && p->func
 			 && (p->func->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE)
 			 && !(p->func->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)) {
 				ZEND_ASSERT(ssa_opcodes[idx-1] == opline);
@@ -3155,7 +3195,7 @@ static zend_jit_reg_var* zend_jit_trace_allocate_registers(zend_jit_trace_rec *t
 				}
 			}
 
-			frame = zend_jit_trace_call_frame(frame, op_array);
+			frame = zend_jit_trace_call_frame(frame, op_array, 0);
 			frame->prev = prev_frame;
 			frame->func = (const zend_function*)p->op_array;
 			stack = frame->stack;
@@ -3295,9 +3335,7 @@ static zend_jit_reg_var* zend_jit_trace_allocate_registers(zend_jit_trace_rec *t
 							RA_REG_FLAGS(def) |= ZREG_LOAD;
 						}
 					}
-				} else if (RA_HAS_REG(use)
-						&& (!ssa->vars[def].no_val
-				)) {
+				} else if (RA_HAS_REG(use)) {
 					if (ssa->vars[use].use_chain >= 0) {
 						RA_REG_FLAGS(use) |= ZREG_STORE; // TODO: ext/opcache/tests/jit/reg_alloc_00[67].phpt ???
 					} else {
@@ -3307,8 +3345,7 @@ static zend_jit_reg_var* zend_jit_trace_allocate_registers(zend_jit_trace_rec *t
 				}
 				phi = phi->next;
 			}
-		} else if (p->stop == ZEND_JIT_TRACE_STOP_LINK
-				|| p->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) {
+		} else if (p->stop >= ZEND_JIT_TRACE_STOP_LINK) {
 			for (i = 0; i < op_array->last_var + op_array->T; i++) {
 				int var = STACK_VAR(stack, i);
 				if (var >= 0 && RA_HAS_REG(var)
@@ -4124,7 +4161,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 	ZEND_ASSERT(p->op == ZEND_JIT_TRACE_START);
 	op_array = p->op_array;
 	frame = JIT_G(current_frame);
-	top = zend_jit_trace_call_frame(frame, op_array);
+	top = zend_jit_trace_call_frame(frame, op_array, 0);
 	TRACE_FRAME_INIT(frame, op_array, TRACE_FRAME_MASK_UNKNOWN_RETURN, -1);
 	frame->used_stack = checked_stack = peek_checked_stack = 0;
 	stack = frame->stack;
@@ -4206,7 +4243,6 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 			 && (trace_buffer->stop == ZEND_JIT_TRACE_STOP_LOOP
 			  || trace_buffer->stop == ZEND_JIT_TRACE_STOP_RECURSIVE_CALL
 			  || (trace_buffer->stop == ZEND_JIT_TRACE_STOP_RECURSIVE_RET
-			   && (opline-1)->result_type == IS_VAR
 			   && EX_VAR_TO_NUM((opline-1)->result.var) == i))
 			 && (ssa->vars[i].use_chain != -1
 			  || (ssa->vars[i].phi_use_chain
@@ -4699,15 +4735,15 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 						}
 						op1_info = OP1_INFO();
 						op1_addr = OP1_REG_ADDR();
+						op1_indirect = 0;
 						if (opline->op1_type == IS_VAR) {
 							if (orig_op1_type != IS_UNKNOWN
 							 && (orig_op1_type & IS_TRACE_INDIRECT)) {
+								op1_indirect = 1;
 								if (!zend_jit_fetch_indirect_var(&ctx, opline, orig_op1_type,
 										&op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) {
 									goto jit_failure;
 								}
-							} else {
-								break;
 							}
 						}
 						if (orig_op1_type != IS_UNKNOWN
@@ -4729,7 +4765,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 						CHECK_OP1_DATA_TRACE_TYPE();
 						op1_def_info = OP1_DEF_INFO();
 						if (!zend_jit_assign_dim_op(&ctx, opline,
-								op1_info, op1_def_info, op1_addr,
+								op1_info, op1_def_info, op1_addr, op1_indirect,
 								op2_info, (opline->op2_type != IS_UNUSED) ? OP2_REG_ADDR() : 0,
 								(opline->op2_type != IS_UNUSED) ? OP2_RANGE() : NULL,
 								op1_data_info, OP1_DATA_REG_ADDR(), OP1_DATA_RANGE(), val_type,
@@ -5011,6 +5047,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 					case ZEND_ASSIGN_DIM:
 						op1_info = OP1_INFO();
 						op1_addr = OP1_REG_ADDR();
+						op1_indirect = 0;
 						if (opline->op1_type == IS_CV
 						 && (opline+1)->op1_type == IS_CV
 						 && (opline+1)->op1.var == opline->op1.var) {
@@ -5019,14 +5056,12 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 						}
 						if (opline->op1_type == IS_VAR) {
 							if (orig_op1_type != IS_UNKNOWN
-							 && (orig_op1_type & IS_TRACE_INDIRECT)
-							 && opline->result_type == IS_UNUSED) {
+							 && (orig_op1_type & IS_TRACE_INDIRECT)) {
+								op1_indirect = 1;
 								if (!zend_jit_fetch_indirect_var(&ctx, opline, orig_op1_type,
 										&op1_info, &op1_addr, !ssa->var_info[ssa_op->op1_use].indirect_reference)) {
 									goto jit_failure;
 								}
-							} else {
-								break;
 							}
 						}
 						if (orig_op1_type != IS_UNKNOWN
@@ -5047,7 +5082,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 						op1_data_info = OP1_DATA_INFO();
 						CHECK_OP1_DATA_TRACE_TYPE();
 						if (!zend_jit_assign_dim(&ctx, opline,
-								op1_info, op1_addr,
+								op1_info, op1_addr, op1_indirect,
 								op2_info, (opline->op2_type != IS_UNUSED) ? OP2_REG_ADDR() : 0,
 								(opline->op2_type != IS_UNUSED) ? OP2_RANGE() : NULL,
 								op1_data_info, OP1_DATA_REG_ADDR(),
@@ -6073,6 +6108,29 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 							goto jit_failure;
 						}
 						goto done;
+					case ZEND_FETCH_STATIC_PROP_FUNC_ARG:
+						if (!JIT_G(current_frame)
+						 || !JIT_G(current_frame)->call
+						 || !TRACE_FRAME_IS_LAST_SEND_BY_VAL(JIT_G(current_frame)->call)) {
+							break;
+						}
+						ZEND_FALLTHROUGH;
+					case ZEND_FETCH_STATIC_PROP_R:
+					case ZEND_FETCH_STATIC_PROP_IS:
+					case ZEND_FETCH_STATIC_PROP_W:
+					case ZEND_FETCH_STATIC_PROP_RW:
+					case ZEND_FETCH_STATIC_PROP_UNSET:
+						if (!(opline->op1_type == IS_CONST
+						 && (opline->op2_type == IS_CONST
+						  || (opline->op2_type == IS_UNUSED
+						   && ((opline->op2.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF
+						    || (opline->op2.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT))))) {
+							break;
+						}
+						if (!zend_jit_fetch_static_prop(&ctx, opline, op_array)) {
+							goto jit_failure;
+						}
+						goto done;
 					case ZEND_BIND_GLOBAL:
 						orig_opline = opline;
 						orig_ssa_op = ssa_op;
@@ -6344,6 +6402,21 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 							goto jit_failure;
 						}
 						goto done;
+					case ZEND_INIT_STATIC_METHOD_CALL:
+						if (!(opline->op2_type == IS_CONST
+						 && (opline->op1_type == IS_CONST
+						  || (opline->op1_type == IS_UNUSED
+						   && ((opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_SELF
+						    || (opline->op1.num & ZEND_FETCH_CLASS_MASK) == ZEND_FETCH_CLASS_PARENT))))) {
+							break;
+						}
+						if (!zend_jit_init_static_method_call(&ctx, opline,
+								op_array_ssa->cfg.map ? op_array_ssa->cfg.map[opline - op_array->opcodes] : -1,
+								op_array, ssa, ssa_op, frame->call_level,
+								p + 1, peek_checked_stack - checked_stack)) {
+							goto jit_failure;
+						}
+						goto done;
 					case ZEND_INIT_DYNAMIC_CALL:
 						if (orig_op2_type != IS_OBJECT || op2_ce != zend_ce_closure) {
 							break;
@@ -6971,7 +7044,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 				}
 			}
 			frame->call = call;
-			top = zend_jit_trace_call_frame(top, p->op_array);
+			top = zend_jit_trace_call_frame(top, p->op_array, ZEND_JIT_TRACE_NUM_ARGS(p->info));
 			if (p->func) {
 				if (p->func->type == ZEND_USER_FUNCTION) {
 					if (JIT_G(opt_level) >= ZEND_JIT_LEVEL_INLINE) {
@@ -7157,8 +7230,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 
 			zend_jit_trace_end_loop(&ctx, jit->trace_loop_ref, timeout_exit_addr); /* jump back to start of the trace loop */
 		}
-	} else if (p->stop == ZEND_JIT_TRACE_STOP_LINK
-	        || p->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) {
+	} else if (p->stop >= ZEND_JIT_TRACE_STOP_LINK) {
 		if (ra
 		 && (p-1)->op != ZEND_JIT_TRACE_ENTER
 		 && (p-1)->op != ZEND_JIT_TRACE_BACK
@@ -7268,8 +7340,7 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
 					break;
 				}
 			}
-		} else if (p->stop == ZEND_JIT_TRACE_STOP_LINK
-		        || p->stop == ZEND_JIT_TRACE_STOP_INTERPRETER) {
+		} else if (p->stop >= ZEND_JIT_TRACE_STOP_LINK) {
 			if (opline
 			 && (opline->opcode == ZEND_DO_UCALL
 			  || opline->opcode == ZEND_DO_FCALL
@@ -7659,6 +7730,24 @@ static void zend_jit_blacklist_root_trace(const zend_op *opline, size_t offset)
 	zend_shared_alloc_unlock();
 }
 
+ZEND_EXT_API void zend_jit_blacklist_function(zend_op_array *op_array) {
+	zend_jit_op_array_trace_extension *jit_extension = (zend_jit_op_array_trace_extension *)ZEND_FUNC_INFO(op_array);
+	if (!jit_extension || !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE)) {
+		return;
+	}
+
+	zend_shared_alloc_lock();
+	SHM_UNPROTECT();
+	zend_jit_unprotect();
+
+	zend_jit_stop_persistent_op_array(op_array);
+	jit_extension->func_info.flags &= ~ZEND_FUNC_JIT_ON_HOT_TRACE;
+
+	zend_jit_protect();
+	SHM_PROTECT();
+	zend_shared_alloc_unlock();
+}
+
 static bool zend_jit_trace_is_bad_root(const zend_op *opline, zend_jit_trace_stop stop, size_t offset)
 {
 	const zend_op **cache_opline = JIT_G(bad_root_cache_opline);
@@ -7876,7 +7965,7 @@ static void zend_jit_dump_trace(zend_jit_trace_rec *trace_buffer, zend_ssa *tssa
 					level, ' ',
 					(p->func && p->func->common.scope) ? ZSTR_VAL(p->func->common.scope->name) : "",
 					(p->func && p->func->common.scope) ? "::" : "",
-					p->func ? ZSTR_VAL(p->func->common.function_name) : "???");
+					(p->func  && p->func->common.function_name) ? ZSTR_VAL(p->func->common.function_name) : "???");
 			} else {
 				fprintf(stderr, "    %*c>skip\n",
 					level, ' ');
@@ -7885,9 +7974,9 @@ static void zend_jit_dump_trace(zend_jit_trace_rec *trace_buffer, zend_ssa *tssa
 			if (p->func != (zend_function*)&zend_pass_function) {
 				fprintf(stderr, "    %*c>call %s%s%s\n",
 					level, ' ',
-					p->func->common.scope ? ZSTR_VAL(p->func->common.scope->name) : "",
-					p->func->common.scope ? "::" : "",
-					ZSTR_VAL(p->func->common.function_name));
+					(p->func && p->func->common.scope) ? ZSTR_VAL(p->func->common.scope->name) : "",
+					(p->func && p->func->common.scope) ? "::" : "",
+					(p->func && p->func->common.function_name) ? ZSTR_VAL(p->func->common.function_name) : "???");
 			} else {
 				fprintf(stderr, "    %*c>skip\n",
 					level, ' ');
@@ -8050,7 +8139,7 @@ int ZEND_FASTCALL zend_jit_trace_hot_root(zend_execute_data *execute_data, const
 
 	JIT_G(tracing) = 1;
 	stop = zend_jit_trace_execute(execute_data, opline, trace_buffer,
-		ZEND_OP_TRACE_INFO(opline, offset)->trace_flags & ZEND_JIT_TRACE_START_MASK, 0);
+		ZEND_OP_TRACE_INFO(opline, offset)->trace_flags & ZEND_JIT_TRACE_START_MASK, 0, 0);
 	JIT_G(tracing) = 0;
 
 	if (stop & ZEND_JIT_TRACE_HALT) {
@@ -8374,6 +8463,8 @@ int ZEND_FASTCALL zend_jit_trace_hot_side(zend_execute_data *execute_data, uint3
 	zend_jit_trace_rec trace_buffer[ZEND_JIT_TRACE_MAX_LENGTH];
 	uint32_t is_megamorphic = 0;
 	uint32_t polymorphism = 0;
+	uint32_t root;
+	int ret_depth = 0;
 
 	trace_num = ZEND_JIT_TRACE_NUM;
 
@@ -8398,7 +8489,8 @@ int ZEND_FASTCALL zend_jit_trace_hot_side(zend_execute_data *execute_data, uint3
 		goto abort;
 	}
 
-	if (zend_jit_traces[zend_jit_traces[parent_num].root].child_count >= JIT_G(max_side_traces)) {
+	root = zend_jit_traces[parent_num].root;
+	if (zend_jit_traces[root].child_count >= JIT_G(max_side_traces)) {
 		stop = ZEND_JIT_TRACE_STOP_TOO_MANY_CHILDREN;
 		goto abort;
 	}
@@ -8418,8 +8510,29 @@ int ZEND_FASTCALL zend_jit_trace_hot_side(zend_execute_data *execute_data, uint3
 		}
 	}
 
+	/* Check if this is a side trace of a root LOOP trace */
+	if ((zend_jit_traces[root].flags & ZEND_JIT_TRACE_LOOP)
+	 && zend_jit_traces[root].op_array != &EX(func)->op_array) {
+		const zend_op_array *op_array = zend_jit_traces[root].op_array;
+		const zend_op *opline = zend_jit_traces[root].opline;
+		zend_jit_op_array_trace_extension *jit_extension =
+				(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(op_array);
+
+		if (jit_extension->trace_info[opline - op_array->opcodes].trace_flags & ZEND_JIT_TRACE_START_LOOP) {
+			zend_execute_data *ex = execute_data;
+			int n = 0;
+			do {
+				ex = ex->prev_execute_data;
+				n++;
+			} while (ex && zend_jit_traces[root].op_array != &ex->func->op_array);
+			if (ex && n <= ZEND_JIT_TRACE_MAX_RET_DEPTH) {
+				ret_depth = n;
+			}
+		}
+	}
+
 	JIT_G(tracing) = 1;
-	stop = zend_jit_trace_execute(execute_data, EX(opline), trace_buffer, ZEND_JIT_TRACE_START_SIDE, is_megamorphic);
+	stop = zend_jit_trace_execute(execute_data, EX(opline), trace_buffer, ZEND_JIT_TRACE_START_SIDE, is_megamorphic, ret_depth);
 	JIT_G(tracing) = 0;
 
 	if (stop & ZEND_JIT_TRACE_HALT) {
diff --git a/ext/opcache/jit/zend_jit_vm_helpers.c b/ext/opcache/jit/zend_jit_vm_helpers.c
index e9cdeeab9865a..165896acbdaed 100644
--- a/ext/opcache/jit/zend_jit_vm_helpers.c
+++ b/ext/opcache/jit/zend_jit_vm_helpers.c
@@ -210,6 +210,15 @@ void ZEND_FASTCALL zend_jit_undefined_long_key(EXECUTE_DATA_D)
 	ZVAL_NULL(result);
 }
 
+void ZEND_FASTCALL zend_jit_undefined_long_key_ex(zend_long key EXECUTE_DATA_DC)
+{
+	const zend_op *opline = EX(opline);
+	zval *result = EX_VAR(opline->result.var);
+
+	zend_error(E_WARNING, "Undefined array key " ZEND_LONG_FMT, key);
+	ZVAL_NULL(result);
+}
+
 void ZEND_FASTCALL zend_jit_undefined_string_key(EXECUTE_DATA_D)
 {
 	const zend_op *opline = EX(opline);
@@ -499,31 +508,28 @@ static int zend_jit_trace_record_fake_init_call_ex(zend_execute_data *call, zend
 		}
 
 		func = call->func;
-		if (func->common.fn_flags & (ZEND_ACC_CALL_VIA_TRAMPOLINE|ZEND_ACC_NEVER_CACHE)) {
-			/* TODO: Can we continue recording ??? */
-			return -1;
-		}
-		/* Function is a property hook. */
-		if (func->common.prop_info) {
-			/* TODO: Can we continue recording ??? */
-			return -1;
-		}
 		if (func->type == ZEND_INTERNAL_FUNCTION
 		 && (func->op_array.fn_flags & (ZEND_ACC_CLOSURE|ZEND_ACC_FAKE_CLOSURE))) {
-			return -1;
-		}
-		if (func->type == ZEND_USER_FUNCTION
-		 && (func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
+			func = NULL;
+		} else if (func->type == ZEND_USER_FUNCTION) {
 			jit_extension =
 				(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(&func->op_array);
-			if (UNEXPECTED(!jit_extension
-			 || !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE)
-			 || (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE))) {
-				return -1;
+			if (UNEXPECTED(!jit_extension && (func->op_array.fn_flags & ZEND_ACC_CLOSURE))
+			 || (jit_extension && !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE))
+			 || (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
+				func = NULL;
+			} else if (func->op_array.fn_flags & ZEND_ACC_CLOSURE) {
+				func = (zend_function*)jit_extension->op_array;
 			}
-			func = (zend_function*)jit_extension->op_array;
 		}
-		if (is_megamorphic == ZEND_JIT_EXIT_POLYMORPHISM
+
+		if (!func
+		 || (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)
+		 || (func->common.fn_flags & ZEND_ACC_NEVER_CACHE)
+		 || func->common.prop_info) {
+			/* continue recording */
+			func = NULL;
+		} else if (is_megamorphic == ZEND_JIT_EXIT_POLYMORPHISM
 		 /* TODO: use more accurate check ??? */
 		 && ((ZEND_CALL_INFO(call) & ZEND_CALL_DYNAMIC)
 		  || func->common.scope)) {
@@ -565,7 +571,7 @@ static int zend_jit_trace_subtrace(zend_jit_trace_rec *trace_buffer, int start,
  * +--------+----------+----------+----------++----------+----------+----------+
  * | RETURN |INNER_LOOP|          |  rec-ret ||   LINK   |          |   LINK   |
  * +--------+----------+----------+----------++----------+----------+----------+
- * | SIDE   |  unroll  |          |  return  ||   LINK   |   LINK   |   LINK   |
+ * | SIDE   |  unroll  |          | side-ret ||   LINK   |   LINK   |   LINK   |
  * +--------+----------+----------+----------++----------+----------+----------+
  *
  * loop:       LOOP if "cycle" and level == 0, otherwise INNER_LOOP
@@ -576,10 +582,16 @@ static int zend_jit_trace_subtrace(zend_jit_trace_rec *trace_buffer, int start,
  * loop-ret:   LOOP_EXIT if level == 0, otherwise continue (wait for loop)
  * return:     RETURN if level == 0
  * rec_ret:    RECURSIVE_RET if "cycle" and ret_level > N, otherwise continue
+ * side_ret:   RETURN if level == 0 && ret_level == ret_depth, otherwise continue
  *
  */
 
-zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex, const zend_op *op, zend_jit_trace_rec *trace_buffer, uint8_t start, uint32_t is_megamorphic)
+zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data  *ex,
+                                                         const zend_op      *op,
+                                                         zend_jit_trace_rec *trace_buffer,
+                                                         uint8_t             start,
+                                                         uint32_t            is_megamorphic,
+                                                         int                 ret_depth)
 
 {
 #ifdef HAVE_GCC_GLOBAL_REGS
@@ -898,11 +910,18 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
 				break;
 			}
 			if (EX(call)->func->type == ZEND_INTERNAL_FUNCTION) {
-				if (EX(call)->func->op_array.fn_flags & (ZEND_ACC_CLOSURE|ZEND_ACC_FAKE_CLOSURE)) {
+				zend_function *func = EX(call)->func;
+
+				if ((func->op_array.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)
+				 || (func->common.fn_flags & ZEND_ACC_NEVER_CACHE)
+				 || func->common.prop_info) {
+					/* continue recording */
+					func = NULL;
+				} else if (func->op_array.fn_flags & (ZEND_ACC_CLOSURE|ZEND_ACC_FAKE_CLOSURE)) {
 					stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
 					break;
 				}
-				TRACE_RECORD(ZEND_JIT_TRACE_DO_ICALL, 0, EX(call)->func);
+				TRACE_RECORD(ZEND_JIT_TRACE_DO_ICALL, 0, func);
 			}
 		} else if (opline->opcode == ZEND_INCLUDE_OR_EVAL
 				|| opline->opcode == ZEND_CALLABLE_CONVERT) {
@@ -966,17 +985,20 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
 				}
 
 				if (EX(func)->op_array.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
-					/* TODO: Can we continue recording ??? */
 					stop = ZEND_JIT_TRACE_STOP_TRAMPOLINE;
 					break;
 				}
 
 				if (EX(func)->op_array.prop_info) {
-					/* TODO: Can we continue recording ??? */
 					stop = ZEND_JIT_TRACE_STOP_PROP_HOOK_CALL;
 					break;
 				}
 
+				if (EX(func)->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE) {
+					stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
+					break;
+				}
+
 				TRACE_RECORD(ZEND_JIT_TRACE_ENTER,
 					EX(return_value) != NULL ? ZEND_JIT_TRACE_RETURN_VALUE_USED : 0,
 					op_array);
@@ -1050,6 +1072,20 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
 							ZEND_JIT_TRACE_STOP_RECURSION_EXIT) {
 						stop = ZEND_JIT_TRACE_STOP_RECURSION_EXIT;
 						break;
+					} else if ((start & ZEND_JIT_TRACE_START_SIDE)
+					 && ret_level < ret_depth) {
+						TRACE_RECORD(ZEND_JIT_TRACE_BACK, 0, op_array);
+						ret_level++;
+						last_loop_opline = NULL;
+
+						if (prev_call) {
+							int ret = zend_jit_trace_record_fake_init_call(prev_call, trace_buffer, idx, 0);
+							if (ret < 0) {
+								stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
+								break;
+							}
+							idx = ret;
+						}
 					} else {
 						stop = ZEND_JIT_TRACE_STOP_RETURN;
 						break;
@@ -1070,56 +1106,49 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
 			if (EX(call)
 			 && EX(call)->prev_execute_data == prev_call) {
 				zend_function *func;
+				uint32_t info = 0;
 				zend_jit_op_array_trace_extension *jit_extension;
 
-				if (EX(call)->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) {
-					/* TODO: Can we continue recording ??? */
-					stop = ZEND_JIT_TRACE_STOP_TRAMPOLINE;
-					break;
-				} else if (EX(call)->func->common.fn_flags & ZEND_ACC_NEVER_CACHE) {
-					/* TODO: Can we continue recording ??? */
-					stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
-					break;
-				} else if (EX(call)->func->common.prop_info) {
-					/* TODO: Can we continue recording ??? */
-					stop = ZEND_JIT_TRACE_STOP_PROP_HOOK_CALL;
-					break;
-				}
 				func = EX(call)->func;
 				if (func->type == ZEND_INTERNAL_FUNCTION
 				 && (func->op_array.fn_flags & (ZEND_ACC_CLOSURE|ZEND_ACC_FAKE_CLOSURE))) {
-					stop = ZEND_JIT_TRACE_STOP_BAD_FUNC;
-					break;
-				}
-				if (func->type == ZEND_USER_FUNCTION
-				 && (func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
+					func = NULL;
+				} else if (func->type == ZEND_USER_FUNCTION) {
 					jit_extension =
 						(zend_jit_op_array_trace_extension*)ZEND_FUNC_INFO(&func->op_array);
-					if (UNEXPECTED(!jit_extension)
-					 || !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE)
+					if (UNEXPECTED(!jit_extension && (func->op_array.fn_flags & ZEND_ACC_CLOSURE))
+					 || (jit_extension && !(jit_extension->func_info.flags & ZEND_FUNC_JIT_ON_HOT_TRACE))
 					 || (func->op_array.fn_flags & ZEND_ACC_FAKE_CLOSURE)) {
-						stop = ZEND_JIT_TRACE_STOP_INTERPRETER;
-						break;
+						func = NULL;
+					} else if (func->op_array.fn_flags & ZEND_ACC_CLOSURE) {
+						func = (zend_function*)jit_extension->op_array;
 					}
-					func = (zend_function*)jit_extension->op_array;
 				}
 
 #ifndef HAVE_GCC_GLOBAL_REGS
 				opline = EX(opline);
 #endif
 
-				if (JIT_G(max_polymorphic_calls) == 0
+				if (!func
+				 || (func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE)
+				 || (func->common.fn_flags & ZEND_ACC_NEVER_CACHE)
+				 || func->common.prop_info) {
+					/* continue recording */
+					func = NULL;
+				} else if (JIT_G(max_polymorphic_calls) == 0
 				 && zend_jit_may_be_polymorphic_call(opline - 1)) {
 					func = NULL;
+					ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_MEGAMORPHIC);
 				} else if ((is_megamorphic == ZEND_JIT_EXIT_METHOD_CALL
 						 || is_megamorphic == ZEND_JIT_EXIT_CLOSURE_CALL)
 						&& trace_buffer[1].opline == opline - 1) {
 					func = NULL;
+					ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_MEGAMORPHIC);
 				}
 				if (!func) {
-					ZEND_ADD_CALL_FLAG(EX(call), ZEND_CALL_MEGAMORPHIC);
+					info = ZEND_JIT_TRACE_NUM_ARGS_INFO(ZEND_CALL_NUM_ARGS(EX(call)));
 				}
-				TRACE_RECORD(ZEND_JIT_TRACE_INIT_CALL, 0, func);
+				TRACE_RECORD(ZEND_JIT_TRACE_INIT_CALL, info, func);
 			}
 			prev_call = EX(call);
 		}
diff --git a/ext/opcache/opcache.stub.php b/ext/opcache/opcache.stub.php
index 4eeb76f083bc5..526da238219a4 100644
--- a/ext/opcache/opcache.stub.php
+++ b/ext/opcache/opcache.stub.php
@@ -14,6 +14,8 @@ function opcache_compile_file(string $filename): bool {}
 
 function opcache_invalidate(string $filename, bool $force = false): bool {}
 
+function opcache_jit_blacklist(Closure $closure): void {}
+
 /**
  * @return array|false
  * @refcount 1
diff --git a/ext/opcache/opcache_arginfo.h b/ext/opcache/opcache_arginfo.h
index b3e893fead62e..b4dc1f33a5fd8 100644
--- a/ext/opcache/opcache_arginfo.h
+++ b/ext/opcache/opcache_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 81f337ea4ac5361ca4a0873fcd3b033beaf524c6 */
+ * Stub hash: c416c231c5d1270b7e5961f84cc3ca3e29db4959 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_opcache_reset, 0, 0, _IS_BOOL, 0)
 ZEND_END_ARG_INFO()
@@ -17,6 +17,10 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_opcache_invalidate, 0, 1, _IS_BO
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, force, _IS_BOOL, 0, "false")
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_opcache_jit_blacklist, 0, 1, IS_VOID, 0)
+	ZEND_ARG_OBJ_INFO(0, closure, Closure, 0)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_opcache_get_configuration, 0, 0, MAY_BE_ARRAY|MAY_BE_FALSE)
 ZEND_END_ARG_INFO()
 
@@ -26,6 +30,7 @@ ZEND_FUNCTION(opcache_reset);
 ZEND_FUNCTION(opcache_get_status);
 ZEND_FUNCTION(opcache_compile_file);
 ZEND_FUNCTION(opcache_invalidate);
+ZEND_FUNCTION(opcache_jit_blacklist);
 ZEND_FUNCTION(opcache_get_configuration);
 ZEND_FUNCTION(opcache_is_script_cached);
 
@@ -34,6 +39,7 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(opcache_get_status, arginfo_opcache_get_status)
 	ZEND_FE(opcache_compile_file, arginfo_opcache_compile_file)
 	ZEND_FE(opcache_invalidate, arginfo_opcache_invalidate)
+	ZEND_FE(opcache_jit_blacklist, arginfo_opcache_jit_blacklist)
 	ZEND_FE(opcache_get_configuration, arginfo_opcache_get_configuration)
 	ZEND_FE(opcache_is_script_cached, arginfo_opcache_is_script_cached)
 	ZEND_FE_END
diff --git a/ext/opcache/tests/gh16186_001.phpt b/ext/opcache/tests/gh16186_001.phpt
new file mode 100644
index 0000000000000..2547b8f3b7e50
--- /dev/null
+++ b/ext/opcache/tests/gh16186_001.phpt
@@ -0,0 +1,38 @@
+--TEST--
+GH-16186 001 (Non-tracing JIT uses Closure scope)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.jit_buffer_size=64M
+opcache.jit=0234
+opcache.file_update_protection=0
+opcache.revalidate_freq=0
+opcache.protect_memory=1
+--FILE--
+x++; };
+    }
+}
+$a = new A();
+$f = $a->getIncrementor();
+$c = new stdClass();
+$f();
+$f2 = Closure::bind($f, $c);
+$f2();
+$f2();
+
+var_dump($c);
+
+?>
+--EXPECTF--
+Warning: Undefined property: stdClass::$x in %s on line %d
+object(stdClass)#%d (1) {
+  ["x"]=>
+  int(2)
+}
diff --git a/ext/opcache/tests/gh16186_002.phpt b/ext/opcache/tests/gh16186_002.phpt
new file mode 100644
index 0000000000000..72978146680a5
--- /dev/null
+++ b/ext/opcache/tests/gh16186_002.phpt
@@ -0,0 +1,38 @@
+--TEST--
+GH-16186 002 (Non-tracing JIT uses Closure scope)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.jit_buffer_size=64M
+opcache.jit=0214
+opcache.file_update_protection=0
+opcache.revalidate_freq=0
+opcache.protect_memory=1
+--FILE--
+x++; };
+    }
+}
+$a = new A();
+$f = $a->getIncrementor();
+$c = new stdClass();
+$f();
+$f2 = Closure::bind($f, $c);
+$f2();
+$f2();
+
+var_dump($c);
+
+?>
+--EXPECTF--
+Warning: Undefined property: stdClass::$x in %s on line %d
+object(stdClass)#%d (1) {
+  ["x"]=>
+  int(2)
+}
diff --git a/ext/opcache/tests/jit/gh15657.phpt b/ext/opcache/tests/jit/gh15657.phpt
new file mode 100644
index 0000000000000..4fc35d3b5bd00
--- /dev/null
+++ b/ext/opcache/tests/jit/gh15657.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GH-15657 (Segmentation fault in ext/opcache/jit/ir/dynasm/dasm_x86.h)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit_buffer_size=64M
+opcache.jit=1101
+--FILE--
+ $this->_prop;
+    }
+}
+echo "Done\n";
+?>
+--EXPECT--
+Done
diff --git a/ext/opcache/tests/jit/gh15658.phpt b/ext/opcache/tests/jit/gh15658.phpt
new file mode 100644
index 0000000000000..ceda3aff74146
--- /dev/null
+++ b/ext/opcache/tests/jit/gh15658.phpt
@@ -0,0 +1,15 @@
+--TEST--
+GH-15658 (Segmentation fault in Zend/zend_vm_execute.h)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=0101
+opcache.jit_buffer_size=64M
+--FILE--
+ 'foo',
+};
+?>
+--EXPECT--
+foo
diff --git a/ext/opcache/tests/jit/gh15666.phpt b/ext/opcache/tests/jit/gh15666.phpt
new file mode 100644
index 0000000000000..090003e055abe
--- /dev/null
+++ b/ext/opcache/tests/jit/gh15666.phpt
@@ -0,0 +1,21 @@
+--TEST--
+GH-15661 (Access null pointer in Zend/Optimizer/zend_inference.c)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1201
+opcache.jit_buffer_size=64M
+--FILE--
+
+--EXPECT--
+Done
diff --git a/ext/opcache/tests/jit/gh15821.phpt b/ext/opcache/tests/jit/gh15821.phpt
new file mode 100644
index 0000000000000..788c4a8e1f564
--- /dev/null
+++ b/ext/opcache/tests/jit/gh15821.phpt
@@ -0,0 +1,20 @@
+--TEST--
+GH-15821 (Core dumped in Zend/Optimizer/zend_inference.c:4062)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1203
+opcache.jit_buffer_size=64M
+--FILE--
+
+--EXPECT--
+Done
diff --git a/ext/opcache/tests/jit/gh15903.phpt b/ext/opcache/tests/jit/gh15903.phpt
new file mode 100644
index 0000000000000..6acbc27142f74
--- /dev/null
+++ b/ext/opcache/tests/jit/gh15903.phpt
@@ -0,0 +1,20 @@
+--TEST--
+GH-15903 (Core dumped in ext/opcache/jit/ir/ir_ra.c)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1002
+opcache.jit_buffer_size=64M
+--FILE--
+=2 (increasing the number of elements in the array *2 will not do)
+foreach (array_fill(0, 389, 'x') as &$params) { //Will not trigger <389
+$x[] = new foo;
+}
+}
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Class "foo" not found in %sgh15903.php:4
+Stack trace:
+#0 {main}
+  thrown in %sh15903.php on line 4
diff --git a/ext/opcache/tests/jit/gh15909.phpt b/ext/opcache/tests/jit/gh15909.phpt
new file mode 100644
index 0000000000000..ed1007836e782
--- /dev/null
+++ b/ext/opcache/tests/jit/gh15909.phpt
@@ -0,0 +1,16 @@
+--TEST--
+GH-15909 (Core dumped in Core dumped in ext/opcache/jit/ir/ir_cfg.c)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1001
+opcache.jit_buffer_size=64M
+--FILE--
+
+DONE
+--EXPECT--
+DONE
diff --git a/ext/opcache/tests/jit/gh15972.phpt b/ext/opcache/tests/jit/gh15972.phpt
new file mode 100644
index 0000000000000..11d234f0c96a5
--- /dev/null
+++ b/ext/opcache/tests/jit/gh15972.phpt
@@ -0,0 +1,16 @@
+--TEST--
+GH-15972 (Assertion failure in ext/opcache/jit/zend_jit_vm_helpers.c with function JIT)
+--EXTENSIONS--
+opcache
+--FILE--
+
+DONE
+--EXPECT--
+DONE
diff --git a/ext/opcache/tests/jit/gh15973.phpt b/ext/opcache/tests/jit/gh15973.phpt
new file mode 100644
index 0000000000000..42a039cd51c4e
--- /dev/null
+++ b/ext/opcache/tests/jit/gh15973.phpt
@@ -0,0 +1,24 @@
+--TEST--
+GH-15973 (Segmentation fault in JIT mode 1135)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1215
+opcache.jit_buffer_size=64M
+--FILE--
+prop[] = 1;
+})->bindTo($test, Test::class);
+$appendProp2();
+?>
+--EXPECTF--
+Warning: Undefined variable $test in %sgh15973.php on line 6
+
+Fatal error: Uncaught Error: Using $this when not in object context in %sgh15973.php:5
+Stack trace:
+#0 %sgh15973.php(7): Test::{closure:%s}()
+#1 {main}
+  thrown in %sgh15973.php on line 5
diff --git a/ext/opcache/tests/jit/gh16009.phpt b/ext/opcache/tests/jit/gh16009.phpt
new file mode 100644
index 0000000000000..6c1d6b6984d88
--- /dev/null
+++ b/ext/opcache/tests/jit/gh16009.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GH-16009 (Segmentation fault with frameless functions and undefined CVs)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1012
+--FILE--
+
+--EXPECTF--
+Warning: Undefined variable $value in %s on line %d
+
+Fatal error: Uncaught TypeError: testMin2Second(): Return value must be of type int, null returned in %s:%d
+Stack trace:
+#0 %s(%d): testMin2Second()
+#1 {main}
+  thrown in %s on line %d
diff --git a/ext/opcache/tests/jit/gh16355.phpt b/ext/opcache/tests/jit/gh16355.phpt
new file mode 100644
index 0000000000000..b84a8b5255fa5
--- /dev/null
+++ b/ext/opcache/tests/jit/gh16355.phpt
@@ -0,0 +1,19 @@
+--TEST--
+GH-16355 (Assertion failure in ext/opcache/jit/ir/ir_ra.c:1139)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1203
+opcache.jit_buffer_size=64M
+--FILE--
+
+DONE
+--EXPECT--
+DONE
diff --git a/ext/opcache/tests/jit/gh16358.phpt b/ext/opcache/tests/jit/gh16358.phpt
new file mode 100644
index 0000000000000..7a595176d8e7a
--- /dev/null
+++ b/ext/opcache/tests/jit/gh16358.phpt
@@ -0,0 +1,20 @@
+--TEST--
+GH-16358 (Segmentation fault (access null pointer) in Zend/zend_operators.c:2495)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1214
+opcache.jit_buffer_size=64M
+--FILE--
+
+OK
+--EXPECT--
+OK
diff --git a/ext/opcache/tests/jit/gh16393.phpt b/ext/opcache/tests/jit/gh16393.phpt
new file mode 100644
index 0000000000000..c93b06fda8ce5
--- /dev/null
+++ b/ext/opcache/tests/jit/gh16393.phpt
@@ -0,0 +1,18 @@
+--TEST--
+GH-16393 (Assertion failure in ext/opcache/jit/zend_jit.c:2897)
+--EXTENSIONS--
+opcache
+--INI--
+opcache.jit=1215
+opcache.jit_buffer_size=64M
+--FILE--
+bindTo($test, Test::class);
+$appendProp2();
+?>
+--EXPECTF--
+Warning: Undefined variable $test in %sgh16393.php on line 6
diff --git a/ext/opcache/tests/jit/init_fcall_004.phpt b/ext/opcache/tests/jit/init_fcall_004.phpt
new file mode 100644
index 0000000000000..68219d0273683
--- /dev/null
+++ b/ext/opcache/tests/jit/init_fcall_004.phpt
@@ -0,0 +1,31 @@
+--TEST--
+JIT INIT_FCALL: 004 Invalid target opline with jit->reuse_ip active
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+--EXTENSIONS--
+opcache
+--FILE--
+
+DONE
+--EXPECT--
+int(1)
+int(2)
+int(1)
+int(2)
+DONE
diff --git a/ext/opcache/tests/jit/opcache_jit_blacklist.phpt b/ext/opcache/tests/jit/opcache_jit_blacklist.phpt
new file mode 100644
index 0000000000000..33db720967555
--- /dev/null
+++ b/ext/opcache/tests/jit/opcache_jit_blacklist.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Basic usage of opcache_jit_blacklist()
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.file_update_protection=0
+opcache.protect_memory=1
+opcache.jit=tracing
+--EXTENSIONS--
+opcache
+--FILE--
+
+--EXPECT--
+int(2)
diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c
index cf1e86bb52442..2ed8155eff773 100644
--- a/ext/opcache/zend_accelerator_module.c
+++ b/ext/opcache/zend_accelerator_module.c
@@ -24,6 +24,7 @@
 #include "php.h"
 #include "ZendAccelerator.h"
 #include "zend_API.h"
+#include "zend_closures.h"
 #include "zend_shared_alloc.h"
 #include "zend_accelerator_blacklist.h"
 #include "php_ini.h"
@@ -924,6 +925,23 @@ ZEND_FUNCTION(opcache_invalidate)
 	}
 }
 
+/* {{{ Prevents JIT on function. Call it before the first invocation of the given function. */
+ZEND_FUNCTION(opcache_jit_blacklist)
+{
+	zval *closure;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &closure, zend_ce_closure) == FAILURE) {
+		RETURN_THROWS();
+	}
+
+#ifdef HAVE_JIT
+	const zend_function *func = zend_get_closure_method_def(Z_OBJ_P(closure));
+	if (ZEND_USER_CODE(func->type)) {
+		zend_jit_blacklist_function((zend_op_array *)&func->op_array);
+	}
+#endif
+}
+
 ZEND_FUNCTION(opcache_compile_file)
 {
 	zend_string *script_name;
diff --git a/ext/openssl/config.w32 b/ext/openssl/config.w32
index e9c567dfa6510..24064ec2a5f8c 100644
--- a/ext/openssl/config.w32
+++ b/ext/openssl/config.w32
@@ -4,14 +4,25 @@ ARG_WITH("openssl", "OpenSSL support", "no,shared");
 
 ARG_WITH("openssl-legacy-provider", "OPENSSL: Load legacy algorithm provider in addition to default provider", "no");
 
+ARG_WITH("openssl-argon2", "OPENSSL: Enable argon2 password hashing (requires OpenSSL >= 3.2)", "no");
+
 if (PHP_OPENSSL != "no") {
 	var ret = SETUP_OPENSSL("openssl", PHP_OPENSSL);
 
 	if (ret >= 2) {
-		EXTENSION("openssl", "openssl.c xp_ssl.c");
+		EXTENSION("openssl", "openssl.c openssl_pwhash.c xp_ssl.c");
 		AC_DEFINE("HAVE_OPENSSL_EXT", 1, "Define to 1 if the PHP extension 'openssl' is available.");
 		if (PHP_OPENSSL_LEGACY_PROVIDER != "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 (!CHECK_FUNC_IN_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 bc20647dd2a7f..f6994a06c5428 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -1524,11 +1524,13 @@ static X509 *php_openssl_x509_from_zval(
 
 	*free_cert = 1;
 
-	if (!try_convert_to_string(val)) {
+	zend_string *str = zval_try_get_string(val);
+	if (str == NULL) {
 		return NULL;
 	}
-
-	return php_openssl_x509_from_str(Z_STR_P(val), arg_num, is_from_array, option_name);
+	X509 *cert = php_openssl_x509_from_str(str, arg_num, is_from_array, option_name);
+	zend_string_release(str);
+	return cert;
 }
 /* }}} */
 
@@ -3279,6 +3281,11 @@ PHP_FUNCTION(openssl_csr_sign)
 		goto cleanup;
 	}
 
+	if (num_days < 0 || num_days > LONG_MAX / 86400) {
+		php_error_docref(NULL, E_WARNING, "Days must be between 0 and %ld", LONG_MAX / 86400);
+		goto cleanup;
+	}
+
 	if (PHP_SSL_REQ_PARSE(&req, args) == FAILURE) {
 		goto cleanup;
 	}
@@ -3347,7 +3354,7 @@ PHP_FUNCTION(openssl_csr_sign)
 		goto cleanup;
 	}
 	X509_gmtime_adj(X509_getm_notBefore(new_cert), 0);
-	X509_gmtime_adj(X509_getm_notAfter(new_cert), 60*60*24*(long)num_days);
+	X509_gmtime_adj(X509_getm_notAfter(new_cert), 60*60*24*num_days);
 	i = X509_set_pubkey(new_cert, key);
 	if (!i) {
 		php_openssl_store_errors();
diff --git a/ext/openssl/openssl.stub.php b/ext/openssl/openssl.stub.php
index 9da0a64468857..1f8c6f7fbdbec 100644
--- a/ext/openssl/openssl.stub.php
+++ b/ext/openssl/openssl.stub.php
@@ -473,9 +473,9 @@ function openssl_csr_export(OpenSSLCertificateSigningRequest|string $csr, &$outp
 function openssl_csr_sign(OpenSSLCertificateSigningRequest|string $csr, OpenSSLCertificate|string|null $ca_certificate, #[\SensitiveParameter] $private_key, int $days, ?array $options = null, int $serial = 0, ?string $serial_hex = null): OpenSSLCertificate|false {}
 
 /**
- * @param OpenSSLAsymmetricKey $private_key
+ * @param OpenSSLAsymmetricKey|null $private_key
  */
-function openssl_csr_new(array $distinguished_names, #[\SensitiveParameter] &$private_key, ?array $options = null, ?array $extra_attributes = null): OpenSSLCertificateSigningRequest|false {}
+function openssl_csr_new(array $distinguished_names, #[\SensitiveParameter] &$private_key, ?array $options = null, ?array $extra_attributes = null): OpenSSLCertificateSigningRequest|bool {}
 
 /**
  * @return array|false
diff --git a/ext/openssl/openssl_arginfo.h b/ext/openssl/openssl_arginfo.h
index e46ed0c680291..04d7c4163db9d 100644
--- a/ext/openssl/openssl_arginfo.h
+++ b/ext/openssl/openssl_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 62716ca2f10c7df42529a9140d80bd7cbc2dc481 */
+ * Stub hash: 32bd0ec5db046bfe3bba8a5d3fe1c0c51ff89e00 */
 
 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)
@@ -93,7 +93,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_openssl_csr_sign, 0, 4, Open
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, serial_hex, IS_STRING, 1, "null")
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_openssl_csr_new, 0, 2, OpenSSLCertificateSigningRequest, MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_openssl_csr_new, 0, 2, OpenSSLCertificateSigningRequest, MAY_BE_BOOL)
 	ZEND_ARG_TYPE_INFO(0, distinguished_names, IS_ARRAY, 0)
 	ZEND_ARG_INFO(1, private_key)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null")
@@ -658,7 +658,7 @@ static void register_openssl_symbols(int module_number)
 
 	zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "openssl_x509_check_private_key", sizeof("openssl_x509_check_private_key") - 1), 1, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
 
-	zend_attribute *attribute_Deprecated_func_openssl_x509_free_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "openssl_x509_free", sizeof("openssl_x509_free") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_openssl_x509_free_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "openssl_x509_free", sizeof("openssl_x509_free") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_openssl_x509_free_0_arg0;
 	zend_string *attribute_Deprecated_func_openssl_x509_free_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_openssl_x509_free_0_arg0, attribute_Deprecated_func_openssl_x509_free_0_arg0_str);
@@ -692,7 +692,7 @@ static void register_openssl_symbols(int module_number)
 
 	zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "openssl_pkey_export", sizeof("openssl_pkey_export") - 1), 2, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
 
-	zend_attribute *attribute_Deprecated_func_openssl_pkey_free_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "openssl_pkey_free", sizeof("openssl_pkey_free") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_openssl_pkey_free_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "openssl_pkey_free", sizeof("openssl_pkey_free") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_openssl_pkey_free_0_arg0;
 	zend_string *attribute_Deprecated_func_openssl_pkey_free_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_openssl_pkey_free_0_arg0, attribute_Deprecated_func_openssl_pkey_free_0_arg0_str);
@@ -704,7 +704,7 @@ static void register_openssl_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_openssl_pkey_free_0->args[1].value, &attribute_Deprecated_func_openssl_pkey_free_0_arg1);
 	attribute_Deprecated_func_openssl_pkey_free_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_openssl_free_key_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "openssl_free_key", sizeof("openssl_free_key") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_openssl_free_key_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "openssl_free_key", sizeof("openssl_free_key") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_openssl_free_key_0_arg0;
 	zend_string *attribute_Deprecated_func_openssl_free_key_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_openssl_free_key_0_arg0, attribute_Deprecated_func_openssl_free_key_0_arg0_str);
diff --git a/ext/openssl/tests/gh16357.phpt b/ext/openssl/tests/gh16357.phpt
new file mode 100644
index 0000000000000..32a76167a0e38
--- /dev/null
+++ b/ext/openssl/tests/gh16357.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GH-16357 (openssl may modify member types of certificate arrays)
+--EXTENSIONS--
+openssl
+--FILE--
+
+--CLEAN--
+
+--EXPECT--
+bool(false)
+array(1) {
+  [0]=>
+  int(123)
+}
diff --git a/ext/openssl/tests/gh16433.phpt b/ext/openssl/tests/gh16433.phpt
new file mode 100644
index 0000000000000..03554171d72e2
--- /dev/null
+++ b/ext/openssl/tests/gh16433.phpt
@@ -0,0 +1,17 @@
+--TEST--
+GH-16433 (Large values for openssl_csr_sign() $days overflow)
+--EXTENSIONS--
+openssl
+--FILE--
+
+--EXPECTF--
+Warning: openssl_csr_sign(): Days must be between 0 and %d in %s on line %d
+bool(false)
+
+Warning: openssl_csr_sign(): Days must be between 0 and %d in %s on line %d
+bool(false)
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index ac0ad2c378be2..19068b90c0d0b 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -92,7 +92,7 @@ static MUTEX_T pcre_mt = NULL;
 
 ZEND_TLS HashTable char_tables;
 
-static void free_subpats_table(zend_string **subpat_names, uint32_t num_subpats, bool persistent);
+static void free_subpats_table(zend_string **subpat_names, uint32_t num_subpats);
 
 static void php_pcre_free_char_table(zval *data)
 {/*{{{*/
@@ -168,25 +168,13 @@ static void php_free_pcre_cache(zval *data) /* {{{ */
 	pcre_cache_entry *pce = (pcre_cache_entry *) Z_PTR_P(data);
 	if (!pce) return;
 	if (pce->subpats_table) {
-		free_subpats_table(pce->subpats_table, pce->capture_count + 1, true);
+		free_subpats_table(pce->subpats_table, pce->capture_count + 1);
 	}
 	pcre2_code_free(pce->re);
 	free(pce);
 }
 /* }}} */
 
-static void php_efree_pcre_cache(zval *data) /* {{{ */
-{
-	pcre_cache_entry *pce = (pcre_cache_entry *) Z_PTR_P(data);
-	if (!pce) return;
-	if (pce->subpats_table) {
-		free_subpats_table(pce->subpats_table, pce->capture_count + 1, false);
-	}
-	pcre2_code_free(pce->re);
-	efree(pce);
-}
-/* }}} */
-
 static void *php_pcre_malloc(PCRE2_SIZE size, void *data)
 {
 	return pemalloc(size, 1);
@@ -303,12 +291,7 @@ static PHP_GINIT_FUNCTION(pcre) /* {{{ */
 {
 	php_pcre_mutex_alloc();
 
-	/* If we're on the CLI SAPI, there will only be one request, so we don't need the
-	 * cache to survive after RSHUTDOWN. */
-	pcre_globals->per_request_cache = strcmp(sapi_module.name, "cli") == 0;
-	if (!pcre_globals->per_request_cache) {
-		zend_hash_init(&pcre_globals->pcre_cache, 0, NULL, php_free_pcre_cache, 1);
-	}
+	zend_hash_init(&pcre_globals->pcre_cache, 0, NULL, php_free_pcre_cache, 1);
 
 	pcre_globals->backtrack_limit = 0;
 	pcre_globals->recursion_limit = 0;
@@ -326,9 +309,7 @@ static PHP_GINIT_FUNCTION(pcre) /* {{{ */
 
 static PHP_GSHUTDOWN_FUNCTION(pcre) /* {{{ */
 {
-	if (!pcre_globals->per_request_cache) {
-		zend_hash_destroy(&pcre_globals->pcre_cache);
-	}
+	zend_hash_destroy(&pcre_globals->pcre_cache);
 
 	php_pcre_shutdown_pcre2();
 	zend_hash_destroy(&char_tables);
@@ -491,10 +472,6 @@ static PHP_RINIT_FUNCTION(pcre)
 		return FAILURE;
 	}
 
-	if (PCRE_G(per_request_cache)) {
-		zend_hash_init(&PCRE_G(pcre_cache), 0, NULL, php_efree_pcre_cache, 0);
-	}
-
 	return SUCCESS;
 }
 /* }}} */
@@ -504,10 +481,6 @@ static PHP_RSHUTDOWN_FUNCTION(pcre)
 	pcre2_general_context_free(PCRE_G(gctx_zmm));
 	PCRE_G(gctx_zmm) = NULL;
 
-	if (PCRE_G(per_request_cache)) {
-		zend_hash_destroy(&PCRE_G(pcre_cache));
-	}
-
 	zval_ptr_dtor(&PCRE_G(unmatched_null_pair));
 	zval_ptr_dtor(&PCRE_G(unmatched_empty_pair));
 	ZVAL_UNDEF(&PCRE_G(unmatched_null_pair));
@@ -521,8 +494,10 @@ static int pcre_clean_cache(zval *data, void *arg)
 	pcre_cache_entry *pce = (pcre_cache_entry *) Z_PTR_P(data);
 	int *num_clean = (int *)arg;
 
-	if (*num_clean > 0 && !pce->refcount) {
-		(*num_clean)--;
+	if (!pce->refcount) {
+		if (--(*num_clean) == 0) {
+			return ZEND_HASH_APPLY_REMOVE|ZEND_HASH_APPLY_STOP;
+		}
 		return ZEND_HASH_APPLY_REMOVE;
 	} else {
 		return ZEND_HASH_APPLY_KEEP;
@@ -530,18 +505,18 @@ static int pcre_clean_cache(zval *data, void *arg)
 }
 /* }}} */
 
-static void free_subpats_table(zend_string **subpat_names, uint32_t num_subpats, bool persistent) {
+static void free_subpats_table(zend_string **subpat_names, uint32_t num_subpats) {
 	uint32_t i;
 	for (i = 0; i < num_subpats; i++) {
 		if (subpat_names[i]) {
-			zend_string_release_ex(subpat_names[i], persistent);
+			zend_string_release_ex(subpat_names[i], true);
 		}
 	}
-	pefree(subpat_names, persistent);
+	pefree(subpat_names, true);
 }
 
 /* {{{ static make_subpats_table */
-static zend_string **make_subpats_table(uint32_t name_cnt, pcre_cache_entry *pce, bool persistent)
+static zend_string **make_subpats_table(uint32_t name_cnt, pcre_cache_entry *pce)
 {
 	uint32_t num_subpats = pce->capture_count + 1;
 	uint32_t name_size, ni = 0;
@@ -556,7 +531,7 @@ static zend_string **make_subpats_table(uint32_t name_cnt, pcre_cache_entry *pce
 		return NULL;
 	}
 
-	subpat_names = pecalloc(num_subpats, sizeof(zend_string *), persistent);
+	subpat_names = pecalloc(num_subpats, sizeof(zend_string *), true);
 	while (ni++ < name_cnt) {
 		unsigned short name_idx = 0x100 * (unsigned char)name_table[0] + (unsigned char)name_table[1];
 		const char *name = name_table + 2;
@@ -566,10 +541,8 @@ static zend_string **make_subpats_table(uint32_t name_cnt, pcre_cache_entry *pce
 		 * Although we will be storing them in user-exposed arrays, they cannot cause problems
 		 * because they only live in this thread and the last reference is deleted on shutdown
 		 * instead of by user code. */
-		subpat_names[name_idx] = zend_string_init(name, strlen(name), persistent);
-		if (persistent) {
-			GC_MAKE_PERSISTENT_LOCAL(subpat_names[name_idx]);
-		}
+		subpat_names[name_idx] = zend_string_init(name, strlen(name), true);
+		GC_MAKE_PERSISTENT_LOCAL(subpat_names[name_idx]);
 		name_table += name_size;
 	}
 	return subpat_names;
@@ -871,7 +844,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, bo
 
 	/* Compute and cache the subpattern table to avoid computing it again over and over. */
 	if (name_count > 0) {
-		new_entry.subpats_table = make_subpats_table(name_count, &new_entry, !PCRE_G(per_request_cache));
+		new_entry.subpats_table = make_subpats_table(name_count, &new_entry);
 		if (!new_entry.subpats_table) {
 			if (key != regex) {
 				zend_string_release_ex(key, false);
@@ -892,7 +865,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache_ex(zend_string *regex, bo
 	 * as hash keys especually for this table.
 	 * See bug #63180
 	 */
-	if (!(GC_FLAGS(key) & IS_STR_PERMANENT) && !PCRE_G(per_request_cache)) {
+	if (!(GC_FLAGS(key) & IS_STR_PERMANENT)) {
 		zend_string *str = zend_string_init(ZSTR_VAL(key), ZSTR_LEN(key), 1);
 		GC_MAKE_PERSISTENT_LOCAL(str);
 
@@ -963,18 +936,18 @@ PHPAPI void php_pcre_free_match_data(pcre2_match_data *match_data)
 	}
 }/*}}}*/
 
-static void init_unmatched_null_pair(void) {
+static void init_unmatched_null_pair(zval *pair) {
 	zval val1, val2;
 	ZVAL_NULL(&val1);
 	ZVAL_LONG(&val2, -1);
-	ZVAL_ARR(&PCRE_G(unmatched_null_pair), zend_new_pair(&val1, &val2));
+	ZVAL_ARR(pair, zend_new_pair(&val1, &val2));
 }
 
-static void init_unmatched_empty_pair(void) {
+static void init_unmatched_empty_pair(zval *pair) {
 	zval val1, val2;
 	ZVAL_EMPTY_STRING(&val1);
 	ZVAL_LONG(&val2, -1);
-	ZVAL_ARR(&PCRE_G(unmatched_empty_pair), zend_new_pair(&val1, &val2));
+	ZVAL_ARR(pair, zend_new_pair(&val1, &val2));
 }
 
 static zend_always_inline void populate_match_value_str(
@@ -1020,15 +993,29 @@ static inline void add_offset_pair(
 	/* Add (match, offset) to the return value */
 	if (PCRE2_UNSET == start_offset) {
 		if (unmatched_as_null) {
-			if (Z_ISUNDEF(PCRE_G(unmatched_null_pair))) {
-				init_unmatched_null_pair();
-			}
-			ZVAL_COPY(&match_pair, &PCRE_G(unmatched_null_pair));
+			do {
+				if (Z_ISUNDEF(PCRE_G(unmatched_null_pair))) {
+					if (UNEXPECTED(EG(flags) & EG_FLAGS_IN_SHUTDOWN)) {
+						init_unmatched_null_pair(&match_pair);
+						break;
+					} else {
+						init_unmatched_null_pair(&PCRE_G(unmatched_null_pair));
+					}
+				}
+				ZVAL_COPY(&match_pair, &PCRE_G(unmatched_null_pair));
+			} while (0);
 		} else {
-			if (Z_ISUNDEF(PCRE_G(unmatched_empty_pair))) {
-				init_unmatched_empty_pair();
-			}
-			ZVAL_COPY(&match_pair, &PCRE_G(unmatched_empty_pair));
+			do {
+				if (Z_ISUNDEF(PCRE_G(unmatched_empty_pair))) {
+					if (UNEXPECTED(EG(flags) & EG_FLAGS_IN_SHUTDOWN)) {
+						init_unmatched_empty_pair(&match_pair);
+						break;
+					} else {
+						init_unmatched_empty_pair(&PCRE_G(unmatched_empty_pair));
+					}
+				}
+				ZVAL_COPY(&match_pair, &PCRE_G(unmatched_empty_pair));
+			} while (0);
 		}
 	} else {
 		zval val1, val2;
@@ -1137,6 +1124,11 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, bool global) /* {{{
 		RETURN_FALSE;
 	}
 
+	if (start_offset == ZEND_LONG_MIN) {
+		zend_argument_value_error(5, "must be greater than " ZEND_LONG_FMT, ZEND_LONG_MIN);
+		RETURN_THROWS();
+	}
+
 	pce->refcount++;
 	php_pcre_match_impl(pce, subject, return_value, subpats,
 		global, flags, start_offset);
@@ -1762,8 +1754,10 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, zend_string *su
 						}
 						if (preg_get_backref(&walk, &backref)) {
 							if (backref < count) {
-								match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
-								walkbuf = zend_mempcpy(walkbuf, subject + offsets[backref << 1], match_len);
+								if (offsets[backref<<1] < SIZE_MAX) {
+									match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
+									walkbuf = zend_mempcpy(walkbuf, subject + offsets[backref << 1], match_len);
+								}
 							}
 							continue;
 						}
diff --git a/ext/pcre/php_pcre.h b/ext/pcre/php_pcre.h
index 3e526ade551d5..e180d68a3d486 100644
--- a/ext/pcre/php_pcre.h
+++ b/ext/pcre/php_pcre.h
@@ -78,7 +78,6 @@ ZEND_BEGIN_MODULE_GLOBALS(pcre)
 #ifdef HAVE_PCRE_JIT_SUPPORT
 	bool jit;
 #endif
-	bool per_request_cache;
 	php_pcre_error_code error_code;
 	/* Used for unmatched subpatterns in OFFSET_CAPTURE mode */
 	zval unmatched_null_pair;
diff --git a/ext/pcre/tests/gh15205_1.phpt b/ext/pcre/tests/gh15205_1.phpt
new file mode 100644
index 0000000000000..c5a9b65d25491
--- /dev/null
+++ b/ext/pcre/tests/gh15205_1.phpt
@@ -0,0 +1,12 @@
+--TEST--
+GH-15205: UAF when destroying RegexIterator after pcre request shutdown
+--CREDITS--
+YuanchengJiang
+--FILE--
+
+--EXPECT--
+Done
diff --git a/ext/pcre/tests/gh15205_2.phpt b/ext/pcre/tests/gh15205_2.phpt
new file mode 100644
index 0000000000000..6d46d85b1004c
--- /dev/null
+++ b/ext/pcre/tests/gh15205_2.phpt
@@ -0,0 +1,32 @@
+--TEST--
+GH-15205: UAF when destroying stream after pcre request shutdown
+--CREDITS--
+nicolaslegland
+--FILE--
+
+--EXPECT--
+Close
diff --git a/ext/pcre/tests/gh16184.phpt b/ext/pcre/tests/gh16184.phpt
new file mode 100644
index 0000000000000..ba915d19af74b
--- /dev/null
+++ b/ext/pcre/tests/gh16184.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-16184 (UBSan address overflowed in ext/pcre/php_pcre.c)
+--CREDITS--
+YuanchengJiang
+--FILE--
+
+--EXPECT--
+This test a string. It contains numbers * to 0* to 9* test well test parentheses and some other things*
diff --git a/ext/pcre/tests/gh16189.phpt b/ext/pcre/tests/gh16189.phpt
new file mode 100644
index 0000000000000..c77ab7699eed1
--- /dev/null
+++ b/ext/pcre/tests/gh16189.phpt
@@ -0,0 +1,19 @@
+--TEST--
+GH-16189 (preg_match/preg_match_all underflow on start_offset argument)
+--FILE--
+/', '', $matches, 0, PHP_INT_MIN);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+try {
+	preg_match_all( '/<(\w+)[\s\w\-]+ id="S44_i89ew">/', '
', $matches, 0, PHP_INT_MIN);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+?>
+--EXPECTF--
+preg_match(): Argument #5 ($offset) must be greater than %s
+preg_match_all(): Argument #5 ($offset) must be greater than %s
diff --git a/ext/pdo/pdo_arginfo.h b/ext/pdo/pdo_arginfo.h
index ed904d2b33ce9..d2df2f0b0eb23 100644
--- a/ext/pdo/pdo_arginfo.h
+++ b/ext/pdo/pdo_arginfo.h
@@ -20,9 +20,7 @@ static zend_class_entry *register_class_PDOException(zend_class_entry *class_ent
 
 	zval property_code_default_value;
 	ZVAL_LONG(&property_code_default_value, 0);
-	zend_string *property_code_name = zend_string_init("code", sizeof("code") - 1, 1);
-	zend_declare_typed_property(class_entry, property_code_name, &property_code_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
-	zend_string_release(property_code_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_CODE), &property_code_default_value, ZEND_ACC_PROTECTED, NULL, (zend_type) ZEND_TYPE_INIT_NONE(0));
 
 	zval property_errorInfo_default_value;
 	ZVAL_NULL(&property_errorInfo_default_value);
diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c
index 4fc95aa7d6fee..2ba34527bad84 100644
--- a/ext/pdo/pdo_stmt.c
+++ b/ext/pdo/pdo_stmt.c
@@ -144,15 +144,10 @@ bool pdo_stmt_describe_columns(pdo_stmt_t *stmt) /* {{{ */
 					stmt->columns[col].name = zend_string_tolower(orig_name);
 					zend_string_release(orig_name);
 					break;
-				case PDO_CASE_UPPER: {
-					stmt->columns[col].name = zend_string_separate(orig_name, 0);
-					char *s = ZSTR_VAL(stmt->columns[col].name);
-					while (*s != '\0') {
-						*s = toupper(*s);
-						s++;
-					}
+				case PDO_CASE_UPPER:
+					stmt->columns[col].name = zend_string_toupper(orig_name);
+					zend_string_release(orig_name);
 					break;
-				}
 				EMPTY_SWITCH_DEFAULT_CASE()
 			}
 		}
diff --git a/ext/pdo_firebird/firebird_driver.c b/ext/pdo_firebird/firebird_driver.c
index 65034179ddf26..23f17914dcd76 100644
--- a/ext/pdo_firebird/firebird_driver.c
+++ b/ext/pdo_firebird/firebird_driver.c
@@ -535,7 +535,7 @@ void php_firebird_set_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *state,
 		einfo->errmsg_length = 0;
 	}
 
-	if (H->isc_status && (H->isc_status[0] == 1 && H->isc_status[1] > 0)) {
+	if (H->isc_status[0] == 1 && H->isc_status[1] > 0) {
 		char buf[512];
 		size_t buf_size = sizeof(buf), read_len = 0;
 		ssize_t tmp_len;
@@ -557,7 +557,7 @@ void php_firebird_set_error(pdo_dbh_t *dbh, pdo_stmt_t *stmt, const char *state,
 
 		char sqlstate[sizeof(pdo_error_type)];
 		fb_sqlstate(sqlstate, H->isc_status);
-		if (sqlstate != NULL && strlen(sqlstate) < sizeof(pdo_error_type)) {
+		if (strlen(sqlstate) < sizeof(pdo_error_type)) {
 			strcpy(*error_code, sqlstate);
 			goto end;
 		}
@@ -1250,8 +1250,7 @@ static int pdo_firebird_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val)
 				ZVAL_STRING(val, tmp);
 				return 1;
 			}
-			/* TODO Check this is correct? */
-			ZEND_FALLTHROUGH;
+			return -1;
 
 		case PDO_ATTR_FETCH_TABLE_NAMES:
 			ZVAL_BOOL(val, H->fetch_table_names);
diff --git a/ext/pdo_firebird/tests/bug_15604.phpt b/ext/pdo_firebird/tests/bug_15604.phpt
index 52ab04d18af69..e8aa04c9ddf54 100644
--- a/ext/pdo_firebird/tests/bug_15604.phpt
+++ b/ext/pdo_firebird/tests/bug_15604.phpt
@@ -64,11 +64,11 @@ $dbh = getDbConnection();
 @$dbh->exec('drop sequence g_bug_15604');
 unset($dbh);
 ?>
---EXPECT--
+--EXPECTF--
 bool(false)
 array(3) {
   ["ID"]=>
-  int(2)
+  %r(int\(2\)|string\(1\) "2")%r
   ["A"]=>
   int(2)
   ["B"]=>
diff --git a/ext/pdo_firebird/tests/fb4_datatypes.phpt b/ext/pdo_firebird/tests/fb4_datatypes.phpt
index 7acf338be27c9..9056b21c5b565 100644
--- a/ext/pdo_firebird/tests/fb4_datatypes.phpt
+++ b/ext/pdo_firebird/tests/fb4_datatypes.phpt
@@ -49,7 +49,7 @@ echo "\ndone\n";
 ?>
 --EXPECTF--
 {
-    "I64": 15,
+    "I64": %r(15|"15")%r,
     "I128": "15",
     "N": "123.97",
     "N2": "123.97",
diff --git a/ext/pdo_firebird/tests/payload_server.php b/ext/pdo_firebird/tests/payload_server.php
index a2d2df4b7b2df..168929f644d6e 100644
--- a/ext/pdo_firebird/tests/payload_server.php
+++ b/ext/pdo_firebird/tests/payload_server.php
@@ -1,6 +1,6 @@
 driver_data;
 	bool use_national_character_set = 0;
+	bool use_binary = 0;
 	size_t quotedlen;
 
-	if (H->assume_national_character_set_strings) {
-		use_national_character_set = 1;
-	}
-	if ((paramtype & PDO_PARAM_STR_NATL) == PDO_PARAM_STR_NATL) {
-		use_national_character_set = 1;
-	}
-	if ((paramtype & PDO_PARAM_STR_CHAR) == PDO_PARAM_STR_CHAR) {
-		use_national_character_set = 0;
+	if ((paramtype & PDO_PARAM_LOB) == PDO_PARAM_LOB) {
+		use_binary = 1;
+	} else {
+		if (H->assume_national_character_set_strings) {
+			use_national_character_set = 1;
+		}
+		if ((paramtype & PDO_PARAM_STR_NATL) == PDO_PARAM_STR_NATL) {
+			use_national_character_set = 1;
+		}
+		if ((paramtype & PDO_PARAM_STR_CHAR) == PDO_PARAM_STR_CHAR) {
+			use_national_character_set = 0;
+		}
 	}
 
 	PDO_DBG_ENTER("mysql_handle_quoter");
 	PDO_DBG_INF_FMT("dbh=%p", dbh);
 	PDO_DBG_INF_FMT("unquoted=%.*s", (int)ZSTR_LEN(unquoted), ZSTR_VAL(unquoted));
 
-	zend_string *quoted_str = zend_string_safe_alloc(2, ZSTR_LEN(unquoted), 3 + (use_national_character_set ? 1 : 0), false);
+	zend_string *quoted_str = zend_string_safe_alloc(2, ZSTR_LEN(unquoted),
+		3 + (use_national_character_set ? 1 : 0) + (use_binary ? 7 : 0), false);
 	char *quoted = ZSTR_VAL(quoted_str);
 
 	if (use_national_character_set) {
@@ -334,6 +340,11 @@ static zend_string* mysql_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquo
 		quoted[1] = '\'';
 
 		++quotedlen; /* N prefix */
+	} else if (use_binary) {
+		quotedlen = mysql_real_escape_string_quote(H->server, quoted + 8, ZSTR_VAL(unquoted), ZSTR_LEN(unquoted), '\'');
+		memcpy(quoted, "_binary'", 8);
+
+		quotedlen += 7; /* _binary prefix */
 	} else {
 		quotedlen = mysql_real_escape_string_quote(H->server, quoted + 1, ZSTR_VAL(unquoted), ZSTR_LEN(unquoted), '\'');
 		quoted[0] = '\'';
diff --git a/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_binary.phpt b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_binary.phpt
new file mode 100644
index 0000000000000..9d29129984388
--- /dev/null
+++ b/ext/pdo_mysql/tests/pdo_mysql_prepare_emulated_binary.phpt
@@ -0,0 +1,48 @@
+--TEST--
+MySQL PDO->prepare(), no warnings should be raised for binary values using emulated PS
+--EXTENSIONS--
+pdo_mysql
+--SKIPIF--
+
+--FILE--
+setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
+
+    // Force the connection to utf8, which is enough to make the test fail
+    // MySQL 5.6+ would be required for utf8mb4
+    $db->exec("SET NAMES 'utf8'");
+
+    $content = '0191D886E6DC73E7AF1FEE7F99EC6235';
+
+    $statement = $db->prepare('SELECT HEX(?) as test');
+    $statement->bindValue(1, hex2bin($content), PDO::PARAM_LOB);
+    $statement->execute();
+
+    var_dump($statement->fetchAll(PDO::FETCH_ASSOC)[0]['test'] === $content);
+    var_dump($db->query('SHOW WARNINGS')->fetchAll(PDO::FETCH_ASSOC));
+
+    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+
+    $statement2 = $db->prepare('SELECT HEX(?) as test');
+    $statement2->bindValue(1, hex2bin($content), PDO::PARAM_LOB);
+    $statement2->execute();
+
+    var_dump($statement2->fetchAll(PDO::FETCH_ASSOC)[0]['test'] === $content);
+
+    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); // SHOW WARNINGS can only be used when PDO::ATTR_EMULATE_PREPARES=true
+    var_dump($db->query('SHOW WARNINGS')->fetchAll(PDO::FETCH_ASSOC));
+    print "done!";
+?>
+--EXPECTF--
+bool(true)
+array(0) {
+}
+bool(true)
+array(0) {
+}
+done!
diff --git a/ext/pdo_mysql/tests/pdo_mysql_quote_binary.phpt b/ext/pdo_mysql/tests/pdo_mysql_quote_binary.phpt
new file mode 100644
index 0000000000000..9c81f0849096c
--- /dev/null
+++ b/ext/pdo_mysql/tests/pdo_mysql_quote_binary.phpt
@@ -0,0 +1,28 @@
+--TEST--
+MySQL PDO->quote(), properly handle binary data
+--EXTENSIONS--
+pdo_mysql
+--SKIPIF--
+
+--FILE--
+setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
+
+    // Force the connection to utf8, which is enough to make the test fail
+    // MySQL 5.6+ would be required for utf8mb4
+    $db->exec("SET NAMES 'utf8'");
+
+    $content = "\xC3\xA1\xC3";
+    $quoted = $db->quote($content, PDO::PARAM_LOB);
+
+    var_dump($quoted);
+    var_dump($db->query("SELECT HEX({$quoted})")->fetch(PDO::FETCH_NUM)[0]);
+?>
+--EXPECTF--
+string(%d) "_binary'%s'"
+string(6) "C3A1C3"
diff --git a/ext/pdo_odbc/tests/pdoodbc_002.phpt b/ext/pdo_odbc/tests/pdoodbc_002.phpt
index 0731baef7bbcb..bd02f57fd8e3b 100644
--- a/ext/pdo_odbc/tests/pdoodbc_002.phpt
+++ b/ext/pdo_odbc/tests/pdoodbc_002.phpt
@@ -1,7 +1,7 @@
 --TEST--
 PDO_mysql connect through PDO::connect
 --EXTENSIONS--
-PDO_odbc
+pdo_odbc
 --SKIPIF--
 H = H;
 	stmt->driver_data = S;
@@ -303,6 +306,14 @@ static bool pgsql_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *
 		stmt->named_rewrite_template = "$%d";
 	}
 
+	S->is_unbuffered =
+		driver_options
+		&& (val = zend_hash_index_find(Z_ARRVAL_P(driver_options), PDO_ATTR_PREFETCH))
+		&& pdo_get_long_param(&lval, val)
+		? !lval
+		: H->default_fetching_laziness
+	;
+
 	ret = pdo_parse_params(stmt, sql, &nsql);
 
 	if (ret == -1) {
@@ -606,6 +617,32 @@ static bool pgsql_handle_rollback(pdo_dbh_t *dbh)
 	return ret;
 }
 
+static bool _pdo_pgsql_send_copy_data(pdo_pgsql_db_handle *H, zval *line) {
+	size_t query_len;
+	char *query;
+
+	if (!try_convert_to_string(line)) {
+		return false;
+	}
+
+	query_len = Z_STRLEN_P(line);
+	query = emalloc(query_len + 2); /* room for \n\0 */
+	memcpy(query, Z_STRVAL_P(line), query_len);
+
+	if (query[query_len - 1] != '\n') {
+		query[query_len++] = '\n';
+	}
+	query[query_len] = '\0';
+
+	if (PQputCopyData(H->server, query, query_len) != 1) {
+		efree(query);
+		return false;
+	}
+
+	efree(query);
+	return true;
+}
+
 void pgsqlCopyFromArray_internal(INTERNAL_FUNCTION_PARAMETERS)
 {
 	pdo_dbh_t *dbh;
@@ -620,16 +657,14 @@ void pgsqlCopyFromArray_internal(INTERNAL_FUNCTION_PARAMETERS)
 	PGresult *pgsql_result;
 	ExecStatusType status;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|sss!",
-		&table_name, &table_name_len, &pg_rows,
-		&pg_delim, &pg_delim_len, &pg_null_as, &pg_null_as_len, &pg_fields, &pg_fields_len) == FAILURE) {
-		RETURN_THROWS();
-	}
-
-	if (!zend_hash_num_elements(Z_ARRVAL_P(pg_rows))) {
-		zend_argument_must_not_be_empty_error(2);
-		RETURN_THROWS();
-	}
+	ZEND_PARSE_PARAMETERS_START(2, 5)
+		Z_PARAM_STRING(table_name, table_name_len)
+		Z_PARAM_ITERABLE(pg_rows)
+		Z_PARAM_OPTIONAL
+		Z_PARAM_STRING(pg_delim, pg_delim_len)
+		Z_PARAM_STRING(pg_null_as, pg_null_as_len)
+		Z_PARAM_STRING_OR_NULL(pg_fields, pg_fields_len)
+	ZEND_PARSE_PARAMETERS_END();
 
 	dbh = Z_PDO_DBH_P(ZEND_THIS);
 	PDO_CONSTRUCT_CHECK;
@@ -661,36 +696,42 @@ void pgsqlCopyFromArray_internal(INTERNAL_FUNCTION_PARAMETERS)
 
 	if (status == PGRES_COPY_IN && pgsql_result) {
 		int command_failed = 0;
-		size_t buffer_len = 0;
 		zval *tmp;
+		zend_object_iterator *iter;
 
 		PQclear(pgsql_result);
-		ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pg_rows), tmp) {
-			size_t query_len;
-			if (!try_convert_to_string(tmp)) {
-				efree(query);
+
+		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)) {
+					pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
+					PDO_HANDLE_DBH_ERR();
+					RETURN_FALSE;
+				}
+			} ZEND_HASH_FOREACH_END();
+		} else {
+			iter = Z_OBJCE_P(pg_rows)->get_iterator(Z_OBJCE_P(pg_rows), pg_rows, 0);
+			if (iter == NULL || EG(exception)) {
 				RETURN_THROWS();
 			}
 
-			if (buffer_len < Z_STRLEN_P(tmp)) {
-				buffer_len = Z_STRLEN_P(tmp);
-				query = erealloc(query, buffer_len + 2); /* room for \n\0 */
-			}
-			query_len = Z_STRLEN_P(tmp);
-			memcpy(query, Z_STRVAL_P(tmp), query_len);
-			if (query[query_len - 1] != '\n') {
-				query[query_len++] = '\n';
+			if (iter->funcs->rewind) {
+				iter->funcs->rewind(iter);
+				if (EG(exception)) {
+					RETURN_THROWS();
+				}
 			}
-			query[query_len] = '\0';
-			if (PQputCopyData(H->server, query, query_len) != 1) {
-				efree(query);
-				pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
-				PDO_HANDLE_DBH_ERR();
-				RETURN_FALSE;
+
+			for (; iter->funcs->valid(iter) == SUCCESS && EG(exception) == NULL; iter->funcs->move_forward(iter)) {
+				tmp = iter->funcs->get_current_data(iter);
+				if (!_pdo_pgsql_send_copy_data(H, tmp)) {
+					zend_iterator_dtor(iter);
+					pdo_pgsql_error(dbh, PGRES_FATAL_ERROR, NULL);
+					PDO_HANDLE_DBH_ERR();
+					RETURN_FALSE;
+				}
 			}
-		} ZEND_HASH_FOREACH_END();
-		if (query) {
-			efree(query);
+			zend_iterator_dtor(iter);
 		}
 
 		if (PQputCopyEnd(H->server, NULL) != 1) {
@@ -1301,6 +1342,12 @@ static bool pdo_pgsql_set_attr(pdo_dbh_t *dbh, zend_long attr, zval *val)
 			}
 			H->disable_prepares = bval;
 			return true;
+		case PDO_ATTR_PREFETCH:
+			if (!pdo_get_bool_param(&bval, val)) {
+				return false;
+			}
+			H->default_fetching_laziness = !bval;
+			return true;
 		default:
 			return false;
 	}
diff --git a/ext/pdo_pgsql/pgsql_driver.stub.php b/ext/pdo_pgsql/pgsql_driver.stub.php
index 63236f0ae084d..8cf6f0e467b2f 100644
--- a/ext/pdo_pgsql/pgsql_driver.stub.php
+++ b/ext/pdo_pgsql/pgsql_driver.stub.php
@@ -8,7 +8,7 @@
  */
 class PDO_PGSql_Ext {
     /** @tentative-return-type */
-    public function pgsqlCopyFromArray(string $tableName, array $rows, string $separator = "\t", string $nullAs = "\\\\N", ?string $fields = null): bool {}
+    public function pgsqlCopyFromArray(string $tableName, array | Traversable $rows, string $separator = "\t", string $nullAs = "\\\\N", ?string $fields = null): bool {}
 
     /** @tentative-return-type */
     public function pgsqlCopyFromFile(string $tableName, string $filename, string $separator = "\t", string $nullAs = "\\\\N", ?string $fields = null): bool {}
diff --git a/ext/pdo_pgsql/pgsql_driver_arginfo.h b/ext/pdo_pgsql/pgsql_driver_arginfo.h
index 5bdea01edc259..cd01e2e8e7160 100644
--- a/ext/pdo_pgsql/pgsql_driver_arginfo.h
+++ b/ext/pdo_pgsql/pgsql_driver_arginfo.h
@@ -1,9 +1,9 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: dd20abc5d8580d72b25bfb3c598b1ca54a501fcc */
+ * Stub hash: 30c01b4d2e7f836b81a31dc0c1a115883eb41568 */
 
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_PDO_PGSql_Ext_pgsqlCopyFromArray, 0, 2, _IS_BOOL, 0)
 	ZEND_ARG_TYPE_INFO(0, tableName, IS_STRING, 0)
-	ZEND_ARG_TYPE_INFO(0, rows, IS_ARRAY, 0)
+	ZEND_ARG_OBJ_TYPE_MASK(0, rows, Traversable, MAY_BE_ARRAY, NULL)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, separator, IS_STRING, 0, "\"\\t\"")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, nullAs, IS_STRING, 0, "\"\\\\\\\\N\"")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, fields, IS_STRING, 1, "null")
diff --git a/ext/pdo_pgsql/pgsql_statement.c b/ext/pdo_pgsql/pgsql_statement.c
index 55759133864fa..169fa49af4e14 100644
--- a/ext/pdo_pgsql/pgsql_statement.c
+++ b/ext/pdo_pgsql/pgsql_statement.c
@@ -56,14 +56,23 @@
 #define FLOAT8LABEL "float8"
 #define FLOAT8OID 701
 
+#define FIN_DISCARD 0x1
+#define FIN_CLOSE   0x2
+#define FIN_ABORT   0x4
 
 
-static int pgsql_stmt_dtor(pdo_stmt_t *stmt)
+
+static void pgsql_stmt_finish(pdo_pgsql_stmt *S, int fin_mode)
 {
-	pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
-	bool server_obj_usable = !Z_ISUNDEF(stmt->database_object_handle)
-		&& IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
-		&& !(OBJ_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED);
+	pdo_pgsql_db_handle *H = S->H;
+
+	if (S->is_running_unbuffered && S->result && (fin_mode & FIN_ABORT)) {
+		PGcancel *cancel = PQgetCancel(H->server);
+		char errbuf[256];
+		PQcancel(cancel, errbuf, 256);
+		PQfreeCancel(cancel);
+		S->is_running_unbuffered = false;
+	}
 
 	if (S->result) {
 		/* free the resource */
@@ -71,19 +80,55 @@ static int pgsql_stmt_dtor(pdo_stmt_t *stmt)
 		S->result = NULL;
 	}
 
-	if (S->stmt_name) {
-		if (S->is_prepared && server_obj_usable) {
-			pdo_pgsql_db_handle *H = S->H;
-			char *q = NULL;
-			PGresult *res;
+	if (S->is_running_unbuffered) {
+		/* https://postgresql.org/docs/current/libpq-async.html:
+		 * "PQsendQuery cannot be called again until PQgetResult has returned NULL"
+		 * And as all single-row functions are connection-wise instead of statement-wise,
+		 * any new single-row query has to make sure no preceding one is still running.
+		 */
+		// @todo Implement !(fin_mode & FIN_DISCARD)
+		//       instead of discarding results we could store them to their statement
+		//       so that their fetch() will get them (albeit not in lazy mode anymore).
+		while ((S->result = PQgetResult(H->server))) {
+			PQclear(S->result);
+			S->result = NULL;
+		}
+		S->is_running_unbuffered = false;
+	}
 
-			spprintf(&q, 0, "DEALLOCATE %s", S->stmt_name);
-			res = PQexec(H->server, q);
-			efree(q);
-			if (res) {
-				PQclear(res);
-			}
+	if (S->stmt_name && S->is_prepared && (fin_mode & FIN_CLOSE)) {
+		PGresult *res;
+#ifndef HAVE_PQCLOSEPREPARED
+		// TODO (??) libpq does not support close statement protocol < postgres 17
+		// check if we can circumvent this.
+		char *q = NULL;
+		spprintf(&q, 0, "DEALLOCATE %s", S->stmt_name);
+		res = PQexec(H->server, q);
+		efree(q);
+#else
+		res = PQclosePrepared(H->server, S->stmt_name);
+#endif
+		if (res) {
+			PQclear(res);
+		}
+
+		S->is_prepared = false;
+		if (H->running_stmt == S) {
+			H->running_stmt = NULL;
 		}
+	}
+}
+
+static int pgsql_stmt_dtor(pdo_stmt_t *stmt)
+{
+	pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
+	bool server_obj_usable = !Z_ISUNDEF(stmt->database_object_handle)
+		&& IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
+		&& !(OBJ_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED);
+
+	pgsql_stmt_finish(S, FIN_DISCARD|(server_obj_usable ? FIN_CLOSE|FIN_ABORT : 0));
+
+	if (S->stmt_name) {
 		efree(S->stmt_name);
 		S->stmt_name = NULL;
 	}
@@ -137,14 +182,20 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt)
 	pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
 	pdo_pgsql_db_handle *H = S->H;
 	ExecStatusType status;
+	int dispatch_result = 1;
 
 	bool in_trans = stmt->dbh->methods->in_transaction(stmt->dbh);
 
-	/* ensure that we free any previous unfetched results */
-	if(S->result) {
-		PQclear(S->result);
-		S->result = NULL;
+	/* in unbuffered mode, finish any running statement: libpq explicitely prohibits this
+	 * and returns a PGRES_FATAL_ERROR when PQgetResult gets called for stmt 2 if DEALLOCATE
+	 * was called for stmt 1 inbetween
+	 * (maybe it will change with pipeline mode in libpq 14?) */
+	if (S->is_unbuffered && H->running_stmt) {
+		pgsql_stmt_finish(H->running_stmt, FIN_CLOSE);
+		H->running_stmt = NULL;
 	}
+	/* ensure that we free any previous unfetched results */
+	pgsql_stmt_finish(S, 0);
 
 	S->current_row = 0;
 
@@ -193,6 +244,7 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt)
 					/* it worked */
 					S->is_prepared = 1;
 					PQclear(S->result);
+					S->result = NULL;
 					break;
 				default: {
 					char *sqlstate = pdo_pgsql_sqlstate(S->result);
@@ -203,10 +255,14 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt)
 					 * deallocate it and retry ONCE (thies 2005.12.15)
 					 */
 					if (sqlstate && !strcmp(sqlstate, "42P05")) {
-						char buf[100]; /* stmt_name == "pdo_crsr_%08x" */
 						PGresult *res;
+#ifndef HAVE_PQCLOSEPREPARED
+						char buf[100]; /* stmt_name == "pdo_crsr_%08x" */
 						snprintf(buf, sizeof(buf), "DEALLOCATE %s", S->stmt_name);
 						res = PQexec(H->server, buf);
+#else
+						res = PQclosePrepared(H->server, S->stmt_name);
+#endif
 						if (res) {
 							PQclear(res);
 						}
@@ -218,7 +274,17 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt)
 				}
 			}
 		}
-		S->result = PQexecPrepared(H->server, S->stmt_name,
+		if (S->is_unbuffered) {
+			dispatch_result = PQsendQueryPrepared(H->server, S->stmt_name,
+					stmt->bound_params ?
+						zend_hash_num_elements(stmt->bound_params) :
+						0,
+					(const char**)S->param_values,
+					S->param_lengths,
+					S->param_formats,
+					0);
+		} else {
+			S->result = PQexecPrepared(H->server, S->stmt_name,
 				stmt->bound_params ?
 					zend_hash_num_elements(stmt->bound_params) :
 					0,
@@ -226,22 +292,54 @@ static int pgsql_stmt_execute(pdo_stmt_t *stmt)
 				S->param_lengths,
 				S->param_formats,
 				0);
+		}
 	} else if (stmt->supports_placeholders == PDO_PLACEHOLDER_NAMED) {
 		/* execute query with parameters */
-		S->result = PQexecParams(H->server, ZSTR_VAL(S->query),
+		if (S->is_unbuffered) {
+			dispatch_result = PQsendQueryParams(H->server, ZSTR_VAL(S->query),
+					stmt->bound_params ? zend_hash_num_elements(stmt->bound_params) : 0,
+					S->param_types,
+					(const char**)S->param_values,
+					S->param_lengths,
+					S->param_formats,
+					0);
+		} else {
+			S->result = PQexecParams(H->server, ZSTR_VAL(S->query),
 				stmt->bound_params ? zend_hash_num_elements(stmt->bound_params) : 0,
 				S->param_types,
 				(const char**)S->param_values,
 				S->param_lengths,
 				S->param_formats,
 				0);
+		}
 	} else {
 		/* execute plain query (with embedded parameters) */
-		S->result = PQexec(H->server, ZSTR_VAL(stmt->active_query_string));
+		if (S->is_unbuffered) {
+			dispatch_result = PQsendQuery(H->server, ZSTR_VAL(stmt->active_query_string));
+		} else {
+			S->result = PQexec(H->server, ZSTR_VAL(stmt->active_query_string));
+		}
 	}
+
+	H->running_stmt = S;
+
+	if (S->is_unbuffered) {
+		if (!dispatch_result) {
+			pdo_pgsql_error_stmt(stmt, 0, NULL);
+			H->running_stmt = NULL;
+			return 0;
+		}
+		S->is_running_unbuffered = true;
+		(void)PQsetSingleRowMode(H->server);
+		/* no matter if it returns 0: PQ then transparently fallbacks to full result fetching */
+
+		/* try a first fetch to at least have column names and so on */
+		S->result = PQgetResult(S->H->server);
+	}
+
 	status = PQresultStatus(S->result);
 
-	if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK) {
+	if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK && status != PGRES_SINGLE_TUPLE) {
 		pdo_pgsql_error_stmt(stmt, status, pdo_pgsql_sqlstate(S->result));
 		return 0;
 	}
@@ -463,6 +561,34 @@ static int pgsql_stmt_fetch(pdo_stmt_t *stmt,
 			return 0;
 		}
 	} else {
+		if (S->is_running_unbuffered && S->current_row >= stmt->row_count) {
+			ExecStatusType status;
+
+			/* @todo in unbuffered mode, PQ allows multiple queries to be passed:
+			 *       column_count should be recomputed on each iteration */
+
+			if(S->result) {
+				PQclear(S->result);
+				S->result = NULL;
+			}
+
+			S->result = PQgetResult(S->H->server);
+			status = PQresultStatus(S->result);
+
+			if (status != PGRES_COMMAND_OK && status != PGRES_TUPLES_OK && status != PGRES_SINGLE_TUPLE) {
+				pdo_pgsql_error_stmt(stmt, status, pdo_pgsql_sqlstate(S->result));
+				return 0;
+			}
+
+			stmt->row_count = (zend_long)PQntuples(S->result);
+			S->current_row = 0;
+
+			if (!stmt->row_count) {
+				S->is_running_unbuffered = false;
+				/* libpq requires looping until getResult returns null */
+				pgsql_stmt_finish(S, 0);
+			}
+		}
 		if (S->current_row < stmt->row_count) {
 			S->current_row++;
 			return 1;
diff --git a/ext/pdo_pgsql/php_pdo_pgsql_int.h b/ext/pdo_pgsql/php_pdo_pgsql_int.h
index fc9f1664cc3d4..da77d01c61ec7 100644
--- a/ext/pdo_pgsql/php_pdo_pgsql_int.h
+++ b/ext/pdo_pgsql/php_pdo_pgsql_int.h
@@ -34,6 +34,8 @@ typedef struct {
 	char *errmsg;
 } pdo_pgsql_error_info;
 
+typedef struct pdo_pgsql_stmt pdo_pgsql_stmt;
+
 /* stuff we use in a pgsql database handle */
 typedef struct {
 	PGconn		*server;
@@ -49,13 +51,15 @@ typedef struct {
 	bool		disable_prepares;
 	HashTable       *lob_streams;
 	zend_fcall_info_cache *notice_callback;
+	bool		default_fetching_laziness;
+	pdo_pgsql_stmt  *running_stmt;
 } pdo_pgsql_db_handle;
 
 typedef struct {
 	Oid          pgsql_type;
 } pdo_pgsql_column;
 
-typedef struct {
+struct pdo_pgsql_stmt {
 	pdo_pgsql_db_handle     *H;
 	PGresult                *result;
 	pdo_pgsql_column        *cols;
@@ -68,7 +72,9 @@ typedef struct {
 	Oid *param_types;
 	int                     current_row;
 	bool is_prepared;
-} pdo_pgsql_stmt;
+	bool is_unbuffered;
+	bool is_running_unbuffered;
+};
 
 typedef struct {
 	Oid     oid;
diff --git a/ext/pdo_pgsql/tests/bug36727.phpt b/ext/pdo_pgsql/tests/bug36727.phpt
index c1902da213c9f..5da877a701d11 100644
--- a/ext/pdo_pgsql/tests/bug36727.phpt
+++ b/ext/pdo_pgsql/tests/bug36727.phpt
@@ -1,7 +1,6 @@
 --TEST--
 Bug #36727 (segfault in bindValue() when no parameters are defined)
 --EXTENSIONS--
-pdo
 pdo_pgsql
 --SKIPIF--
 
+--FILE--
+setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
+
+$db->exec('CREATE TABLE test_copy_from_generator (v int)');
+
+$generator = (function(){
+    $position = 0;
+    $values = [1, 1, 2, 3, 5];
+
+    while(isset($values[$position])){
+        yield $values[$position];
+        ++$position;
+    }
+})();
+
+
+$db->pgsqlCopyFromArray('test_copy_from_generator',$generator);
+
+$stmt = $db->query("select * from test_copy_from_generator order by 1");
+$result = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
+var_export($result);
+
+?>
+--CLEAN--
+query('DROP TABLE IF EXISTS test_copy_from_generator CASCADE');
+?>
+--EXPECT--
+array (
+  0 => 1,
+  1 => 1,
+  2 => 2,
+  3 => 3,
+  4 => 5,
+)
diff --git a/ext/pdo_pgsql/tests/copy_from_iterator.phpt b/ext/pdo_pgsql/tests/copy_from_iterator.phpt
new file mode 100644
index 0000000000000..b507af8914628
--- /dev/null
+++ b/ext/pdo_pgsql/tests/copy_from_iterator.phpt
@@ -0,0 +1,72 @@
+--TEST--
+PDO PgSQL pgsqlCopyFromArray using Iterator
+--EXTENSIONS--
+pdo_pgsql
+--SKIPIF--
+
+--FILE--
+setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
+
+$db->exec('CREATE TABLE test_copy_from_traversable (v int)');
+
+$iterator = new class implements Iterator{
+    private $position = 0;
+    private $values = [1, 1, 2, 3, 5];
+
+    public function rewind(): void {
+        $this->position = 0;
+    }
+
+    public function current(): int {
+        return $this->values[$this->position];
+    }
+
+    public function key(): int {
+        return $this->position;
+    }
+
+    public function next(): void {
+        ++$this->position;
+    }
+
+    public function valid(): bool {
+        return isset($this->values[$this->position]);
+    }
+};
+
+try {
+	$db->pgsqlCopyFromArray('test_copy_from_traversable',new stdClass());
+} catch (\TypeError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+
+$db->pgsqlCopyFromArray('test_copy_from_traversable',$iterator);
+
+$stmt = $db->query("select * from test_copy_from_traversable order by 1");
+$result = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
+var_export($result);
+
+?>
+--CLEAN--
+query('DROP TABLE IF EXISTS test_copy_from_traversable CASCADE');
+?>
+--EXPECT--
+PDO::pgsqlCopyFromArray(): Argument #2 ($rows) must be of type Traversable|array, stdClass given
+array (
+  0 => 1,
+  1 => 1,
+  2 => 2,
+  3 => 3,
+  4 => 5,
+)
diff --git a/ext/pdo_pgsql/tests/copy_to.phpt b/ext/pdo_pgsql/tests/copy_to.phpt
index add5cdd3a08e8..0f2d8cd7e9c7a 100644
--- a/ext/pdo_pgsql/tests/copy_to.phpt
+++ b/ext/pdo_pgsql/tests/copy_to.phpt
@@ -1,7 +1,6 @@
 --TEST--
 PDO PgSQL pgsqlCopyToArray and pgsqlCopyToFile
 --EXTENSIONS--
-pdo
 pdo_pgsql
 --SKIPIF--
 
+--FILE--
+setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
+
+// We need a dataset of several KB so that memory gain is significant.
+// See https://www.postgresql.org/message-id/1140652.1687950987%40sss.pgh.pa.us
+$pdo->exec("create temp table t (n int, t text)");
+$pdo->exec("insert into t values (0, 'original')");
+for ($i = -1; ++$i < 8;) {
+	$pdo->exec("insert into t select n + 1, 'non '||t from t");
+}
+
+$reqOf3 = 'select 79 n union all select 80 union all select 81';
+$reqOfBig = 'select * from t';
+
+function display($res)
+{
+	echo implode("\n", array_map(fn($row) => implode("\t", $row), $res))."\n";
+}
+
+echo "=== non regression ===\n";
+
+// libpq explicitely requires single-row-mode statements to run one at a time (one stmt must
+// be fully read, or aborted, before another one can be launched).
+// Ensure that integration does not break the ability of the traditional, prefetched mode,
+// to mix fetching of multiple statements' result.
+$stmt1 = $pdo->query($reqOf3);
+$stmt2 = $pdo->query("select * from ($reqOf3) t order by n desc");
+for ($i = -1; ++$i < 3;) {
+	display([ $stmt1->fetch() ]);
+	display([ $stmt2->fetch() ]);
+}
+
+echo "=== mem test ===\n";
+
+// First execute without lazy fetching, as a reference and non-regression;
+// execute twice: in case warmup reduces memory consumption, we want the stabilized consumption.
+for ($i = -1; ++$i < 5;) {
+	$attrs = [];
+	$lazy = false;
+	switch ($i) {
+		case 0:
+		case 3:
+			echo "Without lazy fetching:\n";
+			break;
+		case 2:
+			echo "With statement-scoped lazy fetching:\n";
+			$attrs = [ PDO::ATTR_PREFETCH => 0 ];
+			$lazy = true;
+			break;
+		case 4:
+			echo "With connection-scoped lazy fetching:\n";
+			$pdo->setAttribute(PDO::ATTR_PREFETCH, 0);
+			$lazy = true;
+			break;
+	}
+	$stmt = $pdo->prepare($reqOfBig, $attrs);
+	$stmt->execute();
+	$res = [];
+	// No fetchAll because we want the memory of the result of the FORElast call (the last one is empty).
+	while (($re = $stmt->fetch())) {
+		$res[] = $re;
+		// Memory introspection relies on an optionally-compiled constant.
+		if (defined('PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE')) {
+			$mem = $stmt->getAttribute(PDO::PGSQL_ATTR_RESULT_MEMORY_SIZE);
+		} else {
+			// If not there emulate a return value which validates our test.
+			$mem = $lazy ? 0 : 1;
+		}
+	}
+	echo "ResultSet is $mem bytes long\n";
+	if ($i >= 2) {
+		echo "ResultSet is " . ($mem > $mem0 ? "longer" : ($mem == $mem0 ? "not shorter" : ($mem <= $mem0 / 2 ? "more than twice shorter" : "a bit shorter"))) . " than without lazy fetching\n";
+	} else {
+		$mem0 = $mem;
+	}
+}
+
+$pdo->setAttribute(PDO::ATTR_PREFETCH, 0);
+
+foreach ([
+	[ 'query', 'fetch' ],
+	[ 'query', 'fetchAll' ],
+	[ 'prepare', 'fetch' ],
+	[ 'prepare', 'fetchAll' ],
+] as $mode) {
+	echo "=== with " . implode(' / ', $mode). " ===\n";
+	switch ($mode[0]) {
+		case 'query':
+			$stmt = $pdo->query($reqOf3);
+			break;
+		case 'prepare':
+			$stmt = $pdo->prepare($reqOf3);
+			$stmt->execute();
+			break;
+	}
+	switch ($mode[1]) {
+		case 'fetch':
+			$res = [];
+			while (($re = $stmt->fetch())) {
+				$res[] = $re;
+			}
+			break;
+		case 'fetchAll':
+			$res = $stmt->fetchAll();
+			break;
+	}
+	display($res);
+}
+echo "DML works too:\n";
+$pdo->exec("create temp table t2 as select 678 n, 'ok' status");
+echo "multiple calls to the same prepared statement, some interrupted before having read all results:\n";
+$stmt = $pdo->prepare("select :1 n union all select :1 + 1 union all select :1 + 2 union all select :1 + 3");
+$stmt->execute([ 32 ]);
+$res = []; for ($i = -1; ++$i < 2;) $res[] = $stmt->fetch(); display($res);
+$stmt->execute([ 15 ]);
+$res = []; while (($re = $stmt->fetch())) $res[] = $re; display($res);
+$stmt->execute([ 0 ]);
+$res = []; for ($i = -1; ++$i < 2;) $res[] = $stmt->fetch(); display($res);
+display($pdo->query("select * from t2")->fetchAll());
+?>
+--EXPECTF--
+=== non regression ===
+79
+81
+80
+80
+81
+79
+=== mem test ===
+Without lazy fetching:
+ResultSet is %d bytes long
+ResultSet is %d bytes long
+With statement-scoped lazy fetching:
+ResultSet is %d bytes long
+ResultSet is more than twice shorter than without lazy fetching
+Without lazy fetching:
+ResultSet is %d bytes long
+ResultSet is not shorter than without lazy fetching
+With connection-scoped lazy fetching:
+ResultSet is %d bytes long
+ResultSet is more than twice shorter than without lazy fetching
+=== with query / fetch ===
+79
+80
+81
+=== with query / fetchAll ===
+79
+80
+81
+=== with prepare / fetch ===
+79
+80
+81
+=== with prepare / fetchAll ===
+79
+80
+81
+DML works too:
+multiple calls to the same prepared statement, some interrupted before having read all results:
+32
+33
+15
+16
+17
+18
+0
+1
+678	ok
diff --git a/ext/pdo_pgsql/tests/gh7723.phpt b/ext/pdo_pgsql/tests/gh7723.phpt
index 5ba265fc68d39..c0bed3b7c1461 100644
--- a/ext/pdo_pgsql/tests/gh7723.phpt
+++ b/ext/pdo_pgsql/tests/gh7723.phpt
@@ -1,7 +1,6 @@
 --TEST--
 GitHub #7723 (Fix error message allocation of PDO PgSQL)
 --EXTENSIONS--
-pdo
 pdo_pgsql
 --SKIPIF--
  0 && ZSTR_VAL(zquery)[ZSTR_LEN(tmp)]  != '\n') {
+		ZSTR_VAL(zquery)[ZSTR_LEN(tmp)] = '\n';
+		ZSTR_LEN(zquery) ++;
+	}
+	if (PQputCopyData(pgsql, ZSTR_VAL(zquery), ZSTR_LEN(zquery)) != 1) {
+		zend_string_release_ex(zquery, false);
+		zend_string_release(tmp);
+		return FAILURE;
+	}
+	zend_string_release_ex(zquery, false);
+	zend_string_release(tmp);
+	return SUCCESS;
+}
+
 /* {{{ Copy table from array */
 PHP_FUNCTION(pg_copy_from)
 {
@@ -3376,7 +3400,7 @@ PHP_FUNCTION(pg_copy_from)
 	ZEND_PARSE_PARAMETERS_START(3, 5)
 		Z_PARAM_OBJECT_OF_CLASS(pgsql_link, pgsql_link_ce)
 		Z_PARAM_PATH_STR(table_name)
-		Z_PARAM_ARRAY(pg_rows)
+		Z_PARAM_ITERABLE(pg_rows)
 		Z_PARAM_OPTIONAL
 		Z_PARAM_STR(pg_delimiter)
 		Z_PARAM_STRING(pg_null_as, pg_null_as_len)
@@ -3417,30 +3441,36 @@ PHP_FUNCTION(pg_copy_from)
 	switch (status) {
 		case PGRES_COPY_IN:
 			if (pgsql_result) {
-				int command_failed = 0;
 				PQclear(pgsql_result);
-				ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pg_rows), value) {
-					zend_string *tmp = zval_try_get_string(value);
-					if (UNEXPECTED(!tmp)) {
-						return;
-					}
-					zend_string *zquery = zend_string_alloc(ZSTR_LEN(tmp) + 1, false);
-					memcpy(ZSTR_VAL(zquery), ZSTR_VAL(tmp), ZSTR_LEN(tmp) + 1);
-					ZSTR_LEN(zquery) = ZSTR_LEN(tmp);
-					if (ZSTR_LEN(tmp) > 0 && ZSTR_VAL(zquery)[ZSTR_LEN(tmp)]  != '\n') {
-						ZSTR_VAL(zquery)[ZSTR_LEN(tmp)] = '\n';
-						ZSTR_LEN(zquery) ++;
+				bool command_failed = false;
+				if (Z_TYPE_P(pg_rows) == IS_ARRAY) {
+					ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pg_rows), value) {
+						if (pgsql_copy_from_query(pgsql, pgsql_result, value) == FAILURE) {
+							PHP_PQ_ERROR("copy failed: %s", pgsql);
+							RETURN_FALSE;
+						}
+					} ZEND_HASH_FOREACH_END();
+				} else {
+					zend_object_iterator *iter = Z_OBJCE_P(pg_rows)->get_iterator(Z_OBJCE_P(pg_rows), pg_rows, 0);
+					if (UNEXPECTED(EG(exception) || iter == NULL)) {
+						RETURN_THROWS();
 					}
-					if (PQputCopyData(pgsql, ZSTR_VAL(zquery), ZSTR_LEN(zquery)) != 1) {
-						zend_string_release_ex(zquery, false);
-						zend_string_release(tmp);
-						PHP_PQ_ERROR("copy failed: %s", pgsql);
-						RETURN_FALSE;
+
+					if (iter->funcs->rewind) {
+						iter->funcs->rewind(iter);
 					}
-					zend_string_release_ex(zquery, false);
-					zend_string_release(tmp);
-				} ZEND_HASH_FOREACH_END();
 
+					while (iter->funcs->valid(iter) == SUCCESS && EG(exception) == NULL) {
+						zval *value = iter->funcs->get_current_data(iter);
+						if (pgsql_copy_from_query(pgsql, pgsql_result, value) == FAILURE) {
+							zend_iterator_dtor(iter);
+							PHP_PQ_ERROR("copy failed: %s", pgsql);
+							RETURN_FALSE;
+						}
+						iter->funcs->move_forward(iter);
+					}
+					zend_iterator_dtor(iter);
+				}
 				if (PQputCopyEnd(pgsql, NULL) != 1) {
 					PHP_PQ_ERROR("putcopyend failed: %s", pgsql);
 					RETURN_FALSE;
@@ -3448,7 +3478,7 @@ PHP_FUNCTION(pg_copy_from)
 				while ((pgsql_result = PQgetResult(pgsql))) {
 					if (PGRES_COMMAND_OK != PQresultStatus(pgsql_result)) {
 						PHP_PQ_ERROR("Copy command failed: %s", pgsql);
-						command_failed = 1;
+						command_failed = true;
 					}
 					PQclear(pgsql_result);
 				}
@@ -6256,3 +6286,39 @@ PHP_FUNCTION(pg_set_chunked_rows_size)
 	RETURN_BOOL(PQsetChunkedRowsMode(link->conn, (int)size) == 1);
 }
 #endif
+
+#if defined(HAVE_PG_CLOSE_STMT)
+PHP_FUNCTION(pg_close_stmt)
+{
+	zval *pgsql_link;
+	pgsql_link_handle *link;
+	PGresult *pgsql_result;
+	zend_string *stmt;
+
+	ZEND_PARSE_PARAMETERS_START(2, 2)
+		Z_PARAM_OBJECT_OF_CLASS(pgsql_link, pgsql_link_ce)
+		Z_PARAM_STR(stmt)
+	ZEND_PARSE_PARAMETERS_END();
+
+	if (ZSTR_LEN(stmt) == 0) {
+		zend_argument_value_error(2, "cannot be empty");
+		RETURN_THROWS();
+	}
+
+	link = Z_PGSQL_LINK_P(pgsql_link);
+	CHECK_PGSQL_LINK(link);
+
+	pgsql_result = PQclosePrepared(link->conn, ZSTR_VAL(stmt));
+
+	if (PQresultStatus(pgsql_result) != PGRES_COMMAND_OK) {
+		RETURN_FALSE;
+	} else {
+		pgsql_result_handle *pg_handle;
+		object_init_ex(return_value, pgsql_result_ce);
+		pg_handle = Z_PGSQL_RESULT_P(return_value);
+		pg_handle->conn = link->conn;
+		pg_handle->result = pgsql_result;
+		pg_handle->row = 0;
+	}
+}
+#endif
diff --git a/ext/pgsql/pgsql.stub.php b/ext/pgsql/pgsql.stub.php
index f507de2e062a2..5da341b20ad52 100644
--- a/ext/pgsql/pgsql.stub.php
+++ b/ext/pgsql/pgsql.stub.php
@@ -847,7 +847,7 @@ function pg_put_line($connection, string $query = UNKNOWN): bool {}
      */
     function pg_copy_to(PgSql\Connection $connection, string $table_name, string $separator = "\t", string $null_as = "\\\\N"): array|false {}
 
-    function pg_copy_from(PgSql\Connection $connection, string $table_name, array $rows, string $separator = "\t", string $null_as = "\\\\N"): bool {}
+    function pg_copy_from(PgSql\Connection $connection, string $table_name, array|Traversable $rows, string $separator = "\t", string $null_as = "\\\\N"): bool {}
 
     /**
      * @param PgSql\Connection|string $connection
@@ -970,6 +970,9 @@ function pg_socket_poll($socket, int $read, int $write, int $timeout = -1): int
 #ifdef HAVE_PG_SET_CHUNKED_ROWS_SIZE
     function pg_set_chunked_rows_size(Pgsql\Connection $connection, int $size): bool {}
 #endif
+#ifdef HAVE_PG_CLOSE_STMT
+    function pg_close_stmt(Pgsql\Connection $connection, string $statement_name): Pgsql\Result|false {}
+#endif
 }
 
 namespace PgSql {
diff --git a/ext/pgsql/pgsql_arginfo.h b/ext/pgsql/pgsql_arginfo.h
index 9d9f772afc38d..52012afee070e 100644
--- a/ext/pgsql/pgsql_arginfo.h
+++ b/ext/pgsql/pgsql_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 0b89a48c27c6682542312391f10a3ab8fb719ef8 */
+ * Stub hash: 824e5aa07fd6753b5bc7821a39ccb76768f2470b */
 
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pg_connect, 0, 1, PgSql\\Connection, MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, connection_string, IS_STRING, 0)
@@ -318,7 +318,7 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pg_copy_from, 0, 3, _IS_BOOL, 0)
 	ZEND_ARG_OBJ_INFO(0, connection, PgSql\\Connection, 0)
 	ZEND_ARG_TYPE_INFO(0, table_name, IS_STRING, 0)
-	ZEND_ARG_TYPE_INFO(0, rows, IS_ARRAY, 0)
+	ZEND_ARG_OBJ_TYPE_MASK(0, rows, Traversable, MAY_BE_ARRAY, NULL)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, separator, IS_STRING, 0, "\"\\t\"")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, null_as, IS_STRING, 0, "\"\\\\\\\\N\"")
 ZEND_END_ARG_INFO()
@@ -495,6 +495,13 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_pg_set_chunked_rows_size, 0, 2,
 ZEND_END_ARG_INFO()
 #endif
 
+#if defined(HAVE_PG_CLOSE_STMT)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_pg_close_stmt, 0, 2, Pgsql\\Result, MAY_BE_FALSE)
+	ZEND_ARG_OBJ_INFO(0, connection, Pgsql\\Connection, 0)
+	ZEND_ARG_TYPE_INFO(0, statement_name, IS_STRING, 0)
+ZEND_END_ARG_INFO()
+#endif
+
 ZEND_FUNCTION(pg_connect);
 ZEND_FUNCTION(pg_pconnect);
 ZEND_FUNCTION(pg_connect_poll);
@@ -598,6 +605,9 @@ ZEND_FUNCTION(pg_socket_poll);
 #if defined(HAVE_PG_SET_CHUNKED_ROWS_SIZE)
 ZEND_FUNCTION(pg_set_chunked_rows_size);
 #endif
+#if defined(HAVE_PG_CLOSE_STMT)
+ZEND_FUNCTION(pg_close_stmt);
+#endif
 
 static const zend_function_entry ext_functions[] = {
 	ZEND_FE(pg_connect, arginfo_pg_connect)
@@ -725,6 +735,9 @@ static const zend_function_entry ext_functions[] = {
 	ZEND_FE(pg_socket_poll, arginfo_pg_socket_poll)
 #if defined(HAVE_PG_SET_CHUNKED_ROWS_SIZE)
 	ZEND_FE(pg_set_chunked_rows_size, arginfo_pg_set_chunked_rows_size)
+#endif
+#if defined(HAVE_PG_CLOSE_STMT)
+	ZEND_FE(pg_close_stmt, arginfo_pg_close_stmt)
 #endif
 	ZEND_FE_END
 };
@@ -839,7 +852,7 @@ static void register_pgsql_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("PGSQL_SHOW_CONTEXT_ALWAYS", PQSHOW_CONTEXT_ALWAYS, CONST_PERSISTENT);
 
 
-	zend_attribute *attribute_Deprecated_func_pg_errormessage_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_errormessage", sizeof("pg_errormessage") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_errormessage_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_errormessage", sizeof("pg_errormessage") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_errormessage_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_errormessage_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_errormessage_0_arg0, attribute_Deprecated_func_pg_errormessage_0_arg0_str);
@@ -851,7 +864,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_errormessage_0->args[1].value, &attribute_Deprecated_func_pg_errormessage_0_arg1);
 	attribute_Deprecated_func_pg_errormessage_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_numrows_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_numrows", sizeof("pg_numrows") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_numrows_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_numrows", sizeof("pg_numrows") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_numrows_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_numrows_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_numrows_0_arg0, attribute_Deprecated_func_pg_numrows_0_arg0_str);
@@ -863,7 +876,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_numrows_0->args[1].value, &attribute_Deprecated_func_pg_numrows_0_arg1);
 	attribute_Deprecated_func_pg_numrows_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_numfields_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_numfields", sizeof("pg_numfields") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_numfields_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_numfields", sizeof("pg_numfields") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_numfields_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_numfields_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_numfields_0_arg0, attribute_Deprecated_func_pg_numfields_0_arg0_str);
@@ -875,7 +888,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_numfields_0->args[1].value, &attribute_Deprecated_func_pg_numfields_0_arg1);
 	attribute_Deprecated_func_pg_numfields_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_cmdtuples_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_cmdtuples", sizeof("pg_cmdtuples") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_cmdtuples_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_cmdtuples", sizeof("pg_cmdtuples") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_cmdtuples_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_cmdtuples_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_cmdtuples_0_arg0, attribute_Deprecated_func_pg_cmdtuples_0_arg0_str);
@@ -887,7 +900,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_cmdtuples_0->args[1].value, &attribute_Deprecated_func_pg_cmdtuples_0_arg1);
 	attribute_Deprecated_func_pg_cmdtuples_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_fieldname_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldname", sizeof("pg_fieldname") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_fieldname_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldname", sizeof("pg_fieldname") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_fieldname_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_fieldname_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_fieldname_0_arg0, attribute_Deprecated_func_pg_fieldname_0_arg0_str);
@@ -899,7 +912,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_fieldname_0->args[1].value, &attribute_Deprecated_func_pg_fieldname_0_arg1);
 	attribute_Deprecated_func_pg_fieldname_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_fieldsize_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldsize", sizeof("pg_fieldsize") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_fieldsize_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldsize", sizeof("pg_fieldsize") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_fieldsize_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_fieldsize_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_fieldsize_0_arg0, attribute_Deprecated_func_pg_fieldsize_0_arg0_str);
@@ -911,7 +924,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_fieldsize_0->args[1].value, &attribute_Deprecated_func_pg_fieldsize_0_arg1);
 	attribute_Deprecated_func_pg_fieldsize_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_fieldtype_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldtype", sizeof("pg_fieldtype") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_fieldtype_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldtype", sizeof("pg_fieldtype") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_fieldtype_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_fieldtype_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_fieldtype_0_arg0, attribute_Deprecated_func_pg_fieldtype_0_arg0_str);
@@ -923,7 +936,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_fieldtype_0->args[1].value, &attribute_Deprecated_func_pg_fieldtype_0_arg1);
 	attribute_Deprecated_func_pg_fieldtype_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_fieldnum_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldnum", sizeof("pg_fieldnum") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_fieldnum_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldnum", sizeof("pg_fieldnum") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_fieldnum_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_fieldnum_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_fieldnum_0_arg0, attribute_Deprecated_func_pg_fieldnum_0_arg0_str);
@@ -935,7 +948,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_fieldnum_0->args[1].value, &attribute_Deprecated_func_pg_fieldnum_0_arg1);
 	attribute_Deprecated_func_pg_fieldnum_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_result_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_result", sizeof("pg_result") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_result_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_result", sizeof("pg_result") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_result_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_result_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_result_0_arg0, attribute_Deprecated_func_pg_result_0_arg0_str);
@@ -947,7 +960,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_result_0->args[1].value, &attribute_Deprecated_func_pg_result_0_arg1);
 	attribute_Deprecated_func_pg_result_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_fieldprtlen_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldprtlen", sizeof("pg_fieldprtlen") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_fieldprtlen_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldprtlen", sizeof("pg_fieldprtlen") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_fieldprtlen_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_fieldprtlen_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_fieldprtlen_0_arg0, attribute_Deprecated_func_pg_fieldprtlen_0_arg0_str);
@@ -959,7 +972,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_fieldprtlen_0->args[1].value, &attribute_Deprecated_func_pg_fieldprtlen_0_arg1);
 	attribute_Deprecated_func_pg_fieldprtlen_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_fieldisnull_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldisnull", sizeof("pg_fieldisnull") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_fieldisnull_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_fieldisnull", sizeof("pg_fieldisnull") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_fieldisnull_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_fieldisnull_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_fieldisnull_0_arg0, attribute_Deprecated_func_pg_fieldisnull_0_arg0_str);
@@ -971,7 +984,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_fieldisnull_0->args[1].value, &attribute_Deprecated_func_pg_fieldisnull_0_arg1);
 	attribute_Deprecated_func_pg_fieldisnull_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_freeresult_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_freeresult", sizeof("pg_freeresult") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_freeresult_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_freeresult", sizeof("pg_freeresult") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_freeresult_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_freeresult_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_freeresult_0_arg0, attribute_Deprecated_func_pg_freeresult_0_arg0_str);
@@ -983,7 +996,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_freeresult_0->args[1].value, &attribute_Deprecated_func_pg_freeresult_0_arg1);
 	attribute_Deprecated_func_pg_freeresult_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_getlastoid_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_getlastoid", sizeof("pg_getlastoid") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_getlastoid_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_getlastoid", sizeof("pg_getlastoid") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_getlastoid_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_getlastoid_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_getlastoid_0_arg0, attribute_Deprecated_func_pg_getlastoid_0_arg0_str);
@@ -995,7 +1008,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_getlastoid_0->args[1].value, &attribute_Deprecated_func_pg_getlastoid_0_arg1);
 	attribute_Deprecated_func_pg_getlastoid_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_locreate_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_locreate", sizeof("pg_locreate") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_locreate_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_locreate", sizeof("pg_locreate") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_locreate_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_locreate_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_locreate_0_arg0, attribute_Deprecated_func_pg_locreate_0_arg0_str);
@@ -1007,7 +1020,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_locreate_0->args[1].value, &attribute_Deprecated_func_pg_locreate_0_arg1);
 	attribute_Deprecated_func_pg_locreate_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_lounlink_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_lounlink", sizeof("pg_lounlink") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_lounlink_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_lounlink", sizeof("pg_lounlink") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_lounlink_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_lounlink_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_lounlink_0_arg0, attribute_Deprecated_func_pg_lounlink_0_arg0_str);
@@ -1019,7 +1032,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_lounlink_0->args[1].value, &attribute_Deprecated_func_pg_lounlink_0_arg1);
 	attribute_Deprecated_func_pg_lounlink_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_loopen_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loopen", sizeof("pg_loopen") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_loopen_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loopen", sizeof("pg_loopen") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_loopen_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_loopen_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_loopen_0_arg0, attribute_Deprecated_func_pg_loopen_0_arg0_str);
@@ -1031,7 +1044,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_loopen_0->args[1].value, &attribute_Deprecated_func_pg_loopen_0_arg1);
 	attribute_Deprecated_func_pg_loopen_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_loclose_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loclose", sizeof("pg_loclose") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_loclose_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loclose", sizeof("pg_loclose") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_loclose_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_loclose_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_loclose_0_arg0, attribute_Deprecated_func_pg_loclose_0_arg0_str);
@@ -1043,7 +1056,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_loclose_0->args[1].value, &attribute_Deprecated_func_pg_loclose_0_arg1);
 	attribute_Deprecated_func_pg_loclose_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_loread_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loread", sizeof("pg_loread") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_loread_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loread", sizeof("pg_loread") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_loread_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_loread_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_loread_0_arg0, attribute_Deprecated_func_pg_loread_0_arg0_str);
@@ -1055,7 +1068,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_loread_0->args[1].value, &attribute_Deprecated_func_pg_loread_0_arg1);
 	attribute_Deprecated_func_pg_loread_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_lowrite_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_lowrite", sizeof("pg_lowrite") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_lowrite_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_lowrite", sizeof("pg_lowrite") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_lowrite_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_lowrite_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_lowrite_0_arg0, attribute_Deprecated_func_pg_lowrite_0_arg0_str);
@@ -1067,7 +1080,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_lowrite_0->args[1].value, &attribute_Deprecated_func_pg_lowrite_0_arg1);
 	attribute_Deprecated_func_pg_lowrite_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_loreadall_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loreadall", sizeof("pg_loreadall") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_loreadall_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loreadall", sizeof("pg_loreadall") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_loreadall_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_loreadall_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_loreadall_0_arg0, attribute_Deprecated_func_pg_loreadall_0_arg0_str);
@@ -1079,7 +1092,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_loreadall_0->args[1].value, &attribute_Deprecated_func_pg_loreadall_0_arg1);
 	attribute_Deprecated_func_pg_loreadall_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_loimport_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loimport", sizeof("pg_loimport") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_loimport_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loimport", sizeof("pg_loimport") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_loimport_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_loimport_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_loimport_0_arg0, attribute_Deprecated_func_pg_loimport_0_arg0_str);
@@ -1091,7 +1104,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_loimport_0->args[1].value, &attribute_Deprecated_func_pg_loimport_0_arg1);
 	attribute_Deprecated_func_pg_loimport_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_loexport_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loexport", sizeof("pg_loexport") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_loexport_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_loexport", sizeof("pg_loexport") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_loexport_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_loexport_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_loexport_0_arg0, attribute_Deprecated_func_pg_loexport_0_arg0_str);
@@ -1103,7 +1116,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_loexport_0->args[1].value, &attribute_Deprecated_func_pg_loexport_0_arg1);
 	attribute_Deprecated_func_pg_loexport_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_setclientencoding_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_setclientencoding", sizeof("pg_setclientencoding") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_setclientencoding_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_setclientencoding", sizeof("pg_setclientencoding") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_setclientencoding_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_setclientencoding_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_setclientencoding_0_arg0, attribute_Deprecated_func_pg_setclientencoding_0_arg0_str);
@@ -1115,7 +1128,7 @@ static void register_pgsql_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_pg_setclientencoding_0->args[1].value, &attribute_Deprecated_func_pg_setclientencoding_0_arg1);
 	attribute_Deprecated_func_pg_setclientencoding_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_pg_clientencoding_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_clientencoding", sizeof("pg_clientencoding") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_pg_clientencoding_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "pg_clientencoding", sizeof("pg_clientencoding") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_pg_clientencoding_0_arg0;
 	zend_string *attribute_Deprecated_func_pg_clientencoding_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_pg_clientencoding_0_arg0, attribute_Deprecated_func_pg_clientencoding_0_arg0_str);
diff --git a/ext/pgsql/tests/pg_close_stmt.phpt b/ext/pgsql/tests/pg_close_stmt.phpt
new file mode 100644
index 0000000000000..e93108c1e7a22
--- /dev/null
+++ b/ext/pgsql/tests/pg_close_stmt.phpt
@@ -0,0 +1,33 @@
+--TEST--
+PostgreSQL pg_close_stmt
+--EXTENSIONS--
+pgsql
+--SKIPIF--
+
+--FILE--
+
+--EXPECT--
+bool(true)
+bool(true)
diff --git a/ext/pgsql/tests/pg_copy_from_iterable.phpt b/ext/pgsql/tests/pg_copy_from_iterable.phpt
new file mode 100644
index 0000000000000..aadde2549a811
--- /dev/null
+++ b/ext/pgsql/tests/pg_copy_from_iterable.phpt
@@ -0,0 +1,62 @@
+--TEST--
+pg_copy_from with an iterable
+--EXTENSIONS--
+pgsql
+--SKIPIF--
+
+--FILE--
+count;
+	}
+
+	public function rewind(): void {
+		$this->count = 0;
+	}
+
+	public function current(): int {
+		return $this->values[$this->count];
+	}
+
+	public function key(): int {
+		return $this->count;
+	}
+
+	public function valid(): bool {
+		return $this->count < count($this->values);
+	}
+};
+
+try {
+	pg_copy_from($db, $table_name, new stdClass());
+} catch (\TypeError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+var_dump(pg_copy_from($db, $table_name, $iter));
+$res = pg_query($db, "SELECT FROM {$table_name}");
+var_dump(count(pg_fetch_all($res)) == 3);
+
+?>
+--CLEAN--
+
+--EXPECT--
+pg_copy_from(): Argument #3 ($rows) must be of type Traversable|array, stdClass given
+bool(true)
+bool(true)
diff --git a/ext/phar/config.m4 b/ext/phar/config.m4
index 66b4b318e92ae..8369473097ad1 100644
--- a/ext/phar/config.m4
+++ b/ext/phar/config.m4
@@ -32,8 +32,6 @@ if test "$PHP_PHAR" != "no"; then
   PHP_ADD_EXTENSION_DEP(phar, spl)
   PHP_ADD_MAKEFILE_FRAGMENT
 
-  PHP_INSTALL_HEADERS([ext/phar], [php_phar.h])
-
   AC_CONFIG_FILES([
     $ext_dir/phar.1
     $ext_dir/phar.phar.1
diff --git a/ext/phar/config.w32 b/ext/phar/config.w32
index 3f935eab235f3..c9d04acaf52d7 100644
--- a/ext/phar/config.w32
+++ b/ext/phar/config.w32
@@ -36,7 +36,6 @@ if (PHP_PHAR != "no") {
 	}
 	ADD_EXTENSION_DEP('phar', 'hash');
 	ADD_EXTENSION_DEP('phar', 'spl');
-	PHP_INSTALL_HEADERS("ext/phar", "php_phar.h");
 
 	ADD_MAKEFILE_FRAGMENT();
 }
diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c
index 41f45bd17f185..7e464a2024369 100644
--- a/ext/phar/dirstream.c
+++ b/ext/phar/dirstream.c
@@ -134,22 +134,6 @@ static int phar_dir_flush(php_stream *stream) /* {{{ */
 }
 /* }}} */
 
-/**
- * add an empty element with a char * key to a hash table, avoiding duplicates
- *
- * This is used to get a unique listing of virtual directories within a phar,
- * for iterating over opendir()ed phar directories.
- */
-static int phar_add_empty(HashTable *ht, char *arKey, uint32_t nKeyLength)  /* {{{ */
-{
-	zval dummy;
-
-	ZVAL_NULL(&dummy);
-	zend_hash_str_update(ht, arKey, nKeyLength, &dummy);
-	return SUCCESS;
-}
-/* }}} */
-
 /**
  * Used for sorting directories alphabetically
  */
@@ -166,14 +150,10 @@ static int phar_compare_dir_name(Bucket *f, Bucket *s)  /* {{{ */
  * files in a phar and retrieving its relative path.  From this, construct
  * a list of files/directories that are "in" the directory represented by dir
  */
-static php_stream *phar_make_dirstream(char *dir, HashTable *manifest) /* {{{ */
+static php_stream *phar_make_dirstream(const char *dir, size_t dirlen, const HashTable *manifest) /* {{{ */
 {
 	HashTable *data;
-	size_t dirlen = strlen(dir);
-	char *entry, *found, *save;
-	zend_string *str_key;
-	size_t keylen;
-	zend_ulong unused;
+	char *entry;
 
 	ALLOC_HASHTABLE(data);
 	zend_hash_init(data, 64, NULL, NULL, 0);
@@ -181,103 +161,86 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest) /* {{{ */
 	if ((*dir == '/' && dirlen == 1 && (manifest->nNumOfElements == 0)) || (dirlen >= sizeof(".phar")-1 && !memcmp(dir, ".phar", sizeof(".phar")-1))) {
 		/* make empty root directory for empty phar */
 		/* make empty directory for .phar magic directory */
-		efree(dir);
 		return php_stream_alloc(&phar_dir_ops, data, NULL, "r");
 	}
 
-	zend_hash_internal_pointer_reset(manifest);
-
-	while (FAILURE != zend_hash_has_more_elements(manifest)) {
-		if (HASH_KEY_NON_EXISTENT == zend_hash_get_current_key(manifest, &str_key, &unused)) {
-			break;
-		}
-
-		keylen = ZSTR_LEN(str_key);
+	zend_string *str_key;
+	ZEND_HASH_MAP_FOREACH_STR_KEY(manifest, str_key) {
+		size_t keylen = ZSTR_LEN(str_key);
 		if (keylen <= dirlen) {
 			if (keylen == 0 || keylen < dirlen || !strncmp(ZSTR_VAL(str_key), dir, dirlen)) {
-				if (SUCCESS != zend_hash_move_forward(manifest)) {
-					break;
-				}
 				continue;
 			}
 		}
 
 		if (*dir == '/') {
 			/* root directory */
-			if (keylen >= sizeof(".phar")-1 && !memcmp(ZSTR_VAL(str_key), ".phar", sizeof(".phar")-1)) {
+			if (zend_string_starts_with_literal(str_key, ".phar")) {
 				/* do not add any magic entries to this directory */
-				if (SUCCESS != zend_hash_move_forward(manifest)) {
-					break;
-				}
 				continue;
 			}
 
-			if (NULL != (found = (char *) memchr(ZSTR_VAL(str_key), '/', keylen))) {
+			const char *has_slash = memchr(ZSTR_VAL(str_key), '/', keylen);
+			if (has_slash) {
 				/* the entry has a path separator and is a subdirectory */
-				entry = (char *) safe_emalloc(found - ZSTR_VAL(str_key), 1, 1);
-				memcpy(entry, ZSTR_VAL(str_key), found - ZSTR_VAL(str_key));
-				keylen = found - ZSTR_VAL(str_key);
-				entry[keylen] = '\0';
-			} else {
-				entry = (char *) safe_emalloc(keylen, 1, 1);
-				memcpy(entry, ZSTR_VAL(str_key), keylen);
-				entry[keylen] = '\0';
+				keylen = has_slash - ZSTR_VAL(str_key);
 			}
+			entry = safe_emalloc(keylen, 1, 1);
+			memcpy(entry, ZSTR_VAL(str_key), keylen);
+			entry[keylen] = '\0';
 
 			goto PHAR_ADD_ENTRY;
 		} else {
 			if (0 != memcmp(ZSTR_VAL(str_key), dir, dirlen)) {
 				/* entry in directory not found */
-				if (SUCCESS != zend_hash_move_forward(manifest)) {
-					break;
-				}
 				continue;
 			} else {
 				if (ZSTR_VAL(str_key)[dirlen] != '/') {
-					if (SUCCESS != zend_hash_move_forward(manifest)) {
-						break;
-					}
 					continue;
 				}
 			}
 		}
 
-		save = ZSTR_VAL(str_key);
+		const char *save = ZSTR_VAL(str_key);
 		save += dirlen + 1; /* seek to just past the path separator */
 
-		if (NULL != (found = (char *) memchr(save, '/', keylen - dirlen - 1))) {
+		const char *has_slash = memchr(save, '/', keylen - dirlen - 1);
+		if (has_slash) {
 			/* is subdirectory */
 			save -= dirlen + 1;
-			entry = (char *) safe_emalloc(found - save + dirlen, 1, 1);
-			memcpy(entry, save + dirlen + 1, found - save - dirlen - 1);
-			keylen = found - 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';
 		} else {
 			/* is file */
 			save -= dirlen + 1;
-			entry = (char *) safe_emalloc(keylen - dirlen, 1, 1);
+			entry = safe_emalloc(keylen - dirlen, 1, 1);
 			memcpy(entry, save + dirlen + 1, keylen - dirlen - 1);
 			entry[keylen - dirlen - 1] = '\0';
 			keylen = keylen - dirlen - 1;
 		}
 PHAR_ADD_ENTRY:
 		if (keylen) {
-			phar_add_empty(data, entry, keylen);
+			/**
+			 * Add an empty element to avoid duplicates
+			 *
+			 * This is used to get a unique listing of virtual directories within a phar,
+			 * for iterating over opendir()ed phar directories.
+			 */
+			zval dummy;
+
+			ZVAL_NULL(&dummy);
+			zend_hash_str_update(data, entry, keylen, &dummy);
 		}
 
 		efree(entry);
-
-		if (SUCCESS != zend_hash_move_forward(manifest)) {
-			break;
-		}
-	}
+	} ZEND_HASH_FOREACH_END();
 
 	if (FAILURE != zend_hash_has_more_elements(data)) {
-		efree(dir);
 		zend_hash_sort(data, phar_compare_dir_name, 0);
 		return php_stream_alloc(&phar_dir_ops, data, NULL, "r");
 	} else {
-		efree(dir);
 		return php_stream_alloc(&phar_dir_ops, data, NULL, "r");
 	}
 }
@@ -289,12 +252,8 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest) /* {{{ */
 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;
-	php_stream *ret;
-	char *internal_file, *error;
-	zend_string *str_key;
-	zend_ulong unused;
+	char *error;
 	phar_archive_data *phar;
-	phar_entry_info *entry = NULL;
 
 	if ((resource = phar_parse_url(wrapper, path, mode, options)) == NULL) {
 		php_stream_wrapper_log_error(wrapper, options, "phar url \"%s\" is unknown", path);
@@ -319,11 +278,9 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path,
 		return NULL;
 	}
 
-	size_t host_len = ZSTR_LEN(resource->host);
 	phar_request_initialize();
-	internal_file = ZSTR_VAL(resource->path) + 1; /* strip leading "/" */
 
-	if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), host_len, NULL, 0, &error)) {
+	if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, &error)) {
 		if (error) {
 			php_stream_wrapper_log_error(wrapper, options, "%s", error);
 			efree(error);
@@ -338,12 +295,10 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path,
 		efree(error);
 	}
 
-	if (*internal_file == '\0') {
+	if (zend_string_equals(resource->path, ZSTR_CHAR('/'))) {
 		/* root directory requested */
-		internal_file = estrndup(internal_file - 1, 1);
-		ret = phar_make_dirstream(internal_file, &phar->manifest);
 		php_url_free(resource);
-		return ret;
+		return phar_make_dirstream("/", strlen("/"), &phar->manifest);
 	}
 
 	if (!HT_IS_INITIALIZED(&phar->manifest)) {
@@ -351,38 +306,35 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, const char *path,
 		return NULL;
 	}
 
-	if (NULL != (entry = zend_hash_str_find_ptr(&phar->manifest, internal_file, strlen(internal_file))) && !entry->is_dir) {
+	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);
+	php_stream *ret;
+
+	if (NULL != entry && !entry->is_dir) {
 		php_url_free(resource);
 		return NULL;
 	} else if (entry && entry->is_dir) {
 		if (entry->is_mounted) {
+			ret = php_stream_opendir(entry->tmp, options, context);
 			php_url_free(resource);
-			return php_stream_opendir(entry->tmp, options, context);
+			return ret;
 		}
-		internal_file = estrdup(internal_file);
+		ret = phar_make_dirstream(internal_file, internal_file_len, &phar->manifest);
 		php_url_free(resource);
-		return phar_make_dirstream(internal_file, &phar->manifest);
+		return ret;
 	} else {
-		size_t i_len = strlen(internal_file);
+		zend_string *str_key;
 
 		/* search for directory */
-		zend_hash_internal_pointer_reset(&phar->manifest);
-		while (FAILURE != zend_hash_has_more_elements(&phar->manifest)) {
-			if (HASH_KEY_NON_EXISTENT !=
-					zend_hash_get_current_key(&phar->manifest, &str_key, &unused)) {
-				if (ZSTR_LEN(str_key) > i_len && 0 == memcmp(ZSTR_VAL(str_key), internal_file, i_len)) {
-					/* directory found */
-					internal_file = estrndup(internal_file,
-							i_len);
-					php_url_free(resource);
-					return phar_make_dirstream(internal_file, &phar->manifest);
-				}
-			}
-
-			if (SUCCESS != zend_hash_move_forward(&phar->manifest)) {
-				break;
+		ZEND_HASH_MAP_FOREACH_STR_KEY(&phar->manifest, str_key) {
+			if (zend_string_starts_with_cstr(str_key, internal_file, internal_file_len)) {
+				/* directory found */
+				ret = phar_make_dirstream(internal_file, internal_file_len, &phar->manifest);
+				php_url_free(resource);
+				return ret;
 			}
-		}
+		} ZEND_HASH_FOREACH_END();
 	}
 
 	php_url_free(resource);
@@ -436,9 +388,7 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo
 		return 0;
 	}
 
-	size_t host_len = ZSTR_LEN(resource->host);
-
-	if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), host_len, NULL, 0, &error)) {
+	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);
 		efree(error);
 		php_url_free(resource);
@@ -507,7 +457,7 @@ int phar_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url_from, int mo
 		return 0;
 	}
 
-	phar_flush(phar, 0, 0, 0, &error);
+	phar_flush(phar, &error);
 
 	if (error) {
 		php_stream_wrapper_log_error(wrapper, options, "phar error: cannot create directory \"%s\" in phar \"%s\", %s", entry.filename, phar->fname, error);
@@ -531,8 +481,6 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 	char *error, *arch, *entry2;
 	size_t arch_len, entry_len;
 	php_url *resource = NULL;
-	zend_string *str_key;
-	zend_ulong unused;
 
 	/* pre-readonly check, we need to know if this is a data phar */
 	if (FAILURE == phar_split_fname(url, strlen(url), &arch, &arch_len, &entry2, &entry_len, 2, 2)) {
@@ -569,9 +517,7 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 		return 0;
 	}
 
-	size_t host_len = ZSTR_LEN(resource->host);
-
-	if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), host_len, NULL, 0, &error)) {
+	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);
 		efree(error);
 		php_url_free(resource);
@@ -592,13 +538,13 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 	}
 
 	if (!entry->is_deleted) {
-		for (zend_hash_internal_pointer_reset(&phar->manifest);
-			HASH_KEY_NON_EXISTENT != zend_hash_get_current_key(&phar->manifest, &str_key, &unused);
-			zend_hash_move_forward(&phar->manifest)
-		) {
-			if (ZSTR_LEN(str_key) > path_len &&
-				memcmp(ZSTR_VAL(str_key), ZSTR_VAL(resource->path)+1, path_len) == 0 &&
-				IS_SLASH(ZSTR_VAL(str_key)[path_len])) {
+		zend_string *str_key;
+
+		ZEND_HASH_MAP_FOREACH_STR_KEY(&phar->manifest, str_key) {
+			if (
+				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");
 				if (entry->is_temp_dir) {
 					efree(entry->filename);
@@ -607,15 +553,14 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 				php_url_free(resource);
 				return 0;
 			}
-		}
-
-		for (zend_hash_internal_pointer_reset(&phar->virtual_dirs);
-			HASH_KEY_NON_EXISTENT != zend_hash_get_current_key(&phar->virtual_dirs, &str_key, &unused);
-			zend_hash_move_forward(&phar->virtual_dirs)) {
-
-			if (ZSTR_LEN(str_key) > path_len &&
-				memcmp(ZSTR_VAL(str_key), ZSTR_VAL(resource->path)+1, path_len) == 0 &&
-				IS_SLASH(ZSTR_VAL(str_key)[path_len])) {
+		} ZEND_HASH_FOREACH_END();
+
+		ZEND_HASH_MAP_FOREACH_STR_KEY(&phar->virtual_dirs, str_key) {
+			ZEND_ASSERT(str_key);
+			if (
+				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");
 				if (entry->is_temp_dir) {
 					efree(entry->filename);
@@ -624,7 +569,7 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 				php_url_free(resource);
 				return 0;
 			}
-		}
+		} ZEND_HASH_FOREACH_END();
 	}
 
 	if (entry->is_temp_dir) {
@@ -634,7 +579,7 @@ int phar_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url, int options
 	} else {
 		entry->is_deleted = 1;
 		entry->is_modified = 1;
-		phar_flush(phar, 0, 0, 0, &error);
+		phar_flush(phar, &error);
 
 		if (error) {
 			php_stream_wrapper_log_error(wrapper, options, "phar error: cannot remove directory \"%s\" in phar \"%s\", %s", entry->filename, phar->fname, error);
diff --git a/ext/phar/phar.c b/ext/phar/phar.c
index 99767468ee71c..9e57522aeaa72 100644
--- a/ext/phar/phar.c
+++ b/ext/phar/phar.c
@@ -433,7 +433,7 @@ void phar_entry_remove(phar_entry_data *idata, char **error) /* {{{ */
 	}
 
 	if (!phar->donotflush) {
-		phar_flush(phar, 0, 0, 0, error);
+		phar_flush(phar, error);
 	}
 }
 /* }}} */
@@ -459,14 +459,14 @@ void phar_entry_remove(phar_entry_data *idata, char **error) /* {{{ */
 
 #ifdef WORDS_BIGENDIAN
 # define PHAR_GET_32(buffer, var) \
-	var = ((((unsigned char*)(buffer))[3]) << 24) \
-		| ((((unsigned char*)(buffer))[2]) << 16) \
-		| ((((unsigned char*)(buffer))[1]) <<  8) \
-		| (((unsigned char*)(buffer))[0]); \
+	var = ((uint32_t)(((unsigned char*)(buffer))[3]) << 24) \
+		| ((uint32_t)(((unsigned char*)(buffer))[2]) << 16) \
+		| ((uint32_t)(((unsigned char*)(buffer))[1]) <<  8) \
+		| ((uint32_t)((unsigned char*)(buffer))[0]); \
 	(buffer) += 4
 # define PHAR_GET_16(buffer, var) \
-	var = ((((unsigned char*)(buffer))[1]) <<  8) \
-		| (((unsigned char*)(buffer))[0]); \
+	var = ((uint16_t)(((unsigned char*)(buffer))[1]) <<  8) \
+		| ((uint16_t)((unsigned char*)(buffer))[0]); \
 	(buffer) += 2
 #else
 # define PHAR_GET_32(buffer, var) \
@@ -730,7 +730,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 int 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, 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) /* {{{ */
 {
 	char b32[4], *buffer, *endbuffer, *savebuf;
 	phar_archive_data *mydata = NULL;
@@ -1806,7 +1806,7 @@ static zend_result phar_open_from_fp(php_stream* fp, char *fname, size_t fname_l
  * if not, check to see if its dirname() exists (i.e. "/path/to") and is a directory
  * succeed if we are creating the file, otherwise fail.
  */
-static int phar_analyze_path(const char *fname, const char *ext, size_t ext_len, int for_create) /* {{{ */
+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;
@@ -1911,7 +1911,7 @@ static int phar_analyze_path(const char *fname, const char *ext, size_t ext_len,
 /* }}} */
 
 /* check for ".phar" in extension */
-static int phar_check_str(const char *fname, const char *ext_str, size_t ext_len, int executable, int for_create) /* {{{ */
+static zend_result phar_check_str(const char *fname, const char *ext_str, size_t ext_len, int executable, int for_create) /* {{{ */
 {
 	const char *pos;
 
@@ -2057,6 +2057,7 @@ zend_result phar_detect_phar_fname_ext(const char *filename, size_t filename_len
 		}
 	}
 
+	// TODO Use some sort of loop here instead of a goto
 	pos = memchr(filename + 1, '.', filename_len);
 next_extension:
 	if (!pos) {
@@ -2078,30 +2079,23 @@ zend_result phar_detect_phar_fname_ext(const char *filename, size_t filename_len
 		*ext_len = strlen(pos);
 
 		/* file extension must contain "phar" */
-		switch (phar_check_str(filename, *ext_str, *ext_len, executable, for_create)) {
-			case SUCCESS:
-				return SUCCESS;
-			case FAILURE:
-				/* we are at the end of the string, so we fail */
-				return FAILURE;
-		}
+		return phar_check_str(filename, *ext_str, *ext_len, executable, for_create);
 	}
 
 	/* we've found an extension that ends at a directory separator */
 	*ext_str = pos;
 	*ext_len = slash - pos;
 
-	switch (phar_check_str(filename, *ext_str, *ext_len, executable, for_create)) {
-		case SUCCESS:
-			return SUCCESS;
-		case FAILURE:
-			/* look for more extensions */
-			pos = strchr(pos + 1, '.');
-			if (pos) {
-				*ext_str = NULL;
-				*ext_len = 0;
-			}
-			goto next_extension;
+	if (phar_check_str(filename, *ext_str, *ext_len, executable, for_create) == SUCCESS) {
+		return SUCCESS;
+	}
+
+	/* look for more extensions */
+	pos = strchr(pos + 1, '.');
+	if (pos) {
+		*ext_str = NULL;
+		*ext_len = 0;
+		goto next_extension;
 	}
 
 	return FAILURE;
@@ -2186,9 +2180,7 @@ char *phar_fix_filepath(char *path, size_t *new_len, int use_cwd) /* {{{ */
 		ptr_length = ptr - tok;
 last_time:
 		if (IS_DIRECTORY_UP(tok, ptr_length)) {
-#define PREVIOUS newpath[newpath_len - 1]
-
-			while (newpath_len > 1 && !IS_BACKSLASH(PREVIOUS)) {
+			while (newpath_len > 1 && !IS_BACKSLASH(newpath[newpath_len - 1])) {
 				newpath_len--;
 			}
 
@@ -2487,7 +2479,7 @@ static int phar_flush_clean_deleted_apply(zval *zv) /* {{{ */
 }
 /* }}} */
 
-#include "stub.h"
+#include "stub.h" /* Generated phar_get_stub() function from makestub.php script */
 
 zend_string *phar_create_default_stub(const char *index_php, const char *web_index, char **error) /* {{{ */
 {
@@ -2528,39 +2520,44 @@ zend_string *phar_create_default_stub(const char *index_php, const char *web_ind
 }
 /* }}} */
 
+void phar_flush(phar_archive_data *phar, char **error) {
+	phar_flush_ex(phar, NULL, false, error);
+}
+
 /**
  * Save phar contents to disk
  *
- * user_stub contains either a string, or a resource pointer, if len is a negative length.
- * user_stub and len should be both 0 if the default or existing stub should be used
+ * if user_stub is NULL the default or existing stub should be used
  */
-int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int convert, char **error) /* {{{ */
+void phar_flush_ex(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error) /* {{{ */
 {
-	char halt_stub[] = "__HALT_COMPILER();";
-	zend_string *newstub;
+	static const char halt_stub[] = "__HALT_COMPILER();";
+
 	phar_entry_info *entry, *newentry;
 	size_t halt_offset;
-	int restore_alias_len, global_flags = 0, closeoldfile;
-	char *pos, has_dirs = 0;
+	int restore_alias_len, global_flags = 0;
+	bool must_close_old_file = false;
+	bool has_dirs = false;
 	char manifest[18], entry_buffer[24];
 	zend_off_t manifest_ftell;
 	zend_long offset;
 	size_t wrote;
 	uint32_t manifest_len, mytime, new_manifest_count;
 	uint32_t newcrc32;
-	php_stream *file, *oldfile, *newfile, *stubfile;
+	php_stream *file, *oldfile, *newfile;
 	php_stream_filter *filter;
 	php_serialize_data_t metadata_hash;
 	smart_str main_metadata_str = {0};
-	int free_user_stub, free_fp = 1, free_ufp = 1;
-	int manifest_hack = 0;
+	bool free_fp = true;
+	bool free_ufp = true;
+	bool manifest_hack = false;
 	php_stream *shared_cfp = NULL;
 
 	if (phar->is_persistent) {
 		if (error) {
 			spprintf(error, 0, "internal error: attempt to flush cached zip-based phar \"%s\"", phar->fname);
 		}
-		return EOF;
+		return;
 	}
 
 	if (error) {
@@ -2568,142 +2565,107 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 	}
 
 	if (!zend_hash_num_elements(&phar->manifest) && !user_stub) {
-		return EOF;
+		return;
 	}
 
 	zend_hash_clean(&phar->virtual_dirs);
 
 	if (phar->is_zip) {
-		return phar_zip_flush(phar, user_stub, len, convert, error);
+		phar_zip_flush(phar, user_stub, is_default_stub, error);
+		return;
 	}
 
 	if (phar->is_tar) {
-		return phar_tar_flush(phar, user_stub, len, convert, error);
+		phar_tar_flush(phar, user_stub, is_default_stub, error);
+		return;
 	}
 
 	if (PHAR_G(readonly)) {
-		return EOF;
+		return;
 	}
 
 	if (phar->fp && !phar->is_brandnew) {
 		oldfile = phar->fp;
-		closeoldfile = 0;
+		must_close_old_file = false;
 		php_stream_rewind(oldfile);
 	} else {
 		oldfile = php_stream_open_wrapper(phar->fname, "rb", 0, NULL);
-		closeoldfile = oldfile != NULL;
+		must_close_old_file = oldfile != NULL;
 	}
 	newfile = php_stream_fopen_tmpfile();
 	if (!newfile) {
 		if (error) {
 			spprintf(error, 0, "unable to create temporary file");
 		}
-		if (closeoldfile) {
+		if (must_close_old_file) {
 			php_stream_close(oldfile);
 		}
-		return EOF;
+		return;
 	}
 
 	if (user_stub) {
-		zend_string *suser_stub;
-		if (len < 0) {
-			/* resource passed in */
-			if (!(php_stream_from_zval_no_verify(stubfile, (zval *)user_stub))) {
-				if (closeoldfile) {
-					php_stream_close(oldfile);
-				}
-				php_stream_close(newfile);
-				if (error) {
-					spprintf(error, 0, "unable to access resource to copy stub to new phar \"%s\"", phar->fname);
-				}
-				return EOF;
-			}
-			if (len == -1) {
-				len = PHP_STREAM_COPY_ALL;
-			} else {
-				len = -len;
-			}
-			user_stub = 0;
+		char *pos = php_stristr(ZSTR_VAL(user_stub), halt_stub, ZSTR_LEN(user_stub), strlen(halt_stub));
 
-			if (!(suser_stub = php_stream_copy_to_mem(stubfile, len, 0))) {
-				if (closeoldfile) {
-					php_stream_close(oldfile);
-				}
-				php_stream_close(newfile);
-				if (error) {
-					spprintf(error, 0, "unable to read resource to copy stub to new phar \"%s\"", phar->fname);
-				}
-				return EOF;
-			}
-			free_user_stub = 1;
-			user_stub = ZSTR_VAL(suser_stub);
-			len = ZSTR_LEN(suser_stub);
-		} else {
-			free_user_stub = 0;
-		}
-		if ((pos = php_stristr(user_stub, halt_stub, len, sizeof(halt_stub) - 1)) == NULL) {
-			if (closeoldfile) {
+		if (pos == NULL) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
 			if (error) {
 				spprintf(error, 0, "illegal stub for phar \"%s\" (__HALT_COMPILER(); is missing)", phar->fname);
 			}
-			if (free_user_stub) {
-				zend_string_free(suser_stub);
-			}
-			return EOF;
+			return;
 		}
-		len = pos - user_stub + 18;
-		if ((size_t)len != php_stream_write(newfile, user_stub, len)
-		||			  5 != php_stream_write(newfile, " ?>\r\n", 5)) {
-			if (closeoldfile) {
+
+		size_t len = pos - ZSTR_VAL(user_stub) + strlen(halt_stub);
+		const char end_sequence[] = " ?>\r\n";
+		size_t end_sequence_len = strlen(end_sequence);
+
+		if (
+			len != php_stream_write(newfile, ZSTR_VAL(user_stub), len)
+			|| end_sequence_len != php_stream_write(newfile, end_sequence, end_sequence_len)
+		) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
 			if (error) {
 				spprintf(error, 0, "unable to create stub from string in new phar \"%s\"", phar->fname);
 			}
-			if (free_user_stub) {
-				zend_string_free(suser_stub);
-			}
-			return EOF;
-		}
-		phar->halt_offset = len + 5;
-		if (free_user_stub) {
-			zend_string_free(suser_stub);
+			return;
 		}
+		phar->halt_offset = len + end_sequence_len;
 	} else {
 		size_t written;
+		zend_string *new_stub = NULL;
 
 		if (!user_stub && phar->halt_offset && oldfile && !phar->is_brandnew) {
 			php_stream_copy_to_stream_ex(oldfile, newfile, phar->halt_offset, &written);
-			newstub = NULL;
 		} else {
 			/* this is either a brand new phar or a default stub overwrite */
-			newstub = phar_create_default_stub(NULL, NULL, NULL);
-			phar->halt_offset = ZSTR_LEN(newstub);
-			written = php_stream_write(newfile, ZSTR_VAL(newstub), phar->halt_offset);
+			new_stub = phar_create_default_stub(NULL, NULL, NULL);
+			phar->halt_offset = ZSTR_LEN(new_stub);
+			written = php_stream_write(newfile, ZSTR_VAL(new_stub), phar->halt_offset);
 		}
 		if (phar->halt_offset != written) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
 			if (error) {
-				if (newstub) {
+				if (new_stub) {
 					spprintf(error, 0, "unable to create stub in new phar \"%s\"", phar->fname);
 				} else {
 					spprintf(error, 0, "unable to copy stub of old phar to new phar \"%s\"", phar->fname);
 				}
 			}
-			if (newstub) {
-				zend_string_free(newstub);
+			if (new_stub) {
+				zend_string_free(new_stub);
 			}
-			return EOF;
+			return;
 		}
-		if (newstub) {
-			zend_string_free(newstub);
+		if (new_stub) {
+			zend_string_free(new_stub);
 		}
 	}
 	manifest_ftell = php_stream_tell(newfile);
@@ -2739,10 +2701,10 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 			/* open file pointers refer to this fp, do not free the stream */
 			switch (entry->fp_type) {
 				case PHAR_FP:
-					free_fp = 0;
+					free_fp = false;
 					break;
 				case PHAR_UFP:
-					free_ufp = 0;
+					free_ufp = false;
 				default:
 					break;
 			}
@@ -2753,7 +2715,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 
 		if (entry->is_dir) {
 			/* we use this to calculate API version, 1.1.1 is used for phars with directories */
-			has_dirs = 1;
+			has_dirs = true;
 		}
 		if (!Z_ISUNDEF(entry->metadata_tracker.val) && !entry->metadata_tracker.str) {
 			ZEND_ASSERT(!entry->is_persistent);
@@ -2789,14 +2751,14 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		}
 		file = phar_get_efp(entry, 0);
 		if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, 1)) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
 			if (error) {
 				spprintf(error, 0, "unable to seek to start of file \"%s\" while creating new phar \"%s\"", entry->filename, phar->fname);
 			}
-			return EOF;
+			return;
 		}
 		newcrc32 = php_crc32_bulk_init();
 		php_crc32_stream_bulk_update(&newcrc32, file, entry->uncompressed_filesize);
@@ -2809,7 +2771,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		}
 		filter = php_stream_filter_create(phar_compress_filter(entry, 0), NULL, 0);
 		if (!filter) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
@@ -2822,7 +2784,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 					spprintf(error, 0, "unable to bzip2 compress file \"%s\" to new phar \"%s\"", entry->filename, phar->fname);
 				}
 			}
-			return EOF;
+			return;
 		}
 
 		/* create new file that holds the compressed versions */
@@ -2836,7 +2798,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 			if (error) {
 				spprintf(error, 0, "unable to create temporary file");
 			}
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
@@ -2847,7 +2809,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		entry->header_offset = php_stream_tell(entry->cfp);
 		php_stream_flush(file);
 		if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, 0)) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
@@ -2858,7 +2820,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		}
 		php_stream_filter_append((&entry->cfp->writefilters), filter);
 		if (SUCCESS != php_stream_copy_to_stream_ex(file, entry->cfp, entry->uncompressed_filesize, NULL)) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
@@ -2900,7 +2862,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 	if(manifest[0] == '\r' || manifest[0] == '\n') {
 		manifest_len++;
 		phar_set_32(manifest, manifest_len);
-		manifest_hack = 1;
+		manifest_hack = true;
 	}
 	phar_set_32(manifest+4, new_manifest_count);
 	if (has_dirs) {
@@ -2917,7 +2879,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 	if (sizeof(manifest) != php_stream_write(newfile, manifest, sizeof(manifest))
 	|| (size_t)phar->alias_len != php_stream_write(newfile, phar->alias, phar->alias_len)) {
 
-		if (closeoldfile) {
+		if (must_close_old_file) {
 			php_stream_close(oldfile);
 		}
 
@@ -2938,7 +2900,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 	&& ZSTR_LEN(main_metadata_str.s) != php_stream_write(newfile, ZSTR_VAL(main_metadata_str.s), ZSTR_LEN(main_metadata_str.s)))) {
 		smart_str_free(&main_metadata_str);
 
-		if (closeoldfile) {
+		if (must_close_old_file) {
 			php_stream_close(oldfile);
 		}
 
@@ -2974,7 +2936,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		if (4 != php_stream_write(newfile, entry_buffer, 4)
 		|| entry->filename_len != php_stream_write(newfile, entry->filename, entry->filename_len)
 		|| (entry->is_dir && 1 != php_stream_write(newfile, "/", 1))) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
@@ -3009,7 +2971,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		if (sizeof(entry_buffer) != php_stream_write(newfile, entry_buffer, sizeof(entry_buffer))
 		|| (metadata_str &&
 		    ZSTR_LEN(metadata_str) != php_stream_write(newfile, ZSTR_VAL(metadata_str), ZSTR_LEN(metadata_str)))) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 
@@ -3023,9 +2985,9 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		}
 	} ZEND_HASH_FOREACH_END();
 	/* Hack - see bug #65028, add padding byte to the end of the manifest */
-	if(manifest_hack) {
+	if (manifest_hack) {
 		if(1 != php_stream_write(newfile, manifest, 1)) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 
@@ -3052,7 +3014,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		} else {
 			file = phar_get_efp(entry, 0);
 			if (-1 == phar_seek_efp(entry, 0, SEEK_SET, 0, 0)) {
-				if (closeoldfile) {
+				if (must_close_old_file) {
 					php_stream_close(oldfile);
 				}
 				php_stream_close(newfile);
@@ -3064,7 +3026,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		}
 
 		if (!file) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
@@ -3078,7 +3040,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		entry->offset = entry->offset_abs = offset;
 		offset += entry->compressed_filesize;
 		if (php_stream_copy_to_stream_ex(file, newfile, entry->compressed_filesize, &wrote) == FAILURE) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 
@@ -3141,11 +3103,11 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 					if (digest) {
 						efree(digest);
 					}
-					if (closeoldfile) {
+					if (must_close_old_file) {
 						php_stream_close(oldfile);
 					}
 					php_stream_close(newfile);
-					return EOF;
+					return;
 				}
 
 				php_stream_write(newfile, digest, digest_len);
@@ -3178,7 +3140,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		phar->ufp = NULL;
 	}
 
-	if (closeoldfile) {
+	if (must_close_old_file) {
 		php_stream_close(oldfile);
 	}
 
@@ -3197,7 +3159,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 			if (error) {
 				spprintf(error, 4096, "unable to open new phar \"%s\" for writing", phar->fname);
 			}
-			return EOF;
+			return;
 		}
 
 		if (phar->flags & PHAR_FILE_COMPRESSED_GZ) {
@@ -3213,7 +3175,7 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 				if (error) {
 					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);
 				}
-				return EOF;
+				return;
 			}
 
 			php_stream_filter_append(&phar->fp->writefilters, filter);
@@ -3243,10 +3205,9 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 		if (error) {
 			spprintf(error, 0, "unable to seek to __HALT_COMPILER(); in new phar \"%s\"", phar->fname);
 		}
-		return EOF;
 	}
 
-	return EOF;
+	return;
 
 cleanup:
 	if (shared_cfp != NULL) {
@@ -3258,8 +3219,6 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
 			entry->header_offset = 0;
 		}
 	} ZEND_HASH_FOREACH_END();
-
-	return EOF;
 }
 /* }}} */
 
@@ -3519,8 +3478,6 @@ void phar_request_initialize(void) /* {{{ */
 
 PHP_RSHUTDOWN_FUNCTION(phar) /* {{{ */
 {
-	uint32_t i;
-
 	PHAR_G(request_ends) = 1;
 
 	if (PHAR_G(request_init))
@@ -3535,7 +3492,7 @@ PHP_RSHUTDOWN_FUNCTION(phar) /* {{{ */
 		PHAR_G(phar_SERVER_mung_list) = 0;
 
 		if (PHAR_G(cached_fp)) {
-			for (i = 0; i < zend_hash_num_elements(&cached_phars); ++i) {
+			for (uint32_t i = 0; i < zend_hash_num_elements(&cached_phars); ++i) {
 				if (PHAR_G(cached_fp)[i].fp) {
 					php_stream_close(PHAR_G(cached_fp)[i].fp);
 				}
diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h
index eb836ac691adc..2f9ae7c1c84ea 100644
--- a/ext/phar/phar_internal.h
+++ b/ext/phar/phar_internal.h
@@ -447,12 +447,12 @@ zend_result phar_copy_on_write(phar_archive_data **pphar);
 bool phar_is_tar(char *buf, 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_result phar_open_or_create_tar(char *fname, size_t fname_len, char *alias, size_t alias_len, int is_data, uint32_t options, phar_archive_data** pphar, char **error);
-int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int defaultstub, char **error);
+void phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error);
 
 /* zip functions in zip.c */
 int phar_parse_zipfile(php_stream *fp, char *fname, size_t fname_len, char *alias, size_t alias_len, phar_archive_data** pphar, char **error);
 int phar_open_or_create_zip(char *fname, size_t fname_len, char *alias, size_t alias_len, int is_data, uint32_t options, phar_archive_data** pphar, char **error);
-int phar_zip_flush(phar_archive_data *archive, char *user_stub, zend_long len, int defaultstub, char **error);
+void phar_zip_flush(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
 
 #ifdef PHAR_MAIN
 extern const php_stream_wrapper php_stream_phar_wrapper;
@@ -468,7 +468,8 @@ 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, int security);
 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, int security);
 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, int security);
-int phar_flush(phar_archive_data *archive, char *user_stub, zend_long len, int convert, char **error);
+void phar_flush_ex(phar_archive_data *archive, zend_string *user_stub, bool is_default_stub, char **error);
+void 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, int 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);
 
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c
index 0d992a6dd7f6a..25f0d7d9fa6b0 100644
--- a/ext/phar/phar_object.c
+++ b/ext/phar/phar_object.c
@@ -1812,7 +1812,7 @@ PHP_METHOD(Phar, buildFromDirectory)
 		}
 
 		phar_obj->archive->ufp = pass.fp;
-		phar_flush(phar_obj->archive, 0, 0, 0, &error);
+		phar_flush(phar_obj->archive, &error);
 
 		if (error) {
 			zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -1877,7 +1877,7 @@ PHP_METHOD(Phar, buildFromIterator)
 
 	if (SUCCESS == spl_iterator_apply(obj, (spl_iterator_apply_func_t) phar_build, (void *) &pass)) {
 		phar_obj->archive->ufp = pass.fp;
-		phar_flush(phar_obj->archive, 0, 0, 0, &error);
+		phar_flush(phar_obj->archive, &error);
 		if (error) {
 			zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
 			efree(error);
@@ -2194,7 +2194,7 @@ static zend_object *phar_rename_archive(phar_archive_data **sphar, char *ext) /*
 		return NULL;
 	}
 
-	phar_flush(phar, 0, 0, 1, &error);
+	phar_flush_ex(phar, NULL, 1, &error);
 
 	if (error) {
 		zend_hash_str_del(&(PHAR_G(phar_fname_map)), newpath, phar->fname_len);
@@ -2308,6 +2308,9 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert
 			newentry.tar_type = (entry->is_dir ? TAR_DIR : TAR_FILE);
 		}
 
+		/* The header offset is only used for unmodified zips.
+		 * Once modified, phar_zip_changed_apply_int() will update the header_offset. */
+		newentry.header_offset = 0;
 		newentry.is_modified = 1;
 		newentry.phar = phar;
 		newentry.old_flags = newentry.flags & ~PHAR_ENT_COMPRESSION_MASK; /* remove compression from old_flags */
@@ -2642,7 +2645,7 @@ PHP_METHOD(Phar, delete)
 		RETURN_THROWS();
 	}
 
-	phar_flush(phar_obj->archive, NULL, 0, 0, &error);
+	phar_flush(phar_obj->archive, &error);
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
 		efree(error);
@@ -2754,7 +2757,7 @@ PHP_METHOD(Phar, setAlias)
 	phar_obj->archive->alias = estrndup(ZSTR_VAL(new_alias), ZSTR_LEN(new_alias));
 	phar_obj->archive->alias_len = ZSTR_LEN(new_alias);
 	phar_obj->archive->is_temporary_alias = 0;
-	phar_flush(phar_obj->archive, NULL, 0, 0, &error);
+	phar_flush(phar_obj->archive, &error);
 
 	if (error) {
 		phar_obj->archive->alias = oldalias;
@@ -2835,7 +2838,7 @@ PHP_METHOD(Phar, stopBuffering)
 	}
 
 	phar_obj->archive->donotflush = 0;
-	phar_flush(phar_obj->archive, 0, 0, 0, &error);
+	phar_flush(phar_obj->archive, &error);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -2849,9 +2852,9 @@ PHP_METHOD(Phar, stopBuffering)
  */
 PHP_METHOD(Phar, setStub)
 {
+	char *error;
+	zend_string *stub;
 	zval *zstub;
-	char *stub, *error;
-	size_t stub_len;
 	zend_long len = -1;
 	php_stream *stream;
 
@@ -2883,16 +2886,26 @@ 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);
+				RETURN_THROWS();
+			}
+
+			zend_string *stub_file_content = NULL;
 			if (len > 0) {
-				len = -len;
+				stub_file_content = php_stream_copy_to_mem(stream, len, false);
 			} else {
-				len = -1;
+				stub_file_content = php_stream_copy_to_mem(stream, PHP_STREAM_COPY_ALL, false);
 			}
-			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);
+
+			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);
 				RETURN_THROWS();
 			}
-			phar_flush(phar_obj->archive, (char *) zstub, len, 0, &error);
+
+			phar_flush_ex(phar_obj->archive, stub_file_content, /* is_default_stub */ false, &error);
+			zend_string_release_ex(stub_file_content, false);
+
 			if (error) {
 				zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
 				efree(error);
@@ -2902,12 +2915,12 @@ PHP_METHOD(Phar, setStub)
 			zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0,
 				"Cannot change stub, unable to read from input stream");
 		}
-	} else if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &stub, &stub_len) == SUCCESS) {
+	} 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);
 			RETURN_THROWS();
 		}
-		phar_flush(phar_obj->archive, stub, stub_len, 0, &error);
+		phar_flush_ex(phar_obj->archive, stub, /* is_default_stub */ false, &error);
 
 		if (error) {
 			zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -2988,7 +3001,7 @@ PHP_METHOD(Phar, setDefaultStub)
 		zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
 		RETURN_THROWS();
 	}
-	phar_flush(phar_obj->archive, stub ? ZSTR_VAL(stub) : 0, stub ? ZSTR_LEN(stub) : 0, 1, &error);
+	phar_flush_ex(phar_obj->archive, stub, /* is_default_stub */ true, &error);
 
 	if (created_stub) {
 		zend_string_free(stub);
@@ -3044,7 +3057,7 @@ PHP_METHOD(Phar, setSignatureAlgorithm)
 			PHAR_G(openssl_privatekey) = key;
 			PHAR_G(openssl_privatekey_len) = key_len;
 
-			phar_flush(phar_obj->archive, 0, 0, 0, &error);
+			phar_flush(phar_obj->archive, &error);
 			if (error) {
 				zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
 				efree(error);
@@ -3353,7 +3366,7 @@ PHP_METHOD(Phar, compressFiles)
 	}
 	pharobj_set_compression(&phar_obj->archive->manifest, flags);
 	phar_obj->archive->is_modified = 1;
-	phar_flush(phar_obj->archive, 0, 0, 0, &error);
+	phar_flush(phar_obj->archive, &error);
 
 	if (error) {
 		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "%s", error);
@@ -3397,7 +3410,7 @@ PHP_METHOD(Phar, decompressFiles)
 	}
 
 	phar_obj->archive->is_modified = 1;
-	phar_flush(phar_obj->archive, 0, 0, 0, &error);
+	phar_flush(phar_obj->archive, &error);
 
 	if (error) {
 		zend_throw_exception_ex(spl_ce_BadMethodCallException, 0, "%s", error);
@@ -3492,7 +3505,7 @@ PHP_METHOD(Phar, copy)
 
 	zend_hash_str_add_mem(&oldentry->phar->manifest, ZSTR_VAL(new_file), tmp_len, &newentry, sizeof(phar_entry_info));
 	phar_obj->archive->is_modified = 1;
-	phar_flush(phar_obj->archive, 0, 0, 0, &error);
+	phar_flush(phar_obj->archive, &error);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -3673,7 +3686,7 @@ static void phar_add_file(phar_archive_data **pphar, zend_string *file_name, con
 			*pphar = data->phar;
 		}
 		phar_entry_delref(data);
-		phar_flush(*pphar, 0, 0, 0, &error);
+		phar_flush(*pphar, &error);
 
 		if (error) {
 			zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -3716,7 +3729,7 @@ static void phar_mkdir(phar_archive_data **pphar, zend_string *dir_name)
 			*pphar = data->phar;
 		}
 		phar_entry_delref(data);
-		phar_flush(*pphar, 0, 0, 0, &error);
+		phar_flush(*pphar, &error);
 
 		if (error) {
 			zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -3800,7 +3813,7 @@ PHP_METHOD(Phar, offsetUnset)
 			entry->is_modified = 0;
 			entry->is_deleted = 1;
 			/* we need to "flush" the stream to save the newly deleted file on disk */
-			phar_flush(phar_obj->archive, 0, 0, 0, &error);
+			phar_flush(phar_obj->archive, &error);
 
 			if (error) {
 				zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -4070,7 +4083,7 @@ PHP_METHOD(Phar, setMetadata)
 	}
 
 	phar_obj->archive->is_modified = 1;
-	phar_flush(phar_obj->archive, 0, 0, 0, &error);
+	phar_flush(phar_obj->archive, &error);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -4101,7 +4114,7 @@ PHP_METHOD(Phar, delMetadata)
 
 	phar_metadata_tracker_free(&phar_obj->archive->metadata_tracker, phar_obj->archive->is_persistent);
 	phar_obj->archive->is_modified = 1;
-	phar_flush(phar_obj->archive, 0, 0, 0, &error);
+	phar_flush(phar_obj->archive, &error);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -4669,7 +4682,7 @@ PHP_METHOD(PharFileInfo, chmod)
 
 	BG(CurrentLStatFile) = NULL;
 	BG(CurrentStatFile) = NULL;
-	phar_flush(entry_obj->entry->phar, 0, 0, 0, &error);
+	phar_flush(entry_obj->entry->phar, &error);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -4752,7 +4765,7 @@ PHP_METHOD(PharFileInfo, setMetadata)
 
 	entry_obj->entry->is_modified = 1;
 	entry_obj->entry->phar->is_modified = 1;
-	phar_flush(entry_obj->entry->phar, 0, 0, 0, &error);
+	phar_flush(entry_obj->entry->phar, &error);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -4799,7 +4812,7 @@ PHP_METHOD(PharFileInfo, delMetadata)
 		entry_obj->entry->is_modified = 1;
 		entry_obj->entry->phar->is_modified = 1;
 
-		phar_flush(entry_obj->entry->phar, 0, 0, 0, &error);
+		phar_flush(entry_obj->entry->phar, &error);
 
 		if (error) {
 			zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -4979,7 +4992,7 @@ PHP_METHOD(PharFileInfo, compress)
 
 	entry_obj->entry->phar->is_modified = 1;
 	entry_obj->entry->is_modified = 1;
-	phar_flush(entry_obj->entry->phar, 0, 0, 0, &error);
+	phar_flush(entry_obj->entry->phar, &error);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
@@ -5071,7 +5084,7 @@ PHP_METHOD(PharFileInfo, decompress)
 	entry_obj->entry->flags &= ~PHAR_ENT_COMPRESSION_MASK;
 	entry_obj->entry->phar->is_modified = 1;
 	entry_obj->entry->is_modified = 1;
-	phar_flush(entry_obj->entry->phar, 0, 0, 0, &error);
+	phar_flush(entry_obj->entry->phar, &error);
 
 	if (error) {
 		zend_throw_exception_ex(phar_ce_PharException, 0, "%s", error);
diff --git a/ext/phar/php_phar.h b/ext/phar/php_phar.h
index 66db4c06829c0..18e3485fc3a92 100644
--- a/ext/phar/php_phar.h
+++ b/ext/phar/php_phar.h
@@ -22,16 +22,7 @@
 
 #define PHP_PHAR_VERSION PHP_VERSION
 
-#include "ext/standard/basic_functions.h"
 extern zend_module_entry phar_module_entry;
 #define phpext_phar_ptr &phar_module_entry
 
-#ifdef PHP_WIN32
-#define PHP_PHAR_API __declspec(dllexport)
-#else
-#define PHP_PHAR_API PHPAPI
-#endif
-
-PHP_PHAR_API zend_result phar_resolve_alias(char *alias, size_t alias_len, char **filename, size_t *filename_len);
-
 #endif /* PHP_PHAR_H */
diff --git a/ext/phar/stream.c b/ext/phar/stream.c
index f5e1d9514c724..b7de235c82bfb 100644
--- a/ext/phar/stream.c
+++ b/ext/phar/stream.c
@@ -186,13 +186,12 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 		return NULL;
 	}
 
-	size_t host_len = ZSTR_LEN(resource->host);
 	phar_request_initialize();
 
 	/* 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), host_len, internal_file, strlen(internal_file), mode, 0, &error, 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, 1))) {
 			if (error) {
 				php_stream_wrapper_log_error(wrapper, options, "%s", error);
 				efree(error);
@@ -236,14 +235,14 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 	} else {
 		if (!*internal_file && (options & STREAM_OPEN_FOR_INCLUDE)) {
 			/* retrieve the stub */
-			if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), host_len, NULL, 0, NULL)) {
+			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));
 				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), host_len, ".phar/stub.php", sizeof(".phar/stub.php")-1, "r", 0, &error, 0)) || !idata) {
+				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, 0)) || !idata) {
 					goto idata_error;
 				}
 				efree(internal_file);
@@ -292,7 +291,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, const cha
 			}
 		}
 		/* read-only access is allowed to magic files in .phar directory */
-		if ((FAILURE == phar_get_entry_data(&idata, ZSTR_VAL(resource->host), host_len, internal_file, strlen(internal_file), "r", 0, &error, 0)) || !idata) {
+		if ((FAILURE == phar_get_entry_data(&idata, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), internal_file, strlen(internal_file), "r", 0, &error, 0)) || !idata) {
 idata_error:
 			if (error) {
 				php_stream_wrapper_log_error(wrapper, options, "%s", error);
@@ -469,17 +468,16 @@ static ssize_t phar_stream_write(php_stream *stream, const char *buf, size_t cou
 static int phar_stream_flush(php_stream *stream) /* {{{ */
 {
 	char *error;
-	int ret;
 	phar_entry_data *data = (phar_entry_data *) stream->abstract;
 
 	if (data->internal_file->is_modified) {
 		data->internal_file->timestamp = time(0);
-		ret = phar_flush(data->phar, 0, 0, 0, &error);
+		phar_flush(data->phar, &error);
 		if (error) {
 			php_stream_wrapper_log_error(stream->wrapper, REPORT_ERRORS, "%s", error);
 			efree(error);
 		}
-		return ret;
+		return EOF;
 	} else {
 		return EOF;
 	}
@@ -581,12 +579,11 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, const char *url, int f
 		return FAILURE;
 	}
 
-	size_t host_len = ZSTR_LEN(resource->host);
 	phar_request_initialize();
 
 	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), host_len, NULL, 0, &error)) {
+	if (FAILURE == phar_get_archive(&phar, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), NULL, 0, &error)) {
 		php_url_free(resource);
 		if (error) {
 			efree(error);
@@ -691,7 +688,6 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
 		return 0;
 	}
 
-	size_t host_len = ZSTR_LEN(resource->host);
 	phar_request_initialize();
 
 	pphar = zend_hash_find_ptr(&(PHAR_G(phar_fname_map)), resource->host);
@@ -704,7 +700,7 @@ static int phar_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
 	/* 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), host_len, internal_file, internal_file_len, "r", 0, &error, 1)) {
+	if (FAILURE == phar_get_entry_data(&idata, ZSTR_VAL(resource->host), ZSTR_LEN(resource->host), internal_file, internal_file_len, "r", 0, &error, 1)) {
 		/* constraints of fp refcount were not met */
 		if (error) {
 			php_stream_wrapper_log_error(wrapper, options, "unlink of \"%s\" failed: %s", url, error);
@@ -819,9 +815,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
 		return 0;
 	}
 
-	size_t host_len = ZSTR_LEN(resource_from->host);
-
-	if (SUCCESS != phar_get_archive(&phar, ZSTR_VAL(resource_from->host), host_len, NULL, 0, &error)) {
+	if (SUCCESS != phar_get_archive(&phar, ZSTR_VAL(resource_from->host), ZSTR_LEN(resource_from->host), NULL, 0, &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);
@@ -955,7 +949,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
 	}
 
 	if (is_modified) {
-		phar_flush(phar, 0, 0, 0, &error);
+		phar_flush(phar, &error);
 		if (error) {
 			php_url_free(resource_from);
 			php_url_free(resource_to);
diff --git a/ext/phar/tar.c b/ext/phar/tar.c
index 44a8e127e233d..bfbcd4216af21 100644
--- a/ext/phar/tar.c
+++ b/ext/phar/tar.c
@@ -955,16 +955,17 @@ static int phar_tar_setupmetadata(zval *zv, void *argument) /* {{{ */
 }
 /* }}} */
 
-int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int defaultstub, char **error) /* {{{ */
+void phar_tar_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error) /* {{{ */
 {
-	phar_entry_info entry = {0};
 	static const char newstub[] = "fname);
 		}
-		return EOF;
+		return;
 	}
 
 	if (phar->is_data) {
@@ -996,7 +997,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 		if (entry.fp == NULL) {
 			efree(entry.filename);
 			spprintf(error, 0, "phar error: unable to create temporary file");
-			return -1;
+			return;
 		}
 		if (phar->alias_len != php_stream_write(entry.fp, phar->alias, phar->alias_len)) {
 			if (error) {
@@ -1004,7 +1005,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 			}
 			php_stream_close(entry.fp);
 			efree(entry.filename);
-			return EOF;
+			return;
 		}
 
 		entry.uncompressed_filesize = phar->alias_len;
@@ -1017,105 +1018,61 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 	}
 
 	/* set stub */
-	if (user_stub && !defaultstub) {
-		char *pos;
-		if (len < 0) {
-			/* resource passed in */
-			if (!(php_stream_from_zval_no_verify(stubfile, (zval *)user_stub))) {
-				if (error) {
-					spprintf(error, 0, "unable to access resource to copy stub to new tar-based phar \"%s\"", phar->fname);
-				}
-				return EOF;
-			}
-			if (len == -1) {
-				len = PHP_STREAM_COPY_ALL;
-			} else {
-				len = -len;
-			}
-			user_stub = 0;
-
-			// TODO: refactor to avoid reallocation ???
-//???		len = php_stream_copy_to_mem(stubfile, &user_stub, len, 0)
-			{
-				zend_string *str = php_stream_copy_to_mem(stubfile, len, 0);
-				if (str) {
-					len = ZSTR_LEN(str);
-					user_stub = estrndup(ZSTR_VAL(str), ZSTR_LEN(str));
-					zend_string_release_ex(str, 0);
-				} else {
-					user_stub = NULL;
-					len = 0;
-				}
-			}
+	if (user_stub && !is_default_stub) {
+		char *pos = php_stristr(ZSTR_VAL(user_stub), halt_stub, ZSTR_LEN(user_stub), sizeof(halt_stub) - 1);
 
-			if (!len || !user_stub) {
-				if (error) {
-					spprintf(error, 0, "unable to read resource to copy stub to new tar-based phar \"%s\"", phar->fname);
-				}
-				return EOF;
-			}
-			free_user_stub = 1;
-		} else {
-			free_user_stub = 0;
-		}
-
-		if ((pos = php_stristr(user_stub, halt_stub, len, sizeof(halt_stub) - 1)) == NULL) {
+		if (pos == NULL) {
 			if (error) {
 				spprintf(error, 0, "illegal stub for tar-based phar \"%s\"", phar->fname);
 			}
-			if (free_user_stub) {
-				efree(user_stub);
-			}
-			return EOF;
+			return;
 		}
 
-		len = pos - user_stub + 18;
+		size_t len = pos - ZSTR_VAL(user_stub) + strlen(halt_stub);
+		const char end_sequence[] = " ?>\r\n";
+		size_t end_sequence_len = strlen(end_sequence);
+
 		entry.fp = php_stream_fopen_tmpfile();
 		if (entry.fp == NULL) {
 			spprintf(error, 0, "phar error: unable to create temporary file");
-			return EOF;
+			return;
 		}
-		entry.uncompressed_filesize = len + 5;
+		entry.uncompressed_filesize = len + end_sequence_len;
 
-		if ((size_t)len != php_stream_write(entry.fp, user_stub, len)
-		||            5 != php_stream_write(entry.fp, " ?>\r\n", 5)) {
+		if (
+			len != php_stream_write(entry.fp, ZSTR_VAL(user_stub), len)
+			|| end_sequence_len != php_stream_write(entry.fp, end_sequence, end_sequence_len)
+		) {
 			if (error) {
 				spprintf(error, 0, "unable to create stub from string in new tar-based phar \"%s\"", phar->fname);
 			}
-			if (free_user_stub) {
-				efree(user_stub);
-			}
 			php_stream_close(entry.fp);
-			return EOF;
+			return;
 		}
 
 		entry.filename = estrndup(".phar/stub.php", sizeof(".phar/stub.php")-1);
 		entry.filename_len = sizeof(".phar/stub.php")-1;
 		zend_hash_str_update_mem(&phar->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info));
-
-		if (free_user_stub) {
-			efree(user_stub);
-		}
 	} else {
 		/* Either this is a brand new phar (add the stub), or the default stub is required (overwrite the stub) */
 		entry.fp = php_stream_fopen_tmpfile();
 		if (entry.fp == NULL) {
 			spprintf(error, 0, "phar error: unable to create temporary file");
-			return EOF;
+			return;
 		}
 		if (sizeof(newstub)-1 != php_stream_write(entry.fp, newstub, sizeof(newstub)-1)) {
 			php_stream_close(entry.fp);
 			if (error) {
 				spprintf(error, 0, "unable to %s stub in%star-based phar \"%s\", failed", user_stub ? "overwrite" : "create", user_stub ? " " : " new ", phar->fname);
 			}
-			return EOF;
+			return;
 		}
 
 		entry.uncompressed_filesize = entry.compressed_filesize = sizeof(newstub) - 1;
 		entry.filename = estrndup(".phar/stub.php", sizeof(".phar/stub.php")-1);
 		entry.filename_len = sizeof(".phar/stub.php")-1;
 
-		if (!defaultstub) {
+		if (!is_default_stub) {
 			if (!zend_hash_str_exists(&phar->manifest, ".phar/stub.php", sizeof(".phar/stub.php")-1)) {
 				if (NULL == zend_hash_str_add_mem(&phar->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info))) {
 					php_stream_close(entry.fp);
@@ -1123,7 +1080,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 					if (error) {
 						spprintf(error, 0, "unable to create stub in tar-based phar \"%s\"", phar->fname);
 					}
-					return EOF;
+					return;
 				}
 			} else {
 				php_stream_close(entry.fp);
@@ -1136,11 +1093,11 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 nostub:
 	if (phar->fp && !phar->is_brandnew) {
 		oldfile = phar->fp;
-		closeoldfile = 0;
+		must_close_old_file = false;
 		php_stream_rewind(oldfile);
 	} else {
 		oldfile = php_stream_open_wrapper(phar->fname, "rb", 0, NULL);
-		closeoldfile = oldfile != NULL;
+		must_close_old_file = oldfile != NULL;
 	}
 
 	newfile = php_stream_fopen_tmpfile();
@@ -1148,10 +1105,10 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 		if (error) {
 			spprintf(error, 0, "unable to create temporary file");
 		}
-		if (closeoldfile) {
+		if (must_close_old_file) {
 			php_stream_close(oldfile);
 		}
-		return EOF;
+		return;
 	}
 
 	pass.old = oldfile;
@@ -1164,10 +1121,10 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 		phar_entry_info *mentry;
 		if (NULL != (mentry = zend_hash_str_find_ptr(&(phar->manifest), ".phar/.metadata.bin", sizeof(".phar/.metadata.bin")-1))) {
 			if (ZEND_HASH_APPLY_KEEP != phar_tar_setmetadata(&phar->metadata_tracker, mentry, error)) {
-				if (closeoldfile) {
+				if (must_close_old_file) {
 					php_stream_close(oldfile);
 				}
-				return EOF;
+				return;
 			}
 		} else {
 			phar_entry_info newentry = {0};
@@ -1180,18 +1137,18 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 
 			if (NULL == (mentry = zend_hash_str_add_mem(&(phar->manifest), ".phar/.metadata.bin", sizeof(".phar/.metadata.bin")-1, (void *)&newentry, sizeof(phar_entry_info)))) {
 				spprintf(error, 0, "phar tar error: unable to add magic metadata file to manifest for phar archive \"%s\"", phar->fname);
-				if (closeoldfile) {
+				if (must_close_old_file) {
 					php_stream_close(oldfile);
 				}
-				return EOF;
+				return;
 			}
 
 			if (ZEND_HASH_APPLY_KEEP != phar_tar_setmetadata(&phar->metadata_tracker, mentry, error)) {
 				zend_hash_str_del(&(phar->manifest), ".phar/.metadata.bin", sizeof(".phar/.metadata.bin")-1);
-				if (closeoldfile) {
+				if (must_close_old_file) {
 					php_stream_close(oldfile);
 				}
-				return EOF;
+				return;
 			}
 		}
 	}
@@ -1199,13 +1156,13 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 	zend_hash_apply_with_argument(&phar->manifest, phar_tar_setupmetadata, (void *) &pass);
 
 	if (error && *error) {
-		if (closeoldfile) {
+		if (must_close_old_file) {
 			php_stream_close(oldfile);
 		}
 
 		/* on error in the hash iterator above, error is set */
 		php_stream_close(newfile);
-		return EOF;
+		return;
 	}
 
 	zend_hash_apply_with_argument(&phar->manifest, phar_tar_writeheaders, (void *) &pass);
@@ -1219,12 +1176,12 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 				efree(save);
 			}
 
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 
 			php_stream_close(newfile);
-			return EOF;
+			return;
 		}
 
 		entry.filename = ".phar/signature.bin";
@@ -1232,7 +1189,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 		entry.fp = php_stream_fopen_tmpfile();
 		if (entry.fp == NULL) {
 			spprintf(error, 0, "phar error: unable to create temporary file");
-			return EOF;
+			return;
 		}
 #ifdef WORDS_BIGENDIAN
 # define PHAR_SET_32(destination, source) do { \
@@ -1254,11 +1211,11 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 				spprintf(error, 0, "phar error: unable to write signature to tar-based phar %s", phar->fname);
 			}
 
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			php_stream_close(newfile);
-			return EOF;
+			return;
 		}
 
 		efree(signature);
@@ -1267,12 +1224,12 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 		entry.filename_len = phar_tar_writeheaders_int(&entry, (void *)&pass);
 
 		if (error && *error) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			/* error is set by writeheaders */
 			php_stream_close(newfile);
-			return EOF;
+			return;
 		}
 	} /* signature */
 
@@ -1281,14 +1238,14 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 	php_stream_write(newfile, buf, 1024);
 	efree(buf);
 
-	if (closeoldfile) {
+	if (must_close_old_file) {
 		php_stream_close(oldfile);
 	}
 
 	/* on error in the hash iterator above, error is set */
 	if (error && *error) {
 		php_stream_close(newfile);
-		return EOF;
+		return;
 	}
 
 	if (phar->fp && pass.free_fp) {
@@ -1315,7 +1272,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 			if (error) {
 				spprintf(error, 0, "unable to open new phar \"%s\" for writing", phar->fname);
 			}
-			return EOF;
+			return;
 		}
 
 		if (phar->flags & PHAR_FILE_COMPRESSED_GZ) {
@@ -1339,7 +1296,7 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 				if (error) {
 					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);
 				}
-				return EOF;
+				return;
 			}
 
 			php_stream_filter_append(&phar->fp->writefilters, filter);
@@ -1366,6 +1323,5 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 			php_stream_close(newfile);
 		}
 	}
-	return EOF;
 }
 /* }}} */
diff --git a/ext/phar/tests/033a.phpt b/ext/phar/tests/033a.phpt
index c36c5c6853985..355617b29f93f 100644
--- a/ext/phar/tests/033a.phpt
+++ b/ext/phar/tests/033a.phpt
@@ -5,6 +5,12 @@ phar
 --INI--
 phar.readonly=1
 phar.require_hash=0
+--SKIPIF--
+
 --FILE--
 ';
+$files['b'] = 'b';
+$files['c'] = 'c';
+include __DIR__.'/files/phar_test.inc';
+$phar = new Phar($fname);
+$phar->compressFiles(Phar::GZ);
+$phar = $phar->convertToExecutable(Phar::TAR);
+$phar = $phar->convertToExecutable(Phar::PHAR, Phar::GZ);
+var_dump($phar['b']->openFile()->fread(4096));
+var_dump($phar['c']->openFile()->fread(4096));
+?>
+--CLEAN--
+
+--EXPECT--
+string(1) "b"
+string(1) "c"
diff --git a/ext/phar/tests/phar_oo_002.phpt b/ext/phar/tests/phar_oo_002.phpt
index 71e0e78a03f53..e1a959c4e5f17 100644
--- a/ext/phar/tests/phar_oo_002.phpt
+++ b/ext/phar/tests/phar_oo_002.phpt
@@ -5,6 +5,12 @@ phar
 --INI--
 phar.readonly=1
 phar.require_hash=0
+--SKIPIF--
+
 --FILE--
 eof())
 {
-    echo $v->key() . "=>" . join('|', $v->fgetcsv()) . "\n";
+    echo $v->key() . "=>" . join('|', $v->fgetcsv(escape: '')) . "\n";
 }
 
 echo "===4===\n";
 $v->rewind();
 while(!$v->eof())
 {
-    $l = $v->fgetcsv();
+    $l = $v->fgetcsv(escape: '');
     echo $v->key() . "=>" . join('|', $l) . "\n";
 }
 
@@ -66,7 +66,7 @@ class MyCSVFile2 extends SplFileObject
     function getCurrentLine(): string
     {
         echo __METHOD__ . "\n";
-        return implode('|', parent::fgetcsv(',', '"'));
+        return implode('|', parent::fgetcsv(',', '"', escape: ''));
     }
 }
 
diff --git a/ext/phar/tests/phar_oo_iswriteable.phpt b/ext/phar/tests/phar_oo_iswriteable.phpt
index 836feb4ba8d5d..789d17f10acf1 100644
--- a/ext/phar/tests/phar_oo_iswriteable.phpt
+++ b/ext/phar/tests/phar_oo_iswriteable.phpt
@@ -5,6 +5,12 @@ phar
 --INI--
 phar.readonly=0
 phar.require_hash=0
+--SKIPIF--
+
 --FILE--
 
 --FILE--
 
 --FILE--
 
 --FILE--
 fname;
-		*filename_len = fd_ptr->fname_len;
-		return SUCCESS;
-	}
-	return FAILURE;
-}
-/* }}} */
-
 zend_result phar_free_alias(phar_archive_data *phar, char *alias, size_t alias_len) /* {{{ */
 {
 	if (phar->refcount || phar->is_persistent) {
diff --git a/ext/phar/zip.c b/ext/phar/zip.c
index 70cdfc9cc1b50..ad0e53a80c4b2 100644
--- a/ext/phar/zip.c
+++ b/ext/phar/zip.c
@@ -1251,14 +1251,13 @@ static int phar_zip_applysignature(phar_archive_data *phar, struct _phar_zip_pas
 }
 /* }}} */
 
-int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int defaultstub, char **error) /* {{{ */
+void phar_zip_flush(phar_archive_data *phar, zend_string *user_stub, bool is_default_stub, char **error) /* {{{ */
 {
-	char *pos;
 	static const char newstub[] = "fname);
 		}
-		return EOF;
+		return;
 	}
 
 	if (phar->is_data) {
@@ -1289,13 +1288,13 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 		entry.fp = php_stream_fopen_tmpfile();
 		if (entry.fp == NULL) {
 			spprintf(error, 0, "phar error: unable to create temporary file");
-			return EOF;
+			return;
 		}
 		if (phar->alias_len != php_stream_write(entry.fp, phar->alias, phar->alias_len)) {
 			if (error) {
 				spprintf(error, 0, "unable to set alias in zip-based phar \"%s\"", phar->fname);
 			}
-			return EOF;
+			return;
 		}
 
 		entry.uncompressed_filesize = entry.compressed_filesize = phar->alias_len;
@@ -1310,112 +1309,67 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 	/* register alias */
 	if (phar->alias_len) {
 		if (FAILURE == phar_get_archive(&phar, phar->fname, phar->fname_len, phar->alias, phar->alias_len, error)) {
-			return EOF;
+			return;
 		}
 	}
 
 	/* set stub */
-	if (user_stub && !defaultstub) {
-		if (len < 0) {
-			/* resource passed in */
-			if (!(php_stream_from_zval_no_verify(stubfile, (zval *)user_stub))) {
-				if (error) {
-					spprintf(error, 0, "unable to access resource to copy stub to new zip-based phar \"%s\"", phar->fname);
-				}
-				return EOF;
-			}
-
-			if (len == -1) {
-				len = PHP_STREAM_COPY_ALL;
-			} else {
-				len = -len;
-			}
-
-			user_stub = 0;
-
-			// TODO: refactor to avoid reallocation ???
-//???		len = php_stream_copy_to_mem(stubfile, &user_stub, len, 0)
-			{
-				zend_string *str = php_stream_copy_to_mem(stubfile, len, 0);
-				if (str) {
-					len = ZSTR_LEN(str);
-					user_stub = estrndup(ZSTR_VAL(str), ZSTR_LEN(str));
-					zend_string_release_ex(str, 0);
-				} else {
-					user_stub = NULL;
-					len = 0;
-				}
-			}
+	if (user_stub && !is_default_stub) {
+		char *pos = php_stristr(ZSTR_VAL(user_stub), halt_stub, ZSTR_LEN(user_stub), strlen(halt_stub));
 
-			if (!len || !user_stub) {
-				if (error) {
-					spprintf(error, 0, "unable to read resource to copy stub to new zip-based phar \"%s\"", phar->fname);
-				}
-				return EOF;
-			}
-			free_user_stub = 1;
-		} else {
-			free_user_stub = 0;
-		}
-
-		if ((pos = php_stristr(user_stub, halt_stub, len, sizeof(halt_stub) - 1)) == NULL) {
+		if (pos == NULL) {
 			if (error) {
 				spprintf(error, 0, "illegal stub for zip-based phar \"%s\"", phar->fname);
 			}
-			if (free_user_stub) {
-				efree(user_stub);
-			}
-			return EOF;
+			return;
 		}
 
-		len = pos - user_stub + 18;
+		size_t len = pos - ZSTR_VAL(user_stub) + strlen(halt_stub);
+		const char end_sequence[] = " ?>\r\n";
+		size_t end_sequence_len = strlen(end_sequence);
+
 		entry.fp = php_stream_fopen_tmpfile();
 		if (entry.fp == NULL) {
 			spprintf(error, 0, "phar error: unable to create temporary file");
-			return EOF;
+			return;
 		}
-		entry.uncompressed_filesize = len + 5;
+		entry.uncompressed_filesize = len + end_sequence_len;
 
-		if ((size_t)len != php_stream_write(entry.fp, user_stub, len)
-		||            5 != php_stream_write(entry.fp, " ?>\r\n", 5)) {
+		if (
+			len != php_stream_write(entry.fp, ZSTR_VAL(user_stub), len)
+			|| end_sequence_len != php_stream_write(entry.fp, end_sequence, end_sequence_len)
+		) {
 			if (error) {
 				spprintf(error, 0, "unable to create stub from string in new zip-based phar \"%s\"", phar->fname);
 			}
-			if (free_user_stub) {
-				efree(user_stub);
-			}
 			php_stream_close(entry.fp);
-			return EOF;
+			return;
 		}
 
 		entry.filename = estrndup(".phar/stub.php", sizeof(".phar/stub.php")-1);
 		entry.filename_len = sizeof(".phar/stub.php")-1;
 
 		zend_hash_str_update_mem(&phar->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info));
-
-		if (free_user_stub) {
-			efree(user_stub);
-		}
 	} else {
 		/* Either this is a brand new phar (add the stub), or the default stub is required (overwrite the stub) */
 		entry.fp = php_stream_fopen_tmpfile();
 		if (entry.fp == NULL) {
 			spprintf(error, 0, "phar error: unable to create temporary file");
-			return EOF;
+			return;
 		}
 		if (sizeof(newstub)-1 != php_stream_write(entry.fp, newstub, sizeof(newstub)-1)) {
 			php_stream_close(entry.fp);
 			if (error) {
 				spprintf(error, 0, "unable to %s stub in%szip-based phar \"%s\", failed", user_stub ? "overwrite" : "create", user_stub ? " " : " new ", phar->fname);
 			}
-			return EOF;
+			return;
 		}
 
 		entry.uncompressed_filesize = entry.compressed_filesize = sizeof(newstub) - 1;
 		entry.filename = estrndup(".phar/stub.php", sizeof(".phar/stub.php")-1);
 		entry.filename_len = sizeof(".phar/stub.php")-1;
 
-		if (!defaultstub) {
+		if (!is_default_stub) {
 			if (!zend_hash_str_exists(&phar->manifest, ".phar/stub.php", sizeof(".phar/stub.php")-1)) {
 				if (NULL == zend_hash_str_add_mem(&phar->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info))) {
 					php_stream_close(entry.fp);
@@ -1423,7 +1377,7 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 					if (error) {
 						spprintf(error, 0, "unable to create stub in zip-based phar \"%s\"", phar->fname);
 					}
-					return EOF;
+					return;
 				}
 			} else {
 				php_stream_close(entry.fp);
@@ -1436,11 +1390,11 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 nostub:
 	if (phar->fp && !phar->is_brandnew) {
 		oldfile = phar->fp;
-		closeoldfile = 0;
+		must_close_old_file = false;
 		php_stream_rewind(oldfile);
 	} else {
 		oldfile = php_stream_open_wrapper(phar->fname, "rb", 0, NULL);
-		closeoldfile = oldfile != NULL;
+		must_close_old_file = oldfile != NULL;
 	}
 
 	/* save modified files to the zip */
@@ -1449,13 +1403,13 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 
 	if (!pass.filefp) {
 fperror:
-		if (closeoldfile) {
+		if (must_close_old_file) {
 			php_stream_close(oldfile);
 		}
 		if (error) {
 			spprintf(error, 4096, "phar zip flush of \"%s\" failed: unable to open temporary file", phar->fname);
 		}
-		return EOF;
+		return;
 	}
 
 	pass.centralfp = php_stream_fopen_tmpfile();
@@ -1490,10 +1444,10 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 		php_stream_close(pass.centralfp);
 nocentralerror:
 		php_stream_close(pass.filefp);
-		if (closeoldfile) {
+		if (must_close_old_file) {
 			php_stream_close(oldfile);
 		}
-		return EOF;
+		return;
 	}
 
 	if (FAILURE == phar_zip_applysignature(phar, &pass)) {
@@ -1567,14 +1521,14 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 	} else {
 		phar->fp = php_stream_open_wrapper(phar->fname, "w+b", IGNORE_URL|STREAM_MUST_SEEK|REPORT_ERRORS, NULL);
 		if (!phar->fp) {
-			if (closeoldfile) {
+			if (must_close_old_file) {
 				php_stream_close(oldfile);
 			}
 			phar->fp = pass.filefp;
 			if (error) {
 				spprintf(error, 4096, "unable to open new phar \"%s\" for writing", phar->fname);
 			}
-			return EOF;
+			return;
 		}
 		php_stream_rewind(pass.filefp);
 		php_stream_copy_to_stream_ex(pass.filefp, phar->fp, PHP_STREAM_COPY_ALL, NULL);
@@ -1582,9 +1536,8 @@ int phar_zip_flush(phar_archive_data *phar, char *user_stub, zend_long len, int
 		php_stream_close(pass.filefp);
 	}
 
-	if (closeoldfile) {
+	if (must_close_old_file) {
 		php_stream_close(oldfile);
 	}
-	return EOF;
 }
 /* }}} */
diff --git a/ext/posix/tests/posix_getgrnam_basic.phpt b/ext/posix/tests/posix_getgrnam_basic.phpt
index acf8f4473e5d8..86e2dd390b430 100644
--- a/ext/posix/tests/posix_getgrnam_basic.phpt
+++ b/ext/posix/tests/posix_getgrnam_basic.phpt
@@ -4,7 +4,10 @@ Test posix_getgrnam() function : basic functionality
 posix
 --SKIPIF--
 
 --FILE--
 
 --FILE--
 = 201405) || (defined(__NetBSD__) && __NetBSD_Version__ >= 700000001 && __NetBSD_Version__ < 1000000000) || \
-  defined(__APPLE__))
+  defined(__APPLE__) || defined(__HAIKU__))
 	/*
 	 * OpenBSD until there is a valid equivalent
 	 * or NetBSD before the 10.x release
diff --git a/ext/random/random_arginfo.h b/ext/random/random_arginfo.h
index 744b625e06971..3b06d7ba9e4f3 100644
--- a/ext/random/random_arginfo.h
+++ b/ext/random/random_arginfo.h
@@ -229,7 +229,7 @@ static void register_random_symbols(int module_number)
 	REGISTER_LONG_CONSTANT("MT_RAND_PHP", MT_RAND_PHP, CONST_PERSISTENT | CONST_DEPRECATED);
 
 
-	zend_attribute *attribute_Deprecated_func_lcg_value_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "lcg_value", sizeof("lcg_value") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_lcg_value_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "lcg_value", sizeof("lcg_value") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_lcg_value_0_arg0;
 	zend_string *attribute_Deprecated_func_lcg_value_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_lcg_value_0_arg0, attribute_Deprecated_func_lcg_value_0_arg0_str);
diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c
index 379641d5b8d78..0585ea95e668e 100644
--- a/ext/random/randomizer.c
+++ b/ext/random/randomizer.c
@@ -356,7 +356,7 @@ PHP_METHOD(Random_Randomizer, shuffleArray)
 		Z_PARAM_ARRAY(array)
 	ZEND_PARSE_PARAMETERS_END();
 
-	ZVAL_DUP(return_value, array);
+	RETVAL_ARR(zend_array_dup(Z_ARRVAL_P(array)));
 	if (!php_array_data_shuffle(randomizer->engine, return_value)) {
 		RETURN_THROWS();
 	}
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index bc3067f3a6545..d94e20db9c32d 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -186,7 +186,7 @@ PHP_FUNCTION(readline_info)
 				if (!try_convert_to_string(value)) {
 					RETURN_THROWS();
 				}
-#if !defined(PHP_WIN32) && !HAVE_LIBEDIT
+#if !defined(PHP_WIN32) && !defined(HAVE_LIBEDIT)
 				if (!rl_line_buffer) {
 					rl_line_buffer = malloc(Z_STRLEN_P(value) + 1);
 				} else if (strlen(oldstr) < Z_STRLEN_P(value)) {
@@ -453,19 +453,14 @@ static void _readline_string_zval(zval *ret, const char *str)
 	}
 }
 
-static void _readline_long_zval(zval *ret, long l)
-{
-	ZVAL_LONG(ret, l);
-}
-
 char **php_readline_completion_cb(const char *text, int start, int end)
 {
 	zval params[3];
 	char **matches = NULL;
 
 	_readline_string_zval(¶ms[0], text);
-	_readline_long_zval(¶ms[1], start);
-	_readline_long_zval(¶ms[2], end);
+	ZVAL_LONG(¶ms[1], start);
+	ZVAL_LONG(¶ms[2], end);
 
 	if (call_user_function(NULL, NULL, &_readline_completion, &_readline_array, 3, params) == SUCCESS) {
 		if (Z_TYPE(_readline_array) == IS_ARRAY) {
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 289c9392124e9..a5562f165f76e 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -188,11 +188,11 @@ static inline reflection_object *reflection_object_from_obj(zend_object *obj) {
 
 static zend_object_handlers reflection_object_handlers;
 
-static zend_always_inline uint32_t prop_get_flags(property_reference *ref) {
+static zend_always_inline uint32_t prop_get_flags(const property_reference *ref) {
 	return ref->prop ? ref->prop->flags : ZEND_ACC_PUBLIC;
 }
 
-static inline bool is_closure_invoke(zend_class_entry *ce, zend_string *lcname) {
+static inline bool is_closure_invoke(const zend_class_entry *ce, const zend_string *lcname) {
 	return ce == zend_ce_closure
 		&& zend_string_equals_literal(lcname, ZEND_INVOKE_FUNC_NAME);
 }
@@ -302,16 +302,16 @@ static zval *reflection_instantiate(zend_class_entry *pce, zval *object) /* {{{
 }
 /* }}} */
 
-static void _const_string(smart_str *str, char *name, zval *value, char *indent);
-static void _function_string(smart_str *str, zend_function *fptr, zend_class_entry *scope, char* indent);
-static void _property_string(smart_str *str, zend_property_info *prop, const char *prop_name, char* indent);
-static void _class_const_string(smart_str *str, zend_string *name, zend_class_constant *c, char* indent);
-static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char *indent);
-static void _extension_string(smart_str *str, zend_module_entry *module, char *indent);
-static void _zend_extension_string(smart_str *str, zend_extension *extension, char *indent);
+static void _const_string(smart_str *str, const char *name, zval *value, const char *indent);
+static void _function_string(smart_str *str, zend_function *fptr, zend_class_entry *scope, const char* indent);
+static void _property_string(smart_str *str, zend_property_info *prop, const char *prop_name, const char* indent);
+static void _class_const_string(smart_str *str, const zend_string *name, zend_class_constant *c, const char* indent);
+static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, const char *indent);
+static void _extension_string(smart_str *str, const zend_module_entry *module, const char *indent);
+static void _zend_extension_string(smart_str *str, const zend_extension *extension, const char *indent);
 
 /* {{{ _class_string */
-static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char *indent)
+static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, const char *indent)
 {
 	int count, count_static_props = 0, count_static_funcs = 0, count_shadow_props = 0;
 	zend_string *sub_indent = strpprintf(0, "%s    ", indent);
@@ -484,7 +484,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char
 
 		count = 0;
 		if (properties && zend_hash_num_elements(properties)) {
-			ZEND_HASH_MAP_FOREACH_STR_KEY(properties, prop_name) {
+			ZEND_HASH_FOREACH_STR_KEY(properties, prop_name) {
 				if (prop_name && ZSTR_LEN(prop_name) && ZSTR_VAL(prop_name)[0]) { /* skip all private and protected properties */
 					if (!zend_hash_exists(&ce->properties_info, prop_name)) {
 						count++;
@@ -543,7 +543,7 @@ static void _class_string(smart_str *str, zend_class_entry *ce, zval *obj, char
 /* }}} */
 
 /* {{{ _const_string */
-static void _const_string(smart_str *str, char *name, zval *value, char *indent)
+static void _const_string(smart_str *str, const char *name, zval *value, const char *indent)
 {
 	const char *type = zend_zval_type_name(value);
 	uint32_t flags = Z_CONSTANT_FLAGS_P(value);
@@ -592,7 +592,7 @@ static void _const_string(smart_str *str, char *name, zval *value, char *indent)
 /* }}} */
 
 /* {{{ _class_const_string */
-static void _class_const_string(smart_str *str, zend_string *name, zend_class_constant *c, char *indent)
+static void _class_const_string(smart_str *str, const zend_string *name, zend_class_constant *c, const char *indent)
 {
 	if (Z_TYPE(c->value) == IS_CONSTANT_AST && zend_update_class_constant(c, name, c->ce) == FAILURE) {
 		return;
@@ -626,10 +626,10 @@ static void _class_const_string(smart_str *str, zend_string *name, zend_class_co
 }
 /* }}} */
 
-static zend_op *get_recv_op(zend_op_array *op_array, uint32_t offset)
+static zend_op *get_recv_op(const zend_op_array *op_array, uint32_t offset)
 {
 	zend_op *op = op_array->opcodes;
-	zend_op *end = op + op_array->last;
+	const zend_op *end = op + op_array->last;
 
 	++offset;
 	while (op < end) {
@@ -772,11 +772,11 @@ static void _function_parameter_string(smart_str *str, zend_function *fptr, char
 /* }}} */
 
 /* {{{ _function_closure_string */
-static void _function_closure_string(smart_str *str, zend_function *fptr, char* indent)
+static void _function_closure_string(smart_str *str, const zend_function *fptr, const char* indent)
 {
 	uint32_t i, count;
-	zend_string *key;
-	HashTable *static_variables;
+	const zend_string *key;
+	const HashTable *static_variables;
 
 	if (fptr->type != ZEND_USER_FUNCTION || !fptr->op_array.static_variables) {
 		return;
@@ -790,7 +790,7 @@ static void _function_closure_string(smart_str *str, zend_function *fptr, char*
 	}
 
 	smart_str_append_printf(str, "\n");
-	smart_str_append_printf(str, "%s- Bound Variables [%d] {\n", indent, zend_hash_num_elements(static_variables));
+	smart_str_append_printf(str, "%s- Bound Variables [%u] {\n", indent, count);
 	i = 0;
 	ZEND_HASH_MAP_FOREACH_STR_KEY(static_variables, key) {
 		smart_str_append_printf(str, "%s    Variable #%d [ $%s ]\n", indent, i++, ZSTR_VAL(key));
@@ -800,7 +800,7 @@ static void _function_closure_string(smart_str *str, zend_function *fptr, char*
 /* }}} */
 
 /* {{{ _function_string */
-static void _function_string(smart_str *str, zend_function *fptr, zend_class_entry *scope, char* indent)
+static void _function_string(smart_str *str, zend_function *fptr, zend_class_entry *scope, const char* indent)
 {
 	smart_str param_indent = {0};
 	zend_function *overwrites;
@@ -923,7 +923,7 @@ static zval *property_get_default(zend_property_info *prop_info) {
 }
 
 /* {{{ _property_string */
-static void _property_string(smart_str *str, zend_property_info *prop, const char *prop_name, char* indent)
+static void _property_string(smart_str *str, zend_property_info *prop, const char *prop_name, const char* indent)
 {
 	if (prop && prop->doc_comment) {
 		smart_str_append_printf(str, "%s%s\n", indent, ZSTR_VAL(prop->doc_comment));
@@ -986,7 +986,7 @@ static void _property_string(smart_str *str, zend_property_info *prop, const cha
 }
 /* }}} */
 
-static void _extension_ini_string(zend_ini_entry *ini_entry, smart_str *str, char *indent, int number) /* {{{ */
+static void _extension_ini_string(const zend_ini_entry *ini_entry, smart_str *str, const char *indent, int number) /* {{{ */
 {
 	char *comma = "";
 
@@ -1018,7 +1018,7 @@ static void _extension_ini_string(zend_ini_entry *ini_entry, smart_str *str, cha
 }
 /* }}} */
 
-static void _extension_class_string(zend_class_entry *ce, zend_string *key, smart_str *str, char *indent, zend_module_entry *module, int *num_classes) /* {{{ */
+static void _extension_class_string(zend_class_entry *ce, zend_string *key, smart_str *str, const char *indent, const zend_module_entry *module, int *num_classes) /* {{{ */
 {
 	if (ce->type == ZEND_INTERNAL_CLASS && ce->info.internal.module && !strcasecmp(ce->info.internal.module->name, module->name)) {
 		/* dump class if it is not an alias */
@@ -1031,7 +1031,7 @@ static void _extension_class_string(zend_class_entry *ce, zend_string *key, smar
 }
 /* }}} */
 
-static void _extension_string(smart_str *str, zend_module_entry *module, char *indent) /* {{{ */
+static void _extension_string(smart_str *str, const zend_module_entry *module, const char *indent) /* {{{ */
 {
 	smart_str_append_printf(str, "%sExtension [ ", indent);
 	if (module->type == MODULE_PERSISTENT) {
@@ -1270,7 +1270,7 @@ static void reflect_attributes(INTERNAL_FUNCTION_PARAMETERS, HashTable *attribut
 }
 /* }}} */
 
-static void _zend_extension_string(smart_str *str, zend_extension *extension, char *indent) /* {{{ */
+static void _zend_extension_string(smart_str *str, const zend_extension *extension, const char *indent) /* {{{ */
 {
 	smart_str_append_printf(str, "%sZend Extension [ %s ", indent, extension->name);
 
@@ -1573,7 +1573,7 @@ static int get_parameter_default(zval *result, parameter_reference *param) {
 /* {{{ Preventing __clone from being called */
 ZEND_METHOD(ReflectionClass, __clone)
 {
-	/* Should never be executable */
+	/* __clone() is private but this is reachable with reflection */
 	_DO_THROW("Cannot clone object using __clone()");
 }
 /* }}} */
@@ -1595,6 +1595,9 @@ ZEND_METHOD(Reflection, getModifierNames)
 	if (modifiers & ZEND_ACC_FINAL) {
 		add_next_index_stringl(return_value, "final", sizeof("final")-1);
 	}
+	if (modifiers & ZEND_ACC_VIRTUAL) {
+		add_next_index_stringl(return_value, "virtual", sizeof("virtual")-1);
+	}
 
 	/* These are mutually exclusive */
 	switch (modifiers & ZEND_ACC_PPP_MASK) {
@@ -3584,6 +3587,10 @@ ZEND_METHOD(ReflectionFunctionAbstract, inNamespace)
 
 	GET_REFLECTION_OBJECT_PTR(fptr);
 
+	if ((fptr->common.fn_flags & (ZEND_ACC_CLOSURE | ZEND_ACC_FAKE_CLOSURE)) == ZEND_ACC_CLOSURE) {
+		RETURN_FALSE;
+	}
+
 	zend_string *name = fptr->common.function_name;
 	const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
 	RETURN_BOOL(backslash);
@@ -3602,6 +3609,10 @@ ZEND_METHOD(ReflectionFunctionAbstract, getNamespaceName)
 
 	GET_REFLECTION_OBJECT_PTR(fptr);
 
+	if ((fptr->common.fn_flags & (ZEND_ACC_CLOSURE | ZEND_ACC_FAKE_CLOSURE)) == ZEND_ACC_CLOSURE) {
+		RETURN_EMPTY_STRING();
+	}
+
 	zend_string *name = fptr->common.function_name;
 	const char *backslash = zend_memrchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name));
 	if (backslash) {
@@ -4003,9 +4014,8 @@ ZEND_METHOD(ReflectionClassConstant, getValue)
 	reflection_object *intern;
 	zend_class_constant *ref;
 
-	if (zend_parse_parameters_none() == FAILURE) {
-		RETURN_THROWS();
-	}
+	ZEND_PARSE_PARAMETERS_NONE();
+
 	GET_REFLECTION_OBJECT_PTR(ref);
 
 	zval *name = reflection_prop_name(ZEND_THIS);
@@ -4652,7 +4662,7 @@ ZEND_METHOD(ReflectionClass, hasProperty)
 		RETURN_TRUE;
 	} else {
 		if (Z_TYPE(intern->obj) != IS_UNDEF) {
-			if (Z_OBJ_HANDLER(intern->obj, has_property)(Z_OBJ(intern->obj), name, 2, NULL)) {
+			if (Z_OBJ_HANDLER(intern->obj, has_property)(Z_OBJ(intern->obj), name, ZEND_PROPERTY_EXISTS, NULL)) {
 				RETURN_TRUE;
 			}
 		}
@@ -5921,8 +5931,7 @@ ZEND_METHOD(ReflectionProperty, isVirtual)
 	_property_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_VIRTUAL);
 }
 
-/* {{{ Returns whether this property is default (declared at compilation time). */
-ZEND_METHOD(ReflectionProperty, isDefault)
+static void _property_check_dynamic(INTERNAL_FUNCTION_PARAMETERS, bool dynamic_true)
 {
 	reflection_object *intern;
 	property_reference *ref;
@@ -5931,7 +5940,21 @@ ZEND_METHOD(ReflectionProperty, isDefault)
 		RETURN_THROWS();
 	}
 	GET_REFLECTION_OBJECT_PTR(ref);
-	RETURN_BOOL(ref->prop != NULL);
+	bool is_dynamic = ref->prop == NULL;
+	RETURN_BOOL(dynamic_true ? is_dynamic : !is_dynamic);
+}
+
+/* {{{ Returns whether this property is default (declared at compilation time). */
+ZEND_METHOD(ReflectionProperty, isDefault)
+{
+	_property_check_dynamic(INTERNAL_FUNCTION_PARAM_PASSTHRU, false);
+}
+/* }}} */
+
+/* {{{ Returns whether this property is dynamic (not declared at compilation time). */
+ZEND_METHOD(ReflectionProperty, isDynamic)
+{
+	_property_check_dynamic(INTERNAL_FUNCTION_PARAM_PASSTHRU, true);
 }
 /* }}} */
 
@@ -5947,7 +5970,7 @@ ZEND_METHOD(ReflectionProperty, getModifiers)
 {
 	reflection_object *intern;
 	property_reference *ref;
-	uint32_t keep_flags = ZEND_ACC_PPP_MASK | ZEND_ACC_PPP_SET_MASK | ZEND_ACC_STATIC | ZEND_ACC_READONLY | ZEND_ACC_ABSTRACT | ZEND_ACC_VIRTUAL;
+	uint32_t keep_flags = ZEND_ACC_PPP_MASK | ZEND_ACC_PPP_SET_MASK | ZEND_ACC_STATIC | ZEND_ACC_READONLY | ZEND_ACC_ABSTRACT | ZEND_ACC_VIRTUAL | ZEND_ACC_FINAL;
 
 	if (zend_parse_parameters_none() == FAILURE) {
 		RETURN_THROWS();
@@ -6009,7 +6032,6 @@ ZEND_METHOD(ReflectionProperty, setValue)
 {
 	reflection_object *intern;
 	property_reference *ref;
-	zval *object;
 	zval *value;
 	zval *tmp;
 
@@ -6040,11 +6062,13 @@ ZEND_METHOD(ReflectionProperty, setValue)
 
 		zend_update_static_property_ex(intern->ce, ref->unmangled_name, value);
 	} else {
-		if (zend_parse_parameters(ZEND_NUM_ARGS(), "oz", &object, &value) == FAILURE) {
-			RETURN_THROWS();
-		}
+		zend_object *object;
+		ZEND_PARSE_PARAMETERS_START(2, 2)
+			Z_PARAM_OBJ(object)
+			Z_PARAM_ZVAL(value)
+		ZEND_PARSE_PARAMETERS_END();
 
-		zend_update_property_ex(intern->ce, Z_OBJ_P(object), ref->unmangled_name, value);
+		zend_update_property_ex(intern->ce, object, ref->unmangled_name, value);
 	}
 }
 /* }}} */
@@ -6161,7 +6185,7 @@ static zend_result reflection_property_check_lazy_compatible(reflection_object *
 	return SUCCESS;
 }
 
-/* {{{ Set property value withtout triggering initializer while skipping hooks if any */
+/* {{{ Set property value without triggering initializer while skipping hooks if any */
 ZEND_METHOD(ReflectionProperty, setRawValueWithoutLazyInitialization)
 {
 	reflection_object *intern;
@@ -6496,6 +6520,18 @@ ZEND_METHOD(ReflectionProperty, getDefaultValue)
 }
 /* }}} */
 
+ZEND_METHOD(ReflectionProperty, hasHooks)
+{
+	reflection_object *intern;
+	property_reference *ref;
+
+	ZEND_PARSE_PARAMETERS_NONE();
+
+	GET_REFLECTION_OBJECT_PTR(ref);
+
+	RETURN_BOOL(ref->prop && ref->prop->hooks);
+}
+
 ZEND_METHOD(ReflectionProperty, getHooks)
 {
 	reflection_object *intern;
@@ -6525,6 +6561,29 @@ ZEND_METHOD(ReflectionProperty, getHooks)
 	}
 }
 
+ZEND_METHOD(ReflectionProperty, hasHook)
+{
+
+	reflection_object *intern;
+	property_reference *ref;
+	zend_object *type;
+
+	ZEND_PARSE_PARAMETERS_START(1, 1)
+		Z_PARAM_OBJ_OF_CLASS(type, reflection_property_hook_type_ptr)
+	ZEND_PARSE_PARAMETERS_END();
+
+	GET_REFLECTION_OBJECT_PTR(ref);
+
+	zend_property_hook_kind kind;
+	if (zend_string_equals_literal(Z_STR_P(zend_enum_fetch_case_name(type)), "Get")) {
+		kind = ZEND_PROPERTY_HOOK_GET;
+	} else {
+		kind = ZEND_PROPERTY_HOOK_SET;
+	}
+
+	RETURN_BOOL(ref->prop && ref->prop->hooks && ref->prop->hooks[kind]);
+}
+
 ZEND_METHOD(ReflectionProperty, getHook)
 {
 	reflection_object *intern;
@@ -6556,6 +6615,11 @@ ZEND_METHOD(ReflectionProperty, getHook)
 	reflection_method_factory(hook->common.scope, hook, NULL, return_value);
 }
 
+ZEND_METHOD(ReflectionProperty, isFinal)
+{
+	_property_check_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_ACC_FINAL);
+}
+
 /* {{{ Constructor. Throws an Exception in case the given extension does not exist */
 ZEND_METHOD(ReflectionExtension, __construct)
 {
@@ -7130,7 +7194,7 @@ ZEND_METHOD(ReflectionAttribute, __construct)
 
 ZEND_METHOD(ReflectionAttribute, __clone)
 {
-	/* Should never be executable */
+	/* __clone() is private but this is reachable with reflection */
 	_DO_THROW("Cannot clone object using __clone()");
 }
 
diff --git a/ext/reflection/php_reflection.stub.php b/ext/reflection/php_reflection.stub.php
index 366c13f3a1a1d..d9acc08d22424 100644
--- a/ext/reflection/php_reflection.stub.php
+++ b/ext/reflection/php_reflection.stub.php
@@ -146,22 +146,16 @@ final class ReflectionGenerator
 {
     public function __construct(Generator $generator) {}
 
-    /** @tentative-return-type */
     public function getExecutingLine(): int {}
 
-    /** @tentative-return-type */
     public function getExecutingFile(): string {}
 
-    /** @tentative-return-type */
     public function getTrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT): array {}
 
-    /** @tentative-return-type */
     public function getFunction(): ReflectionFunctionAbstract {}
 
-    /** @tentative-return-type */
     public function getThis(): ?object {}
 
-    /** @tentative-return-type */
     public function getExecutingGenerator(): Generator {}
 
     public function isClosed(): bool {}
@@ -470,6 +464,10 @@ class ReflectionProperty implements Reflector
     public const int IS_PROTECTED_SET = UNKNOWN;
     /** @cvalue ZEND_ACC_PRIVATE_SET */
     public const int IS_PRIVATE_SET = UNKNOWN;
+    /** @cvalue ZEND_ACC_VIRTUAL */
+    public const int IS_VIRTUAL = UNKNOWN;
+    /** @cvalue ZEND_ACC_FINAL */
+    public const int IS_FINAL = UNKNOWN;
 
     public string $name;
     public string $class;
@@ -522,6 +520,8 @@ public function isReadOnly(): bool {}
     /** @tentative-return-type */
     public function isDefault(): bool {}
 
+    public function isDynamic(): bool {}
+
     public function isAbstract(): bool {}
 
     public function isVirtual(): bool {}
@@ -555,10 +555,16 @@ public function getDefaultValue(): mixed {}
 
     public function getAttributes(?string $name = null, int $flags = 0): array {}
 
+    public function hasHooks(): bool {}
+
     /** @return array
 */
     public function getHooks(): array {}
 
+    public function hasHook(PropertyHookType $type): bool {}
+
     public function getHook(PropertyHookType $type): ?ReflectionMethod {}
+
+    public function isFinal(): bool {}
 }
 
 /** @not-serializable */
diff --git a/ext/reflection/php_reflection_arginfo.h b/ext/reflection/php_reflection_arginfo.h
index 68c0229d03c01..92d80de5a60ca 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 the .stub.php file instead.
- * Stub hash: 09e21577c53d8b53e30aa30e3208d3807ecd8852 */
+ * Stub hash: 1cdf310b94e2297a4e426bd4c0c1ab4d5995936d */
 
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_Reflection_getModifierNames, 0, 1, IS_ARRAY, 0)
 	ZEND_ARG_TYPE_INFO(0, modifiers, IS_LONG, 0)
@@ -112,20 +112,22 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionGenerator___construct, 0, 0, 1)
 	ZEND_ARG_OBJ_INFO(0, generator, Generator, 0)
 ZEND_END_ARG_INFO()
 
-#define arginfo_class_ReflectionGenerator_getExecutingLine arginfo_class_ReflectionFunctionAbstract_getNumberOfParameters
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionGenerator_getExecutingLine, 0, 0, IS_LONG, 0)
+ZEND_END_ARG_INFO()
 
-#define arginfo_class_ReflectionGenerator_getExecutingFile arginfo_class_ReflectionFunctionAbstract_getName
+#define arginfo_class_ReflectionGenerator_getExecutingFile arginfo_class_ReflectionFunction___toString
 
-ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionGenerator_getTrace, 0, 0, IS_ARRAY, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionGenerator_getTrace, 0, 0, IS_ARRAY, 0)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "DEBUG_BACKTRACE_PROVIDE_OBJECT")
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionGenerator_getFunction, 0, 0, ReflectionFunctionAbstract, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionGenerator_getFunction, 0, 0, ReflectionFunctionAbstract, 0)
 ZEND_END_ARG_INFO()
 
-#define arginfo_class_ReflectionGenerator_getThis arginfo_class_ReflectionFunctionAbstract_getClosureThis
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionGenerator_getThis, 0, 0, IS_OBJECT, 1)
+ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionGenerator_getExecutingGenerator, 0, 0, Generator, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionGenerator_getExecutingGenerator, 0, 0, Generator, 0)
 ZEND_END_ARG_INFO()
 
 #define arginfo_class_ReflectionGenerator_isClosed arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType
@@ -419,6 +421,8 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_ReflectionProperty_isDefault arginfo_class_ReflectionFunctionAbstract_inNamespace
 
+#define arginfo_class_ReflectionProperty_isDynamic arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType
+
 #define arginfo_class_ReflectionProperty_isAbstract arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType
 
 #define arginfo_class_ReflectionProperty_isVirtual arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType
@@ -446,12 +450,20 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_ReflectionProperty_getAttributes arginfo_class_ReflectionFunctionAbstract_getAttributes
 
+#define arginfo_class_ReflectionProperty_hasHooks arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType
+
 #define arginfo_class_ReflectionProperty_getHooks arginfo_class_ReflectionFunctionAbstract_getClosureUsedVariables
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionProperty_hasHook, 0, 1, _IS_BOOL, 0)
+	ZEND_ARG_OBJ_INFO(0, type, PropertyHookType, 0)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionProperty_getHook, 0, 1, ReflectionMethod, 1)
 	ZEND_ARG_OBJ_INFO(0, type, PropertyHookType, 0)
 ZEND_END_ARG_INFO()
 
+#define arginfo_class_ReflectionProperty_isFinal arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType
+
 #define arginfo_class_ReflectionClassConstant___clone arginfo_class_ReflectionFunctionAbstract___clone
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionClassConstant___construct, 0, 0, 2)
@@ -504,7 +516,8 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_ReflectionParameter_canBePassedByValue arginfo_class_ReflectionFunctionAbstract_inNamespace
 
-#define arginfo_class_ReflectionParameter_getDeclaringFunction arginfo_class_ReflectionGenerator_getFunction
+ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionParameter_getDeclaringFunction, 0, 0, ReflectionFunctionAbstract, 0)
+ZEND_END_ARG_INFO()
 
 #define arginfo_class_ReflectionParameter_getDeclaringClass arginfo_class_ReflectionFunctionAbstract_getClosureScopeClass
 
@@ -614,8 +627,7 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_ReflectionAttribute_getName arginfo_class_ReflectionFunction___toString
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionAttribute_getTarget, 0, 0, IS_LONG, 0)
-ZEND_END_ARG_INFO()
+#define arginfo_class_ReflectionAttribute_getTarget arginfo_class_ReflectionGenerator_getExecutingLine
 
 #define arginfo_class_ReflectionAttribute_isRepeated arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType
 
@@ -676,9 +688,7 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionFiber_getCallable, 0, 0, IS_CALLABLE, 0)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionFiber_getTrace, 0, 0, IS_ARRAY, 0)
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_LONG, 0, "DEBUG_BACKTRACE_PROVIDE_OBJECT")
-ZEND_END_ARG_INFO()
+#define arginfo_class_ReflectionFiber_getTrace arginfo_class_ReflectionGenerator_getTrace
 
 #define arginfo_class_ReflectionConstant___construct arginfo_class_ReflectionExtension___construct
 
@@ -842,6 +852,7 @@ ZEND_METHOD(ReflectionProperty, isProtectedSet);
 ZEND_METHOD(ReflectionProperty, isStatic);
 ZEND_METHOD(ReflectionProperty, isReadOnly);
 ZEND_METHOD(ReflectionProperty, isDefault);
+ZEND_METHOD(ReflectionProperty, isDynamic);
 ZEND_METHOD(ReflectionProperty, isAbstract);
 ZEND_METHOD(ReflectionProperty, isVirtual);
 ZEND_METHOD(ReflectionProperty, isPromoted);
@@ -855,8 +866,11 @@ ZEND_METHOD(ReflectionProperty, hasType);
 ZEND_METHOD(ReflectionProperty, hasDefaultValue);
 ZEND_METHOD(ReflectionProperty, getDefaultValue);
 ZEND_METHOD(ReflectionProperty, getAttributes);
+ZEND_METHOD(ReflectionProperty, hasHooks);
 ZEND_METHOD(ReflectionProperty, getHooks);
+ZEND_METHOD(ReflectionProperty, hasHook);
 ZEND_METHOD(ReflectionProperty, getHook);
+ZEND_METHOD(ReflectionProperty, isFinal);
 ZEND_METHOD(ReflectionClassConstant, __construct);
 ZEND_METHOD(ReflectionClassConstant, __toString);
 ZEND_METHOD(ReflectionClassConstant, getName);
@@ -1135,6 +1149,7 @@ static const zend_function_entry class_ReflectionProperty_methods[] = {
 	ZEND_ME(ReflectionProperty, isStatic, arginfo_class_ReflectionProperty_isStatic, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionProperty, isReadOnly, arginfo_class_ReflectionProperty_isReadOnly, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionProperty, isDefault, arginfo_class_ReflectionProperty_isDefault, ZEND_ACC_PUBLIC)
+	ZEND_ME(ReflectionProperty, isDynamic, arginfo_class_ReflectionProperty_isDynamic, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionProperty, isAbstract, arginfo_class_ReflectionProperty_isAbstract, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionProperty, isVirtual, arginfo_class_ReflectionProperty_isVirtual, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionProperty, isPromoted, arginfo_class_ReflectionProperty_isPromoted, ZEND_ACC_PUBLIC)
@@ -1148,8 +1163,11 @@ static const zend_function_entry class_ReflectionProperty_methods[] = {
 	ZEND_ME(ReflectionProperty, hasDefaultValue, arginfo_class_ReflectionProperty_hasDefaultValue, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionProperty, getDefaultValue, arginfo_class_ReflectionProperty_getDefaultValue, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionProperty, getAttributes, arginfo_class_ReflectionProperty_getAttributes, ZEND_ACC_PUBLIC)
+	ZEND_ME(ReflectionProperty, hasHooks, arginfo_class_ReflectionProperty_hasHooks, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionProperty, getHooks, arginfo_class_ReflectionProperty_getHooks, ZEND_ACC_PUBLIC)
+	ZEND_ME(ReflectionProperty, hasHook, arginfo_class_ReflectionProperty_hasHook, ZEND_ACC_PUBLIC)
 	ZEND_ME(ReflectionProperty, getHook, arginfo_class_ReflectionProperty_getHook, ZEND_ACC_PUBLIC)
+	ZEND_ME(ReflectionProperty, isFinal, arginfo_class_ReflectionProperty_isFinal, ZEND_ACC_PUBLIC)
 	ZEND_FE_END
 };
 
@@ -1359,9 +1377,7 @@ static zend_class_entry *register_class_ReflectionFunctionAbstract(zend_class_en
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
@@ -1380,7 +1396,7 @@ static zend_class_entry *register_class_ReflectionFunction(zend_class_entry *cla
 	zend_string_release(const_IS_DEPRECATED_name);
 
 
-	zend_attribute *attribute_Deprecated_func_isdisabled_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "isdisabled", sizeof("isdisabled") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_isdisabled_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "isdisabled", sizeof("isdisabled") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_isdisabled_0_arg0;
 	zend_string *attribute_Deprecated_func_isdisabled_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_isdisabled_0_arg0, attribute_Deprecated_func_isdisabled_0_arg0_str);
@@ -1450,9 +1466,7 @@ static zend_class_entry *register_class_ReflectionMethod(zend_class_entry *class
 
 	zval property_class_default_value;
 	ZVAL_UNDEF(&property_class_default_value);
-	zend_string *property_class_name = zend_string_init("class", sizeof("class") - 1, 1);
-	zend_declare_typed_property(class_entry, property_class_name, &property_class_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_class_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_CLASS), &property_class_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
@@ -1503,9 +1517,7 @@ static zend_class_entry *register_class_ReflectionClass(zend_class_entry *class_
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
@@ -1593,17 +1605,25 @@ static zend_class_entry *register_class_ReflectionProperty(zend_class_entry *cla
 	zend_declare_typed_class_constant(class_entry, const_IS_PRIVATE_SET_name, &const_IS_PRIVATE_SET_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release(const_IS_PRIVATE_SET_name);
 
+	zval const_IS_VIRTUAL_value;
+	ZVAL_LONG(&const_IS_VIRTUAL_value, ZEND_ACC_VIRTUAL);
+	zend_string *const_IS_VIRTUAL_name = zend_string_init_interned("IS_VIRTUAL", sizeof("IS_VIRTUAL") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_IS_VIRTUAL_name, &const_IS_VIRTUAL_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_IS_VIRTUAL_name);
+
+	zval const_IS_FINAL_value;
+	ZVAL_LONG(&const_IS_FINAL_value, ZEND_ACC_FINAL);
+	zend_string *const_IS_FINAL_name = zend_string_init_interned("IS_FINAL", sizeof("IS_FINAL") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_IS_FINAL_name, &const_IS_FINAL_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_IS_FINAL_name);
+
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_class_default_value;
 	ZVAL_UNDEF(&property_class_default_value);
-	zend_string *property_class_name = zend_string_init("class", sizeof("class") - 1, 1);
-	zend_declare_typed_property(class_entry, property_class_name, &property_class_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_class_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_CLASS), &property_class_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
@@ -1642,15 +1662,11 @@ static zend_class_entry *register_class_ReflectionClassConstant(zend_class_entry
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_class_default_value;
 	ZVAL_UNDEF(&property_class_default_value);
-	zend_string *property_class_name = zend_string_init("class", sizeof("class") - 1, 1);
-	zend_declare_typed_property(class_entry, property_class_name, &property_class_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_class_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_CLASS), &property_class_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
@@ -1665,12 +1681,10 @@ static zend_class_entry *register_class_ReflectionParameter(zend_class_entry *cl
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 
-	zend_attribute *attribute_Deprecated_func_getclass_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "getclass", sizeof("getclass") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_getclass_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "getclass", sizeof("getclass") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_getclass_0_arg0;
 	zend_string *attribute_Deprecated_func_getclass_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_getclass_0_arg0, attribute_Deprecated_func_getclass_0_arg0_str);
@@ -1682,7 +1696,7 @@ static zend_class_entry *register_class_ReflectionParameter(zend_class_entry *cl
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_getclass_0->args[1].value, &attribute_Deprecated_func_getclass_0_arg1);
 	attribute_Deprecated_func_getclass_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_isarray_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "isarray", sizeof("isarray") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_isarray_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "isarray", sizeof("isarray") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_isarray_0_arg0;
 	zend_string *attribute_Deprecated_func_isarray_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_isarray_0_arg0, attribute_Deprecated_func_isarray_0_arg0_str);
@@ -1694,7 +1708,7 @@ static zend_class_entry *register_class_ReflectionParameter(zend_class_entry *cl
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_isarray_0->args[1].value, &attribute_Deprecated_func_isarray_0_arg1);
 	attribute_Deprecated_func_isarray_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_iscallable_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "iscallable", sizeof("iscallable") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_iscallable_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "iscallable", sizeof("iscallable") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_iscallable_0_arg0;
 	zend_string *attribute_Deprecated_func_iscallable_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_iscallable_0_arg0, attribute_Deprecated_func_iscallable_0_arg0_str);
@@ -1760,9 +1774,7 @@ static zend_class_entry *register_class_ReflectionExtension(zend_class_entry *cl
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
@@ -1777,9 +1789,7 @@ static zend_class_entry *register_class_ReflectionZendExtension(zend_class_entry
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
@@ -1810,9 +1820,7 @@ static zend_class_entry *register_class_ReflectionAttribute(zend_class_entry *cl
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
@@ -1867,9 +1875,7 @@ static zend_class_entry *register_class_ReflectionConstant(zend_class_entry *cla
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	return class_entry;
 }
diff --git a/ext/reflection/tests/ReflectionClass_getProperties_003.phpt b/ext/reflection/tests/ReflectionClass_getProperties_003.phpt
index 63d5d476b4dbd..edb6adc0b6be2 100644
--- a/ext/reflection/tests/ReflectionClass_getProperties_003.phpt
+++ b/ext/reflection/tests/ReflectionClass_getProperties_003.phpt
@@ -14,12 +14,15 @@ class C {
     static public  $pubs2;
     static private  $privs1;
     static private  $privs2;
+    public $hookNoVirt { set { $this->hookNoVirt = strtoupper($value); } }
+    public $hookVirt { get { return 42; } }
 }
 
 $rc = new ReflectionClass("C");
 $StaticFlag = ReflectionProperty::IS_STATIC;
 $pubFlag =  ReflectionProperty::IS_PUBLIC;
 $privFlag = ReflectionProperty::IS_PRIVATE;
+$virtFlag = ReflectionProperty::IS_VIRTUAL;
 
 echo "No properties:";
 var_dump($rc->getProperties(0));
@@ -35,11 +38,14 @@ var_dump($rc->getProperties($StaticFlag | $pubFlag));
 
 echo "Private or static properties:";
 var_dump($rc->getProperties($StaticFlag | $privFlag));
+
+echo "Virtual properties:";
+var_dump($rc->getProperties($virtFlag));
 ?>
 --EXPECTF--
 No properties:array(0) {
 }
-Public properties:array(4) {
+Public properties:array(6) {
   [0]=>
   object(ReflectionProperty)#%d (2) {
     ["name"]=>
@@ -68,6 +74,20 @@ Public properties:array(4) {
     ["class"]=>
     string(1) "C"
   }
+  [4]=>
+  object(ReflectionProperty)#%d (2) {
+    ["name"]=>
+    string(10) "hookNoVirt"
+    ["class"]=>
+    string(1) "C"
+  }
+  [5]=>
+  object(ReflectionProperty)#%d (2) {
+    ["name"]=>
+    string(8) "hookVirt"
+    ["class"]=>
+    string(1) "C"
+  }
 }
 Private properties:array(4) {
   [0]=>
@@ -99,7 +119,7 @@ Private properties:array(4) {
     string(1) "C"
   }
 }
-Public or static properties:array(6) {
+Public or static properties:array(8) {
   [0]=>
   object(ReflectionProperty)#%d (2) {
     ["name"]=>
@@ -142,6 +162,20 @@ Public or static properties:array(6) {
     ["class"]=>
     string(1) "C"
   }
+  [6]=>
+  object(ReflectionProperty)#%d (2) {
+    ["name"]=>
+    string(10) "hookNoVirt"
+    ["class"]=>
+    string(1) "C"
+  }
+  [7]=>
+  object(ReflectionProperty)#%d (2) {
+    ["name"]=>
+    string(8) "hookVirt"
+    ["class"]=>
+    string(1) "C"
+  }
 }
 Private or static properties:array(6) {
   [0]=>
@@ -187,3 +221,12 @@ Private or static properties:array(6) {
     string(1) "C"
   }
 }
+Virtual properties:array(1) {
+  [0]=>
+  object(ReflectionProperty)#%d (2) {
+    ["name"]=>
+    string(8) "hookVirt"
+    ["class"]=>
+    string(1) "C"
+  }
+}
diff --git a/ext/reflection/tests/ReflectionProperty_basic2.phpt b/ext/reflection/tests/ReflectionProperty_basic2.phpt
index 09495f744bf28..1c1361dd72509 100644
--- a/ext/reflection/tests/ReflectionProperty_basic2.phpt
+++ b/ext/reflection/tests/ReflectionProperty_basic2.phpt
@@ -1,16 +1,19 @@
 --TEST--
-Test usage of ReflectionProperty methods isDefault(), getModifiers(), getDeclaringClass() and getDocComment().
+Test usage of ReflectionProperty methods isDefault(), isDynamic(), getModifiers(), getDeclaringClass() and getDocComment().
 --INI--
 opcache.save_comments=1
 --FILE--
 isDefault());
+    echo "isDynamic():\n";
+    var_dump($propInfo->isDynamic());
     echo "getModifiers():\n";
     var_dump($propInfo->getModifiers());
     echo "getDeclaringClass():\n";
@@ -20,6 +23,7 @@ function reflectProperty($class, $property) {
     echo "\n**********************************\n";
 }
 
+#[AllowDynamicProperties]
 class TestClass {
     public $pub;
     static public $stat = "static property";
@@ -35,6 +39,10 @@ reflectProperty("TestClass", "stat");
 reflectProperty("TestClass", "prot");
 reflectProperty("TestClass", "priv");
 
+$obj = new TestClass();
+$obj->dyn = 'dynamic';
+reflectProperty($obj, "dyn", "TestClass");
+
 ?>
 --EXPECTF--
 **********************************
@@ -42,6 +50,8 @@ Reflecting on property TestClass::pub
 
 isDefault():
 bool(true)
+isDynamic():
+bool(false)
 getModifiers():
 int(1)
 getDeclaringClass():
@@ -58,6 +68,8 @@ Reflecting on property TestClass::stat
 
 isDefault():
 bool(true)
+isDynamic():
+bool(false)
 getModifiers():
 int(17)
 getDeclaringClass():
@@ -74,6 +86,8 @@ Reflecting on property TestClass::prot
 
 isDefault():
 bool(true)
+isDynamic():
+bool(false)
 getModifiers():
 int(2)
 getDeclaringClass():
@@ -92,6 +106,8 @@ Reflecting on property TestClass::priv
 
 isDefault():
 bool(true)
+isDynamic():
+bool(false)
 getModifiers():
 int(4)
 getDeclaringClass():
@@ -103,3 +119,21 @@ getDocComment():
 bool(false)
 
 **********************************
+**********************************
+Reflecting on property TestClass::dyn
+
+isDefault():
+bool(false)
+isDynamic():
+bool(true)
+getModifiers():
+int(1)
+getDeclaringClass():
+object(ReflectionClass)#%d (1) {
+  ["name"]=>
+  string(9) "TestClass"
+}
+getDocComment():
+bool(false)
+
+**********************************
diff --git a/ext/reflection/tests/ReflectionProperty_getModifiers_basic.phpt b/ext/reflection/tests/ReflectionProperty_getModifiers_basic.phpt
index 6856569d3eadc..e2818bf0c2c56 100644
--- a/ext/reflection/tests/ReflectionProperty_getModifiers_basic.phpt
+++ b/ext/reflection/tests/ReflectionProperty_getModifiers_basic.phpt
@@ -10,6 +10,10 @@ class C {
     static public $a4;
     static protected $a5;
     static private $a6;
+    public final $a7;
+    public static final $a8;
+    public $a9 { set { $this->a9 = strtoupper($value); } }
+    public $a10 { get { return 42; } }
 }
 
 class D extends C {
@@ -21,7 +25,7 @@ class D extends C {
     static private $a6;
 }
 
-for ($i = 1;$i <= 6;$i++) {
+for ($i = 1;$i <= 10;$i++) {
     $rp = new ReflectionProperty("C", "a$i");
     echo "C::a$i: ";
     var_dump($rp->getModifiers());
@@ -44,3 +48,11 @@ C::a5: int(18)
 D::a5: int(18)
 C::a6: int(20)
 D::a6: int(20)
+C::a7: int(33)
+D::a7: int(33)
+C::a8: int(49)
+D::a8: int(49)
+C::a9: int(1)
+D::a9: int(1)
+C::a10: int(513)
+D::a10: int(513)
diff --git a/ext/reflection/tests/ReflectionProperty_isDynamic_basic.phpt b/ext/reflection/tests/ReflectionProperty_isDynamic_basic.phpt
new file mode 100644
index 0000000000000..401cf8b80322e
--- /dev/null
+++ b/ext/reflection/tests/ReflectionProperty_isDynamic_basic.phpt
@@ -0,0 +1,69 @@
+--TEST--
+Test ReflectionProperty::isDynamic() usage.
+--FILE--
+isDynamic());
+    echo "\n**********************************\n";
+}
+
+#[AllowDynamicProperties]
+class TestClass {
+    public $pub;
+    static public $stat = "static property";
+    protected $prot = 4;
+    private $priv = "keepOut";
+}
+
+reflectProperty("TestClass", "pub");
+reflectProperty("TestClass", "stat");
+reflectProperty("TestClass", "prot");
+reflectProperty("TestClass", "priv");
+
+$obj = new TestClass();
+$obj->dyn = 'dynamic';
+reflectProperty($obj, "dyn", "TestClass");
+
+?>
+--EXPECT--
+**********************************
+Reflecting on property TestClass::pub
+
+isDynamic():
+bool(false)
+
+**********************************
+**********************************
+Reflecting on property TestClass::stat
+
+isDynamic():
+bool(false)
+
+**********************************
+**********************************
+Reflecting on property TestClass::prot
+
+isDynamic():
+bool(false)
+
+**********************************
+**********************************
+Reflecting on property TestClass::priv
+
+isDynamic():
+bool(false)
+
+**********************************
+**********************************
+Reflecting on property TestClass::dyn
+
+isDynamic():
+bool(true)
+
+**********************************
diff --git a/ext/reflection/tests/ReflectionProperty_isFinal.phpt b/ext/reflection/tests/ReflectionProperty_isFinal.phpt
new file mode 100644
index 0000000000000..62b792fd7253f
--- /dev/null
+++ b/ext/reflection/tests/ReflectionProperty_isFinal.phpt
@@ -0,0 +1,32 @@
+--TEST--
+ReflectionProperty::isFinal()
+--FILE--
+ 42; }
+    public final $p4 { get => 42; }
+    public protected(set) mixed $p5;
+    public protected(set) final mixed $p6;
+    public private(set) mixed $p7;
+    public private(set) final mixed $p8;
+}
+
+$rc = new ReflectionClass(C::class);
+foreach ($rc->getProperties() as $rp) {
+    echo $rp->getName(), ": ";
+    var_dump($rp->isFinal());
+}
+
+?>
+--EXPECT--
+p1: bool(false)
+p2: bool(true)
+p3: bool(false)
+p4: bool(true)
+p5: bool(false)
+p6: bool(true)
+p7: bool(true)
+p8: bool(true)
diff --git a/ext/reflection/tests/Reflection_getModifierNames_001.phpt b/ext/reflection/tests/Reflection_getModifierNames_001.phpt
index e095e95995d49..918ef2f28000a 100644
--- a/ext/reflection/tests/Reflection_getModifierNames_001.phpt
+++ b/ext/reflection/tests/Reflection_getModifierNames_001.phpt
@@ -14,6 +14,7 @@ printModifiers(ReflectionClass::IS_EXPLICIT_ABSTRACT);
 printModifiers(ReflectionMethod::IS_ABSTRACT | ReflectionMethod::IS_FINAL);
 printModifiers(ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_STATIC | ReflectionProperty::IS_READONLY);
 printModifiers(ReflectionClass::IS_READONLY);
+printModifiers(ReflectionProperty::IS_VIRTUAL);
 ?>
 --EXPECT--
 private
@@ -23,3 +24,4 @@ abstract
 abstract,final
 public,static,readonly
 readonly
+virtual
diff --git a/ext/reflection/tests/bug36434.phpt b/ext/reflection/tests/bug36434.phpt
index 04cdcbf01d782..3f4cc70c75540 100644
--- a/ext/reflection/tests/bug36434.phpt
+++ b/ext/reflection/tests/bug36434.phpt
@@ -1,16 +1,16 @@
 --TEST--
-Reflection Bug #36434 (Properties from parent class fail to indetify their true origin)
+Reflection Bug #36434 (Properties from parent class fail to identify their true origin)
 --FILE--
 ancester;
+        return $this->ancestor;
     }
 }
-class foo extends ancester
+class foo extends ancestor
 {
     public $bar = "1";
     function __construct()
@@ -28,4 +28,4 @@ foreach ($r->GetProperties() as $p)
 ?>
 --EXPECT--
 bar foo
-ancester ancester
+ancestor ancestor
diff --git a/ext/reflection/tests/bug62384.phpt b/ext/reflection/tests/bug62384.phpt
index 90a871fa2a733..cc717585b938d 100644
--- a/ext/reflection/tests/bug62384.phpt
+++ b/ext/reflection/tests/bug62384.phpt
@@ -1,5 +1,5 @@
 --TEST--
-Bug #62384 (Attempting to invoke a Closure more than once causes segfaul)
+Bug #62384 (Attempting to invoke a Closure more than once causes segfault)
 --FILE--
 ';
+$simplexml = simplexml_load_string($xml);
+$reflector = new ReflectionObject($simplexml['name']);
+$reflector->__toString();
+?>
+DONE
+--EXPECT--
+DONE
diff --git a/ext/reflection/tests/property_hooks/ReflectionProperty_getHook_inheritance.phpt b/ext/reflection/tests/property_hooks/ReflectionProperty_getHook_inheritance.phpt
index 820f83f025dc1..3283e8e37a1ce 100644
--- a/ext/reflection/tests/property_hooks/ReflectionProperty_getHook_inheritance.phpt
+++ b/ext/reflection/tests/property_hooks/ReflectionProperty_getHook_inheritance.phpt
@@ -1,5 +1,5 @@
 --TEST--
-ReflectionClass::get{Get,Set}() inheritance
+ReflectionClass::getHook() inheritance
 --FILE--
 hasHooks());
   var_dump($rp->getHooks());
 }
 
 ?>
 --EXPECT--
+bool(false)
 array(0) {
 }
+bool(true)
 array(2) {
   ["get"]=>
   object(ReflectionMethod)#1 (2) {
@@ -35,6 +38,7 @@ array(2) {
     string(4) "Test"
   }
 }
+bool(true)
 array(1) {
   ["get"]=>
   object(ReflectionMethod)#2 (2) {
@@ -44,6 +48,7 @@ array(1) {
     string(4) "Test"
   }
 }
+bool(true)
 array(1) {
   ["set"]=>
   object(ReflectionMethod)#3 (2) {
diff --git a/ext/reflection/tests/property_hooks/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/property_hooks/ReflectionProperty_isInitialized.phpt
new file mode 100644
index 0000000000000..ed1c88b215f12
--- /dev/null
+++ b/ext/reflection/tests/property_hooks/ReflectionProperty_isInitialized.phpt
@@ -0,0 +1,56 @@
+--TEST--
+ReflectionProperty::isInitialized() on hooked properties
+--FILE--
+ throw new Exception(); }
+    public $v2 { set { throw new Exception(); } }
+    // Backed
+    public $b1 { get => throw new Exception($this->b1); }
+    public string $b2 { get => throw new Exception($this->b2); }
+    public $b3 { set => throw new Exception(); }
+    public string $b4 { set => throw new Exception(); }
+}
+
+$test = new Test();
+$rc = new ReflectionClass(Test::class);
+foreach ($rc->getProperties() as $rp) {
+    echo $rp->getName(), "\n";
+    var_dump($rp->isInitialized($test));
+    try {
+        $rp->setRawValue($test, 42);
+    } catch (Error $e) {}
+    var_dump($rp->isInitialized($test));
+}
+
+?>
+--EXPECT--
+p1
+bool(true)
+bool(true)
+p2
+bool(false)
+bool(true)
+v1
+bool(true)
+bool(true)
+v2
+bool(true)
+bool(true)
+b1
+bool(true)
+bool(true)
+b2
+bool(false)
+bool(true)
+b3
+bool(true)
+bool(true)
+b4
+bool(false)
+bool(true)
diff --git a/ext/reflection/tests/property_hooks/basics.phpt b/ext/reflection/tests/property_hooks/basics.phpt
index 92a613bcb8042..8c363dcc4bfb0 100644
--- a/ext/reflection/tests/property_hooks/basics.phpt
+++ b/ext/reflection/tests/property_hooks/basics.phpt
@@ -10,6 +10,8 @@ class Test {
         get { echo "get\n"; }
         set { echo "set($value)\n"; }
     }
+    public $prop5 { get { echo "get\n"; } }
+    public $prop6 { set { echo "set($value)\n"; } }
 }
 abstract class Test2 {
     abstract public $prop4 { get; set; }
@@ -27,13 +29,17 @@ function dumpFlags(ReflectionProperty $rp) {
 $test = new Test;
 
 $rp1 = new ReflectionProperty(Test::class, 'prop1');
+var_dump($rp1->hasHook(PropertyHookType::Get));
 var_dump($rp1->getHook(PropertyHookType::Get));
+var_dump($rp1->hasHook(PropertyHookType::Set));
 var_dump($rp1->getHook(PropertyHookType::Set));
 dumpFlags($rp1);
 echo "\n";
 
 $rp2 = new ReflectionProperty(Test::class, 'prop2');
+var_dump($rp2->hasHook(PropertyHookType::Get));
 var_dump($g = $rp2->getHook(PropertyHookType::Get));
+var_dump($rp2->hasHook(PropertyHookType::Set));
 var_dump($s = $rp2->getHook(PropertyHookType::Set));
 var_dump($g->invoke($test));
 try {
@@ -48,7 +54,9 @@ dumpFlags($rp2);
 echo "\n";
 
 $rp3 = new ReflectionProperty(Test::class, 'prop3');
+var_dump($rp3->hasHook(PropertyHookType::Get));
 var_dump($g = $rp3->getHook(PropertyHookType::Get));
+var_dump($rp3->hasHook(PropertyHookType::Set));
 var_dump($s = $rp3->getHook(PropertyHookType::Set));
 $g->invoke($test);
 $s->invoke($test, 42);
@@ -57,19 +65,34 @@ echo "\n";
 
 $rp4 = new ReflectionProperty(Test2::class, 'prop4');
 dumpFlags($rp4);
+echo "\n";
+
+$rp5 = new ReflectionProperty(Test::class, 'prop5');
+var_dump($rp5->hasHook(PropertyHookType::Get));
+var_dump($rp5->hasHook(PropertyHookType::Set));
+echo "\n";
+
+$rp6 = new ReflectionProperty(Test::class, 'prop6');
+var_dump($rp6->hasHook(PropertyHookType::Get));
+var_dump($rp6->hasHook(PropertyHookType::Set));
+echo "\n";
 
 ?>
 --EXPECT--
+bool(false)
 NULL
+bool(false)
 NULL
 Abstract: false false
 
+bool(true)
 object(ReflectionMethod)#6 (2) {
   ["name"]=>
   string(11) "$prop2::get"
   ["class"]=>
   string(4) "Test"
 }
+bool(true)
 object(ReflectionMethod)#7 (2) {
   ["name"]=>
   string(11) "$prop2::set"
@@ -80,12 +103,14 @@ NULL
 NULL
 Abstract: false false
 
+bool(true)
 object(ReflectionMethod)#9 (2) {
   ["name"]=>
   string(11) "$prop3::get"
   ["class"]=>
   string(4) "Test"
 }
+bool(true)
 object(ReflectionMethod)#6 (2) {
   ["name"]=>
   string(11) "$prop3::set"
@@ -97,3 +122,9 @@ set(42)
 Abstract: false false
 
 Abstract: true true
+
+bool(true)
+bool(false)
+
+bool(false)
+bool(true)
diff --git a/ext/session/session.c b/ext/session/session.c
index 3d05e9efd3111..db3cda305d17f 100644
--- a/ext/session/session.c
+++ b/ext/session/session.c
@@ -83,13 +83,13 @@ zend_class_entry *php_session_update_timestamp_iface_entry;
 
 #define SESSION_CHECK_ACTIVE_STATE	\
 	if (PS(session_status) == php_session_active) {	\
-		php_error_docref(NULL, E_WARNING, "Session ini settings cannot be changed when a session is active");	\
+		php_session_session_already_started_error(E_WARNING, "Session ini settings cannot be changed when a session is active");	\
 		return FAILURE;	\
 	}
 
 #define SESSION_CHECK_OUTPUT_STATE										\
 	if (SG(headers_sent) && stage != ZEND_INI_STAGE_DEACTIVATE) {												\
-		php_error_docref(NULL, E_WARNING, "Session ini settings cannot be changed after headers have already been sent");	\
+		php_session_headers_already_sent_error(E_WARNING, "Session ini settings cannot be changed after headers have already been sent");	\
 		return FAILURE;													\
 	}
 
@@ -121,6 +121,29 @@ static inline void php_rinit_session_globals(void) /* {{{ */
 }
 /* }}} */
 
+static inline void php_session_headers_already_sent_error(int severity, const char *message) { /* {{{ */
+	const char *output_start_filename = php_output_get_start_filename();
+	int output_start_lineno = php_output_get_start_lineno();
+	if (output_start_filename != NULL) {
+		php_error_docref(NULL, severity, "%s (sent from %s on line %d)", message, output_start_filename, output_start_lineno);
+	} else {
+		php_error_docref(NULL, severity, "%s", message);
+	}
+}
+/* }}} */
+
+static inline void php_session_session_already_started_error(int severity, const char *message) { /* {{{ */
+	if (PS(session_started_filename) != NULL) {
+		php_error_docref(NULL, severity, "%s (started from %s on line %"PRIu32")", message, ZSTR_VAL(PS(session_started_filename)), PS(session_started_lineno));
+	} else if (PS(auto_start)) {
+		/* This option can't be changed at runtime, so we can assume it's because of this */
+		php_error_docref(NULL, severity, "%s (session started automatically)", message);
+	} else {
+		php_error_docref(NULL, severity, "%s", message);
+	}
+}
+/* }}} */
+
 static inline void php_session_cleanup_filename(void) /* {{{ */
 {
 	if (PS(session_started_filename)) {
@@ -707,9 +730,18 @@ static PHP_INI_MH(OnUpdateCookieLifetime) /* {{{ */
 {
 	SESSION_CHECK_ACTIVE_STATE;
 	SESSION_CHECK_OUTPUT_STATE;
-	if (atol(ZSTR_VAL(new_value)) < 0) {
+
+#ifdef ZEND_ENABLE_ZVAL_LONG64
+	const zend_long maxcookie = ZEND_LONG_MAX - INT_MAX - 1;
+#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");
 		return FAILURE;
+	} else if (v > maxcookie) {
+		return SUCCESS;
 	}
 	return OnUpdateLongGEZero(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage);
 }
@@ -1318,15 +1350,8 @@ static int php_session_cache_limiter(void) /* {{{ */
 	if (PS(session_status) != php_session_active) return -1;
 
 	if (SG(headers_sent)) {
-		const char *output_start_filename = php_output_get_start_filename();
-		int output_start_lineno = php_output_get_start_lineno();
-
 		php_session_abort();
-		if (output_start_filename) {
-			php_error_docref(NULL, E_WARNING, "Session cache limiter cannot be sent after headers have already been sent (output started at %s:%d)", output_start_filename, output_start_lineno);
-		} else {
-			php_error_docref(NULL, E_WARNING, "Session cache limiter cannot be sent after headers have already been sent");
-		}
+		php_session_headers_already_sent_error(E_WARNING, "Session cache limiter cannot be sent after headers have already been sent");
 		return -2;
 	}
 
@@ -1395,14 +1420,7 @@ static zend_result php_session_send_cookie(void) /* {{{ */
 	zend_string *e_id;
 
 	if (SG(headers_sent)) {
-		const char *output_start_filename = php_output_get_start_filename();
-		int output_start_lineno = php_output_get_start_lineno();
-
-		if (output_start_filename) {
-			php_error_docref(NULL, E_WARNING, "Session cookie cannot be sent after headers have already been sent (output started at %s:%d)", output_start_filename, output_start_lineno);
-		} else {
-			php_error_docref(NULL, E_WARNING, "Session cookie cannot be sent after headers have already been sent");
-		}
+		php_session_headers_already_sent_error(E_WARNING, "Session cookie cannot be sent after headers have already been sent");
 		return FAILURE;
 	}
 
@@ -1597,14 +1615,7 @@ PHPAPI zend_result php_session_start(void) /* {{{ */
 
 	switch (PS(session_status)) {
 		case php_session_active:
-			if (PS(session_started_filename)) {
-				php_error(E_NOTICE, "Ignoring session_start() because a session has already been started (started from %s on line %"PRIu32")", ZSTR_VAL(PS(session_started_filename)), PS(session_started_lineno));
-			} else if (PS(auto_start)) {
-				/* This option can't be changed at runtime, so we can assume it's because of this */
-				php_error(E_NOTICE, "Ignoring session_start() because a session has already been started automatically");
-			} else {
-				php_error(E_NOTICE, "Ignoring session_start() because a session has already been started");
-			}
+			php_session_session_already_started_error(E_NOTICE, "Ignoring session_start() because a session has already been started");
 			return FAILURE;
 			break;
 
@@ -1772,10 +1783,6 @@ PHP_FUNCTION(session_set_cookie_params)
 	zend_result result;
 	int found = 0;
 
-	if (!PS(use_cookies)) {
-		return;
-	}
-
 	ZEND_PARSE_PARAMETERS_START(1, 5)
 		Z_PARAM_ARRAY_HT_OR_LONG(options_ht, lifetime_long)
 		Z_PARAM_OPTIONAL
@@ -1785,13 +1792,18 @@ PHP_FUNCTION(session_set_cookie_params)
 		Z_PARAM_BOOL_OR_NULL(httponly, httponly_null)
 	ZEND_PARSE_PARAMETERS_END();
 
+	if (!PS(use_cookies)) {
+		php_error_docref(NULL, E_WARNING, "Session cookies cannot be used when session.use_cookies is disabled");
+		RETURN_FALSE;
+	}
+
 	if (PS(session_status) == php_session_active) {
-		php_error_docref(NULL, E_WARNING, "Session cookie parameters cannot be changed when a session is active");
+		php_session_session_already_started_error(E_WARNING, "Session cookie parameters cannot be changed when a session is active");
 		RETURN_FALSE;
 	}
 
 	if (SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session cookie parameters cannot be changed after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session cookie parameters cannot be changed after headers have already been sent");
 		RETURN_FALSE;
 	}
 
@@ -1958,12 +1970,12 @@ PHP_FUNCTION(session_name)
 	}
 
 	if (name && PS(session_status) == php_session_active) {
-		php_error_docref(NULL, E_WARNING, "Session name cannot be changed when a session is active");
+		php_session_session_already_started_error(E_WARNING, "Session name cannot be changed when a session is active");
 		RETURN_FALSE;
 	}
 
 	if (name && SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session name cannot be changed after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session name cannot be changed after headers have already been sent");
 		RETURN_FALSE;
 	}
 
@@ -1988,12 +2000,12 @@ PHP_FUNCTION(session_module_name)
 	}
 
 	if (name && PS(session_status) == php_session_active) {
-		php_error_docref(NULL, E_WARNING, "Session save handler module cannot be changed when a session is active");
+		php_session_session_already_started_error(E_WARNING, "Session save handler module cannot be changed when a session is active");
 		RETURN_FALSE;
 	}
 
 	if (name && SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session save handler module cannot be changed after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session save handler module cannot be changed after headers have already been sent");
 		RETURN_FALSE;
 	}
 
@@ -2029,12 +2041,12 @@ PHP_FUNCTION(session_module_name)
 
 static bool can_session_handler_be_changed(void) {
 	if (PS(session_status) == php_session_active) {
-		php_error_docref(NULL, E_WARNING, "Session save handler cannot be changed when a session is active");
+		php_session_session_already_started_error(E_WARNING, "Session save handler cannot be changed when a session is active");
 		return false;
 	}
 
 	if (SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session save handler cannot be changed after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session save handler cannot be changed after headers have already been sent");
 		return false;
 	}
 
@@ -2269,12 +2281,12 @@ PHP_FUNCTION(session_save_path)
 	}
 
 	if (name && PS(session_status) == php_session_active) {
-		php_error_docref(NULL, E_WARNING, "Session save path cannot be changed when a session is active");
+		php_session_session_already_started_error(E_WARNING, "Session save path cannot be changed when a session is active");
 		RETURN_FALSE;
 	}
 
 	if (name && SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session save path cannot be changed after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session save path cannot be changed after headers have already been sent");
 		RETURN_FALSE;
 	}
 
@@ -2298,12 +2310,12 @@ PHP_FUNCTION(session_id)
 	}
 
 	if (name && PS(session_status) == php_session_active) {
-		php_error_docref(NULL, E_WARNING, "Session ID cannot be changed when a session is active");
+		php_session_session_already_started_error(E_WARNING, "Session ID cannot be changed when a session is active");
 		RETURN_FALSE;
 	}
 
 	if (name && PS(use_cookies) && SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session ID cannot be changed after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session ID cannot be changed after headers have already been sent");
 		RETURN_FALSE;
 	}
 
@@ -2340,12 +2352,12 @@ PHP_FUNCTION(session_regenerate_id)
 	}
 
 	if (PS(session_status) != php_session_active) {
-		php_error_docref(NULL, E_WARNING, "Session ID cannot be regenerated when there is no active session");
+		php_session_session_already_started_error(E_WARNING, "Session ID cannot be regenerated when there is no active session");
 		RETURN_FALSE;
 	}
 
 	if (SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session ID cannot be regenerated after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session ID cannot be regenerated after headers have already been sent");
 		RETURN_FALSE;
 	}
 
@@ -2511,12 +2523,12 @@ PHP_FUNCTION(session_cache_limiter)
 	}
 
 	if (limiter && PS(session_status) == php_session_active) {
-		php_error_docref(NULL, E_WARNING, "Session cache limiter cannot be changed when a session is active");
+		php_session_session_already_started_error(E_WARNING, "Session cache limiter cannot be changed when a session is active");
 		RETURN_FALSE;
 	}
 
 	if (limiter && SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session cache limiter cannot be changed after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session cache limiter cannot be changed after headers have already been sent");
 		RETURN_FALSE;
 	}
 
@@ -2541,12 +2553,12 @@ PHP_FUNCTION(session_cache_expire)
 	}
 
 	if (!expires_is_null && PS(session_status) == php_session_active) {
-		php_error_docref(NULL, E_WARNING, "Session cache expiration cannot be changed when a session is active");
+		php_session_session_already_started_error(E_WARNING, "Session cache expiration cannot be changed when a session is active");
 		RETURN_LONG(PS(cache_expire));
 	}
 
 	if (!expires_is_null && SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session cache expiration cannot be changed after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session cache expiration cannot be changed after headers have already been sent");
 		RETURN_FALSE;
 	}
 
@@ -2627,14 +2639,7 @@ PHP_FUNCTION(session_start)
 	}
 
 	if (PS(session_status) == php_session_active) {
-		if (PS(session_started_filename)) {
-			php_error_docref(NULL, E_NOTICE, "Ignoring session_start() because a session is already active (started from %s on line %"PRIu32")", ZSTR_VAL(PS(session_started_filename)), PS(session_started_lineno));
-		} else if (PS(auto_start)) {
-			/* This option can't be changed at runtime, so we can assume it's because of this */
-			php_error_docref(NULL, E_NOTICE, "Ignoring session_start() because a session is already automatically active");
-		} else {
-			php_error_docref(NULL, E_NOTICE, "Ignoring session_start() because a session is already active");
-		}
+		php_session_session_already_started_error(E_NOTICE, "Ignoring session_start() because a session is already active");
 		RETURN_TRUE;
 	}
 
@@ -2644,7 +2649,7 @@ PHP_FUNCTION(session_start)
 	 * module is unable to rewrite output.
 	 */
 	if (PS(use_cookies) && SG(headers_sent)) {
-		php_error_docref(NULL, E_WARNING, "Session cannot be started after headers have already been sent");
+		php_session_headers_already_sent_error(E_WARNING, "Session cannot be started after headers have already been sent");
 		RETURN_FALSE;
 	}
 
diff --git a/ext/session/tests/014.phpt b/ext/session/tests/014.phpt
index 04d43e635eae1..7a1398cfee201 100644
--- a/ext/session/tests/014.phpt
+++ b/ext/session/tests/014.phpt
@@ -35,8 +35,8 @@ session_destroy();
 --EXPECTF--
 
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
  
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
  
diff --git a/ext/session/tests/bug73100.phpt b/ext/session/tests/bug73100.phpt
index 834f2abf0f4f9..21e698a14aba8 100644
--- a/ext/session/tests/bug73100.phpt
+++ b/ext/session/tests/bug73100.phpt
@@ -22,7 +22,7 @@ try {
 --EXPECTF--
 bool(true)
 
-Warning: session_module_name(): Session save handler module cannot be changed when a session is active in %s on line %d
+Warning: session_module_name(): Session save handler module cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(true)
 session_module_name(): Argument #1 ($module) cannot be "user"
 ===DONE===
diff --git a/ext/session/tests/gh-16372.phpt b/ext/session/tests/gh-16372.phpt
new file mode 100644
index 0000000000000..7ce572792bc3f
--- /dev/null
+++ b/ext/session/tests/gh-16372.phpt
@@ -0,0 +1,19 @@
+--TEST--
+GH-16372: Mention where headers were already sent if session_start fails
+--EXTENSIONS--
+session
+--SKIPIF--
+
+--FILE--
+
+--EXPECTF--
+Sent headers
+
+Warning: session_start(): Session cannot be started after headers have already been sent (sent from %s on line %d) in %s on line %d
diff --git a/ext/session/tests/gh16290.phpt b/ext/session/tests/gh16290.phpt
new file mode 100644
index 0000000000000..d341eb47471b8
--- /dev/null
+++ b/ext/session/tests/gh16290.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-16290 (overflow on session cookie_lifetime ini)
+--EXTENSIONS--
+session
+--SKIPIF--
+
+--FILE--
+
+--EXPECT--
+DONE
diff --git a/ext/session/tests/gh16385.phpt b/ext/session/tests/gh16385.phpt
new file mode 100644
index 0000000000000..4ede457315f03
--- /dev/null
+++ b/ext/session/tests/gh16385.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-16385 (Unexpected null returned by session_set_cookie_params)
+--EXTENSIONS--
+session
+--INI--
+session.use_cookies=0
+--FILE--
+
+--EXPECTF--
+Warning: session_set_cookie_params(): Session cookies cannot be used when session.use_cookies is disabled in %s on line %d
+bool(false)
diff --git a/ext/session/tests/session_cache_limiter_variation1.phpt b/ext/session/tests/session_cache_limiter_variation1.phpt
index dc095f1979c28..c6be69cf8fb1c 100644
--- a/ext/session/tests/session_cache_limiter_variation1.phpt
+++ b/ext/session/tests/session_cache_limiter_variation1.phpt
@@ -30,7 +30,7 @@ string(7) "nocache"
 bool(true)
 string(7) "nocache"
 
-Warning: session_cache_limiter(): Session cache limiter cannot be changed when a session is active in %s on line %d
+Warning: session_cache_limiter(): Session cache limiter cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 string(7) "nocache"
 bool(true)
diff --git a/ext/session/tests/session_cache_limiter_variation2.phpt b/ext/session/tests/session_cache_limiter_variation2.phpt
index 9ef2d4dfb5e23..28cf276d32b1b 100644
--- a/ext/session/tests/session_cache_limiter_variation2.phpt
+++ b/ext/session/tests/session_cache_limiter_variation2.phpt
@@ -29,7 +29,7 @@ string(7) "nocache"
 bool(true)
 string(7) "nocache"
 
-Warning: session_cache_limiter(): Session cache limiter cannot be changed when a session is active in %s on line %d
+Warning: session_cache_limiter(): Session cache limiter cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 string(7) "nocache"
 bool(true)
diff --git a/ext/session/tests/session_cache_limiter_variation3.phpt b/ext/session/tests/session_cache_limiter_variation3.phpt
index 06822fcf02011..5f53676d66997 100644
--- a/ext/session/tests/session_cache_limiter_variation3.phpt
+++ b/ext/session/tests/session_cache_limiter_variation3.phpt
@@ -28,7 +28,7 @@ string(7) "nocache"
 bool(true)
 string(7) "nocache"
 
-Warning: session_cache_limiter(): Session cache limiter cannot be changed when a session is active in %s on line %d
+Warning: session_cache_limiter(): Session cache limiter cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 string(7) "nocache"
 bool(true)
diff --git a/ext/session/tests/session_get_cookie_params_basic.phpt b/ext/session/tests/session_get_cookie_params_basic.phpt
index d34f7ccbf95c3..65b020d30b9ec 100644
--- a/ext/session/tests/session_get_cookie_params_basic.phpt
+++ b/ext/session/tests/session_get_cookie_params_basic.phpt
@@ -35,7 +35,7 @@ var_dump(session_get_cookie_params());
 echo "Done";
 ob_end_flush();
 ?>
---EXPECT--
+--EXPECTF--
 *** Testing session_get_cookie_params() : basic functionality ***
 array(6) {
   ["lifetime"]=>
@@ -69,7 +69,7 @@ array(6) {
 bool(true)
 array(6) {
   ["lifetime"]=>
-  int(1234567890)
+  int(%d)
   ["path"]=>
   string(5) "/guff"
   ["domain"]=>
diff --git a/ext/session/tests/session_id_error2.phpt b/ext/session/tests/session_id_error2.phpt
index 7b7c5b88a0410..35bf34ab81720 100644
--- a/ext/session/tests/session_id_error2.phpt
+++ b/ext/session/tests/session_id_error2.phpt
@@ -31,7 +31,7 @@ string(4) "test"
 string(10) "1234567890"
 bool(true)
 
-Warning: session_id(): Session ID cannot be changed when a session is active in %s on line %d
+Warning: session_id(): Session ID cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 bool(true)
 string(0) ""
diff --git a/ext/session/tests/session_ini_set.phpt b/ext/session/tests/session_ini_set.phpt
index 2fbc87902e4d8..f58862c209fd3 100644
--- a/ext/session/tests/session_ini_set.phpt
+++ b/ext/session/tests/session_ini_set.phpt
@@ -118,67 +118,67 @@ string(1) "4"
 string(1) "1"
 string(15) "session started"
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 
-Warning: ini_set(): Session ini settings cannot be changed when a session is active in %s on line %d
+Warning: ini_set(): Session ini settings cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 Done
diff --git a/ext/session/tests/session_save_path_variation1.phpt b/ext/session/tests/session_save_path_variation1.phpt
index a9bb83d68d28b..74940fa700bab 100644
--- a/ext/session/tests/session_save_path_variation1.phpt
+++ b/ext/session/tests/session_save_path_variation1.phpt
@@ -40,7 +40,7 @@ string(%d) "%stests"
 bool(true)
 string(%d) "%stests"
 
-Warning: session_save_path(): Session save path cannot be changed when a session is active in %s on line %d
+Warning: session_save_path(): Session save path cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 string(%d) "%stests"
 bool(true)
diff --git a/ext/session/tests/session_set_cookie_params_basic.phpt b/ext/session/tests/session_set_cookie_params_basic.phpt
index 5eecb6ad67d6a..386280d17861d 100644
--- a/ext/session/tests/session_set_cookie_params_basic.phpt
+++ b/ext/session/tests/session_set_cookie_params_basic.phpt
@@ -25,7 +25,7 @@ ob_end_flush();
 bool(true)
 bool(true)
 
-Warning: session_set_cookie_params(): Session cookie parameters cannot be changed when a session is active in %s on line %d
+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)
 bool(true)
diff --git a/ext/session/tests/session_set_cookie_params_variation1.phpt b/ext/session/tests/session_set_cookie_params_variation1.phpt
index 6bb121354dc77..ed0b8dc9755d6 100644
--- a/ext/session/tests/session_set_cookie_params_variation1.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation1.phpt
@@ -38,7 +38,7 @@ string(4) "3600"
 bool(true)
 string(4) "3600"
 
-Warning: session_set_cookie_params(): Session cookie parameters cannot be changed when a session is active in %s on line %d
+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)
 string(4) "3600"
 bool(true)
diff --git a/ext/session/tests/session_set_cookie_params_variation2.phpt b/ext/session/tests/session_set_cookie_params_variation2.phpt
index 0a0031b217f3d..e76d10050d0bc 100644
--- a/ext/session/tests/session_set_cookie_params_variation2.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation2.phpt
@@ -36,7 +36,7 @@ string(4) "/foo"
 bool(true)
 string(4) "/foo"
 
-Warning: session_set_cookie_params(): Session cookie parameters cannot be changed when a session is active in %s on line %d
+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)
 string(4) "/foo"
 bool(true)
diff --git a/ext/session/tests/session_set_cookie_params_variation3.phpt b/ext/session/tests/session_set_cookie_params_variation3.phpt
index 5f4b1164ec9d3..65af902ff01c1 100644
--- a/ext/session/tests/session_set_cookie_params_variation3.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation3.phpt
@@ -36,7 +36,7 @@ string(4) "blah"
 bool(true)
 string(4) "blah"
 
-Warning: session_set_cookie_params(): Session cookie parameters cannot be changed when a session is active in %s on line %d
+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)
 string(4) "blah"
 bool(true)
diff --git a/ext/session/tests/session_set_cookie_params_variation4.phpt b/ext/session/tests/session_set_cookie_params_variation4.phpt
index f5fcbaf073d73..41eb0cb765e81 100644
--- a/ext/session/tests/session_set_cookie_params_variation4.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation4.phpt
@@ -36,7 +36,7 @@ string(1) "0"
 bool(true)
 string(1) "0"
 
-Warning: session_set_cookie_params(): Session cookie parameters cannot be changed when a session is active in %s on line %d
+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)
 string(1) "0"
 bool(true)
diff --git a/ext/session/tests/session_set_cookie_params_variation5.phpt b/ext/session/tests/session_set_cookie_params_variation5.phpt
index 917ba4461908f..03d0d5ca4e0b7 100644
--- a/ext/session/tests/session_set_cookie_params_variation5.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation5.phpt
@@ -36,7 +36,7 @@ string(1) "0"
 bool(true)
 string(1) "0"
 
-Warning: session_set_cookie_params(): Session cookie parameters cannot be changed when a session is active in %s on line %d
+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)
 string(1) "0"
 bool(true)
diff --git a/ext/session/tests/session_set_cookie_params_variation6.phpt b/ext/session/tests/session_set_cookie_params_variation6.phpt
index f7c729c6a97b8..61243f82751e7 100644
--- a/ext/session/tests/session_set_cookie_params_variation6.phpt
+++ b/ext/session/tests/session_set_cookie_params_variation6.phpt
@@ -36,7 +36,7 @@ string(7) "nothing"
 bool(true)
 string(7) "nothing"
 
-Warning: session_set_cookie_params(): Session cookie parameters cannot be changed when a session is active in %s on line %d
+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)
 string(7) "nothing"
 bool(true)
diff --git a/ext/session/tests/session_start_variation9.phpt b/ext/session/tests/session_start_variation9.phpt
index 3fdcdcffbb9ff..9377a236d3c2d 100644
--- a/ext/session/tests/session_start_variation9.phpt
+++ b/ext/session/tests/session_start_variation9.phpt
@@ -26,7 +26,7 @@ ob_end_flush();
 *** Testing session_start() : variation ***
 string(%d) "%s"
 
-Notice: session_start(): Ignoring session_start() because a session is already automatically active in %s on line %d
+Notice: session_start(): Ignoring session_start() because a session is already active (session started automatically) in %s on line %d
 bool(true)
 string(%d) "%s"
 bool(true)
diff --git a/ext/session/tests/user_session_module/bug80889a.phpt b/ext/session/tests/user_session_module/bug80889a.phpt
index 13a546b7dc145..b3f4e3219fb72 100644
--- a/ext/session/tests/user_session_module/bug80889a.phpt
+++ b/ext/session/tests/user_session_module/bug80889a.phpt
@@ -33,6 +33,6 @@ var_dump($initHandler, $setHandler);
 --EXPECTF--
 Deprecated: session_set_save_handler(): Providing individual callbacks instead of an object implementing SessionHandlerInterface is deprecated in %s on line %d
 
-Warning: session_set_save_handler(): Session save handler cannot be changed after headers have already been sent in %s on line %d
+Warning: session_set_save_handler(): Session save handler cannot be changed after headers have already been sent (sent from %s on line %d) in %s on line %d
 string(8) "whatever"
 string(8) "whatever"
diff --git a/ext/session/tests/user_session_module/session_set_save_handler_variation2.phpt b/ext/session/tests/user_session_module/session_set_save_handler_variation2.phpt
index 4e250fe34b17e..a14f95654422b 100644
--- a/ext/session/tests/user_session_module/session_set_save_handler_variation2.phpt
+++ b/ext/session/tests/user_session_module/session_set_save_handler_variation2.phpt
@@ -30,6 +30,6 @@ bool(true)
 
 Deprecated: session_set_save_handler(): Providing individual callbacks instead of an object implementing SessionHandlerInterface is deprecated in %s on line %d
 
-Warning: session_set_save_handler(): Session save handler cannot be changed when a session is active in %s on line %d
+Warning: session_set_save_handler(): Session save handler cannot be changed when a session is active (started from %s on line %d) in %s on line %d
 bool(false)
 bool(true)
diff --git a/ext/session/tests/user_session_module/session_set_save_handler_variation3.phpt b/ext/session/tests/user_session_module/session_set_save_handler_variation3.phpt
index a5260100b9cb3..78cf2bf63b8b6 100644
--- a/ext/session/tests/user_session_module/session_set_save_handler_variation3.phpt
+++ b/ext/session/tests/user_session_module/session_set_save_handler_variation3.phpt
@@ -29,10 +29,10 @@ rmdir($path);
 *** Testing session_set_save_handler() : variation ***
 int(2)
 
-Warning: session_save_path(): Session save path cannot be changed when a session is active in %s on line %d
+Warning: session_save_path(): Session save path cannot be changed when a session is active (session started automatically) in %s on line %d
 
 Deprecated: session_set_save_handler(): Providing individual callbacks instead of an object implementing SessionHandlerInterface is deprecated in %s on line %d
 
-Warning: session_set_save_handler(): Session save handler cannot be changed when a session is active in %s on line %d
+Warning: session_set_save_handler(): Session save handler cannot be changed when a session is active (session started automatically) in %s on line %d
 bool(false)
 bool(true)
diff --git a/ext/shmop/shmop_arginfo.h b/ext/shmop/shmop_arginfo.h
index 4853946d4e77c..54bb2e19d5465 100644
--- a/ext/shmop/shmop_arginfo.h
+++ b/ext/shmop/shmop_arginfo.h
@@ -52,7 +52,7 @@ static const zend_function_entry ext_functions[] = {
 static void register_shmop_symbols(int module_number)
 {
 
-	zend_attribute *attribute_Deprecated_func_shmop_close_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "shmop_close", sizeof("shmop_close") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_shmop_close_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "shmop_close", sizeof("shmop_close") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_shmop_close_0_arg0;
 	zend_string *attribute_Deprecated_func_shmop_close_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_shmop_close_0_arg0, attribute_Deprecated_func_shmop_close_0_arg0_str);
diff --git a/ext/shmop/tests/gh14537.phpt b/ext/shmop/tests/gh14537.phpt
index 05af26a70ffa9..872d81b3cb5d6 100644
--- a/ext/shmop/tests/gh14537.phpt
+++ b/ext/shmop/tests/gh14537.phpt
@@ -23,5 +23,5 @@ var_dump($shm_id2);
 object(Shmop)#1 (0) {
 }
 
-Warning: shmop_open(): Unable to attach or create shared memory segment "No error" in %s on line %d
+Warning: shmop_open(): Unable to attach or create shared memory segment "%s" in %s on line %d
 bool(false)
diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c
index e22a625bf9603..49f3b2b4e67a1 100644
--- a/ext/simplexml/simplexml.c
+++ b/ext/simplexml/simplexml.c
@@ -2487,6 +2487,11 @@ static void php_sxe_iterator_current_key(zend_object_iterator *iter, zval *key)
 {
 	php_sxe_iterator *iterator = (php_sxe_iterator *)iter;
 	zval *curobj = &iterator->sxe->iter.data;
+	if (Z_ISUNDEF_P(curobj)) {
+		ZVAL_NULL(key);
+		return;
+	}
+
 	php_sxe_object *intern = Z_SXEOBJ_P(curobj);
 
 	xmlNodePtr curnode = NULL;
diff --git a/ext/simplexml/tests/gh15837.phpt b/ext/simplexml/tests/gh15837.phpt
new file mode 100644
index 0000000000000..302db064ee0e7
--- /dev/null
+++ b/ext/simplexml/tests/gh15837.phpt
@@ -0,0 +1,30 @@
+--TEST--
+GH-15837 (Segmentation fault in ext/simplexml/simplexml.c)
+--CREDITS--
+YuanchengJiang
+--FILE--
+
+
+ 
+
+
+ 
+ 
+
+EOF;
+$sxe = new SimpleXMLIterator($xml);
+$rit = new RecursiveIteratorIterator($sxe, RecursiveIteratorIterator::LEAVES_ONLY);
+foreach ($rit as $child) {
+    $ancestry = $child->xpath('ancestor-or-self::*');
+    // Exhaust internal iterator
+    foreach ($ancestry as $ancestor) {
+    }
+}
+var_dump($rit->valid());
+var_dump($rit->key());
+?>
+--EXPECT--
+bool(false)
+NULL
diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c
index 7e8d4d0bc2fc1..1425cf12752a7 100644
--- a/ext/snmp/snmp.c
+++ b/ext/snmp/snmp.c
@@ -26,6 +26,11 @@
 #include "php.h"
 #include "main/php_network.h"
 #include "ext/standard/info.h"
+
+#ifdef PHP_WIN32
+// avoid conflicting declarations of (v)asprintf()
+# define HAVE_ASPRINTF
+#endif
 #include "php_snmp.h"
 
 #include "zend_exceptions.h"
diff --git a/ext/snmp/tests/bigtest.js b/ext/snmp/tests/bigtest.js
new file mode 100644
index 0000000000000..d8b4fc9778039
--- /dev/null
+++ b/ext/snmp/tests/bigtest.js
@@ -0,0 +1,3 @@
+for (var i = 0; i < 32; i++) {
+    WScript.StdOut.Write("\x03\x02\x04\x09\x12\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17");
+}
diff --git a/ext/snmp/tests/bug64159.phpt b/ext/snmp/tests/bug64159.phpt
index e7cdbd5437796..622cb1ce019d7 100644
--- a/ext/snmp/tests/bug64159.phpt
+++ b/ext/snmp/tests/bug64159.phpt
@@ -7,7 +7,6 @@ snmp
 --SKIPIF--
 
 --ENV--
 MIBS=noneXistent
@@ -18,10 +17,15 @@ require_once(__DIR__.'/snmp_include.inc');
 snmp_set_quick_print(false);
 snmp_set_valueretrieval(SNMP_VALUE_LIBRARY);
 
-var_dump(("ab8283f948419b2d24d22f44a80b17d3" === md5(snmpget($hostname, $community, '.1.3.6.1.4.1.2021.8.1.101.1'))));
-
+$ext_output = snmpget($hostname, $community, '.1.3.6.1.4.1.2021.8.1.101.1');
+$md5 = md5($ext_output);
+if ($md5 === "ab8283f948419b2d24d22f44a80b17d3") {
+    echo "okay\n";
+} else {
+    echo $ext_output;
+}
 ?>
 --EXPECTF--
 MIB search path: %s
 Cannot find module (noneXistent): At line %d in (%s)
-bool(true)
+okay
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index 13df7afbc1005..57f92fa9a72a7 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -25,6 +25,7 @@
 #include 
 #include "zend_strtod.h"
 #include "zend_interfaces.h"
+#include "zend_enum.h"
 
 /* zval type decode */
 static zval *to_zval_double(zval* ret, encodeTypePtr type, xmlNodePtr data);
@@ -538,7 +539,8 @@ static zval *master_to_zval_int(zval *ret, encodePtr encode, xmlNodePtr data)
 			if (type_attr != NULL) {
 				encodePtr new_enc;
 				xmlNsPtr nsptr;
-				char *ns, *cptype;
+				const char *cptype;
+				char *ns;
 				smart_str nscat = {0};
 
 				parse_namespace(type_attr->children->content, &cptype, &ns);
@@ -549,7 +551,6 @@ static zval *master_to_zval_int(zval *ret, encodePtr encode, xmlNodePtr data)
 				}
 				smart_str_appends(&nscat, cptype);
 				smart_str_0(&nscat);
-				efree(cptype);
 				if (ns) {efree(ns);}
 				if ((new_enc = zend_hash_find_ptr(SOAP_GLOBAL(typemap), nscat.s)) != NULL) {
 					encode = new_enc;
@@ -830,25 +831,60 @@ static zval *to_zval_hexbin(zval *ret, encodeTypePtr type, xmlNodePtr data)
 	return ret;
 }
 
+static zend_string *get_serialization_string_from_zval(zval *data)
+{
+	switch (Z_TYPE_P(data)) {
+		case IS_OBJECT:
+			if (Z_OBJCE_P(data)->ce_flags & ZEND_ACC_ENUM) {
+				if (UNEXPECTED(Z_OBJCE_P(data)->enum_backing_type == IS_UNDEF)) {
+					zend_value_error("Non-backed enums have no default serialization");
+					return zend_empty_string;
+				} else {
+					zval *value = zend_enum_fetch_case_value(Z_OBJ_P(data));
+					return zval_get_string_func(value);
+				}
+			}
+			ZEND_FALLTHROUGH;
+		default:
+			return zval_get_string_func(data);
+	}
+}
+
+static zend_long get_serialization_long_from_zval(zval *data)
+{
+	switch (Z_TYPE_P(data)) {
+		case IS_OBJECT:
+			if (Z_OBJCE_P(data)->ce_flags & ZEND_ACC_ENUM) {
+				if (UNEXPECTED(Z_OBJCE_P(data)->enum_backing_type != IS_LONG)) {
+					if (Z_OBJCE_P(data)->enum_backing_type == IS_UNDEF) {
+						zend_value_error("Non-backed enums have no default serialization");
+					} else {
+						zend_value_error("String-backed enum cannot be serialized as int");
+					}
+					return 0;
+				} else {
+					zval *value = zend_enum_fetch_case_value(Z_OBJ_P(data));
+					ZEND_ASSERT(Z_TYPE_P(value) == IS_LONG);
+					return Z_LVAL_P(value);
+				}
+			}
+			ZEND_FALLTHROUGH;
+		default:
+			return zval_get_long(data);
+	}
+}
+
 static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
 {
 	xmlNodePtr ret, text;
-	char *str;
-	int new_len;
 
 	ret = xmlNewNode(NULL, BAD_CAST("BOGUS"));
 	xmlAddChild(parent, ret);
 	FIND_ZVAL_NULL(data, ret, style);
 
-	if (Z_TYPE_P(data) == IS_STRING) {
-		str = estrndup(Z_STRVAL_P(data), Z_STRLEN_P(data));
-		new_len = Z_STRLEN_P(data);
-	} else {
-		zend_string *tmp = zval_get_string_func(data);
-		str = estrndup(ZSTR_VAL(tmp), ZSTR_LEN(tmp));
-		new_len = ZSTR_LEN(tmp);
-		zend_string_release_ex(tmp, 0);
-	}
+	zend_string *serialization = get_serialization_string_from_zval(data);
+	char *str = ZSTR_VAL(serialization);
+	size_t new_len = ZSTR_LEN(serialization);
 
 	if (SOAP_GLOBAL(encoding) != NULL) {
 		xmlBufferPtr in  = xmlBufferCreateStatic(str, new_len);
@@ -856,7 +892,8 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo
 		int n = xmlCharEncInFunc(SOAP_GLOBAL(encoding), out, in);
 
 		if (n >= 0) {
-			efree(str);
+			zend_string_release(serialization);
+			serialization = NULL;
 			str = estrdup((char*)xmlBufferContent(out));
 			new_len = n;
 		}
@@ -907,7 +944,11 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo
 
 	text = xmlNewTextLen(BAD_CAST(str), new_len);
 	xmlAddChild(ret, text);
-	efree(str);
+	if (serialization) {
+		zend_string_release(serialization);
+	} else {
+		efree(str);
+	}
 
 	if (style == SOAP_ENCODED) {
 		set_ns_and_type(ret, type);
@@ -918,19 +959,14 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo
 static xmlNodePtr to_xml_base64(encodeTypePtr type, zval *data, int style, xmlNodePtr parent)
 {
 	xmlNodePtr ret, text;
-	zend_string *str;
 
 	ret = xmlNewNode(NULL, BAD_CAST("BOGUS"));
 	xmlAddChild(parent, ret);
 	FIND_ZVAL_NULL(data, ret, style);
 
-	if (Z_TYPE_P(data) == IS_STRING) {
-		str = php_base64_encode((unsigned char*)Z_STRVAL_P(data), Z_STRLEN_P(data));
-	} else {
-		zend_string *tmp = zval_get_string_func(data);
-		str = php_base64_encode((unsigned char*) ZSTR_VAL(tmp), ZSTR_LEN(tmp));
-		zend_string_release_ex(tmp, 0);
-	}
+	zend_string *serialization = get_serialization_string_from_zval(data);
+	zend_string *str = php_base64_encode((unsigned char *) ZSTR_VAL(serialization), ZSTR_LEN(serialization));
+	zend_string_release(serialization);
 
 	text = xmlNewTextLen(BAD_CAST(ZSTR_VAL(str)), ZSTR_LEN(str));
 	xmlAddChild(ret, text);
@@ -955,7 +991,7 @@ static xmlNodePtr to_xml_hexbin(encodeTypePtr type, zval *data, int style, xmlNo
 	FIND_ZVAL_NULL(data, ret, style);
 
 	if (Z_TYPE_P(data) != IS_STRING) {
-		ZVAL_STR(&tmp, zval_get_string_func(data));
+		ZVAL_STR(&tmp, get_serialization_string_from_zval(data));
 		data = &tmp;
 	}
 	str = (unsigned char *) safe_emalloc(Z_STRLEN_P(data) * 2, sizeof(char), 1);
@@ -1063,7 +1099,7 @@ static xmlNodePtr to_xml_long(encodeTypePtr type, zval *data, int style, xmlNode
 		snprintf(s, sizeof(s), "%0.0F",floor(Z_DVAL_P(data)));
 		xmlNodeSetContent(ret, BAD_CAST(s));
 	} else {
-		zend_string *str = zend_long_to_str(zval_get_long(data));
+		zend_string *str = zend_long_to_str(get_serialization_long_from_zval(data));
 		xmlNodeSetContentLen(ret, BAD_CAST(ZSTR_VAL(str)), ZSTR_LEN(str));
 		zend_string_release_ex(str, 0);
 	}
@@ -1421,7 +1457,9 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z
 					return ret;
 				}
 
-				object_init_ex(ret, ce);
+				if (object_init_ex(ret, ce) != SUCCESS) {
+					return ret;
+				}
 				master_to_zval_int(&base, enc, data);
 				set_zval_property(ret, "_", &base);
 			} else {
@@ -1430,7 +1468,9 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z
 				if (soap_check_xml_ref(ret, data)) {
 					return ret;
 				}
-				object_init_ex(ret, ce);
+				if (object_init_ex(ret, ce) != SUCCESS) {
+					return ret;
+				}
 				soap_add_xml_ref(ret, data);
 			}
 		} else if (sdlType->kind == XSD_TYPEKIND_EXTENSION &&
@@ -1475,7 +1515,9 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z
 					return ret;
 				}
 
-				object_init_ex(ret, ce);
+				if (object_init_ex(ret, ce) != SUCCESS) {
+					return ret;
+				}
 				soap_add_xml_ref(ret, data);
 				master_to_zval_int(&base, sdlType->encode, data);
 				set_zval_property(ret, "_", &base);
@@ -1486,7 +1528,9 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z
 			if (soap_check_xml_ref(ret, data)) {
 				return ret;
 			}
-			object_init_ex(ret, ce);
+			if (object_init_ex(ret, ce) != SUCCESS) {
+				return ret;
+			}
 			soap_add_xml_ref(ret, data);
 		}
 		if (sdlType->model) {
@@ -1546,7 +1590,9 @@ static zval *to_zval_object_ex(zval *ret, encodeTypePtr type, xmlNodePtr data, z
 			return ret;
 		}
 
-		object_init_ex(ret, ce);
+		if (object_init_ex(ret, ce) != SUCCESS) {
+			return ret;
+		}
 		soap_add_xml_ref(ret, data);
 		trav = data->children;
 
@@ -2103,6 +2149,13 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
 	xmlNodePtr xparam;
 
 	if (data && Z_TYPE_P(data) == IS_ARRAY) {
+		if (UNEXPECTED(Z_IS_RECURSIVE_P(data))) {
+			zend_value_error("Recursive array cannot be encoded");
+			return;
+		}
+
+		GC_TRY_PROTECT_RECURSION(Z_ARRVAL_P(data));
+
 		ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL_P(data), zdata) {
 	 		if (j >= dims[0]) {
 	 			break;
@@ -2151,6 +2204,8 @@ static void add_xml_array_elements(xmlNodePtr xmlParam,
 				j++;
 			}
 		}
+
+		GC_TRY_UNPROTECT_RECURSION(Z_ARRVAL_P(data));
 	} else {
 		for (j=0; jget_iterator(ce, data, 0);
 
-		if (EG(exception)) {
-			goto iterator_done;
+		if (!iter) {
+			goto iterator_failed_to_get;
 		}
 
 		if (iter->funcs->rewind) {
@@ -2254,6 +2309,7 @@ static xmlNodePtr to_xml_array(encodeTypePtr type, zval *data, int style, xmlNod
 		}
 iterator_done:
 		OBJ_RELEASE(&iter->std);
+iterator_failed_to_get:
 		if (EG(exception)) {
 			zval_ptr_dtor(&array_copy);
 			ZVAL_UNDEF(&array_copy);
@@ -2466,7 +2522,8 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data)
 	if (data &&
 	    (attr = get_attribute(data->properties,"arrayType")) &&
 	    attr->children && attr->children->content) {
-		char *type, *end, *ns;
+		const char *type;
+		char *end, *ns;
 		xmlNsPtr nsptr;
 
 		parse_namespace(attr->children->content, &type, &ns);
@@ -2481,13 +2538,13 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data)
 		if (nsptr != NULL) {
 			enc = get_encoder(SOAP_GLOBAL(sdl), (char*)nsptr->href, type);
 		}
-		efree(type);
 		if (ns) {efree(ns);}
 
 	} else if ((attr = get_attribute(data->properties,"itemType")) &&
 	    attr->children &&
 	    attr->children->content) {
-		char *type, *ns;
+		const char *type;
+		char *ns;
 		xmlNsPtr nsptr;
 
 		parse_namespace(attr->children->content, &type, &ns);
@@ -2495,7 +2552,6 @@ static zval *to_zval_array(zval *ret, encodeTypePtr type, xmlNodePtr data)
 		if (nsptr != NULL) {
 			enc = get_encoder(SOAP_GLOBAL(sdl), (char*)nsptr->href, type);
 		}
-		efree(type);
 		if (ns) {efree(ns);}
 
 		if ((attr = get_attribute(data->properties,"arraySize")) &&
@@ -2668,6 +2724,13 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
 	FIND_ZVAL_NULL(data, xmlParam, style);
 
 	if (Z_TYPE_P(data) == IS_ARRAY) {
+		if (UNEXPECTED(Z_IS_RECURSIVE_P(data))) {
+			zend_value_error("Recursive array cannot be encoded");
+			return NULL;
+		}
+
+		GC_TRY_PROTECT_RECURSION(Z_ARRVAL_P(data));
+
 		ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL_P(data), int_val, key_val, temp_data) {
 			item = xmlNewNode(NULL, BAD_CAST("item"));
 			xmlAddChild(xmlParam, item);
@@ -2695,6 +2758,8 @@ static xmlNodePtr to_xml_map(encodeTypePtr type, zval *data, int style, xmlNodeP
 			xparam = master_to_xml(get_conversion(Z_TYPE_P(temp_data)), temp_data, style, item);
 			xmlNodeSetName(xparam, BAD_CAST("value"));
 		} ZEND_HASH_FOREACH_END();
+
+		GC_TRY_UNPROTECT_RECURSION(Z_ARRVAL_P(data));
 	}
 	if (style == SOAP_ENCODED) {
 		set_ns_and_type(xmlParam, type);
@@ -2828,7 +2893,8 @@ static zval *guess_zval_convert(zval *ret, encodeTypePtr type, xmlNodePtr data)
 	master_to_zval_int(ret, enc, data);
 	if (SOAP_GLOBAL(sdl) && type_name && enc->details.sdl_type) {
 		zval soapvar;
-		char *ns, *cptype;
+		const char *cptype;
+		char *ns;
 		xmlNsPtr nsptr;
 
 		object_init_ex(&soapvar, soap_var_class_entry);
@@ -2840,7 +2906,6 @@ static zval *guess_zval_convert(zval *ret, encodeTypePtr type, xmlNodePtr data)
 		if (nsptr) {
 			ZVAL_STRING(Z_VAR_ENC_NS_P(&soapvar), (char*)nsptr->href);
 		}
-		efree(cptype);
 		if (ns) {efree(ns);}
 		ZVAL_COPY_VALUE(ret, &soapvar);
 	}
@@ -3026,7 +3091,7 @@ static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style, xmlNodeP
 		smart_str list = {0};
 
 		if (Z_TYPE_P(data) != IS_STRING) {
-			ZVAL_STR(&tmp, zval_get_string_func(data));
+			ZVAL_STR(&tmp, get_serialization_string_from_zval(data));
 			data = &tmp;
 		}
 		str = estrndup(Z_STRVAL_P(data), Z_STRLEN_P(data));
@@ -3135,13 +3200,10 @@ static xmlNodePtr to_xml_any(encodeTypePtr type, zval *data, int style, xmlNodeP
 		} ZEND_HASH_FOREACH_END();
 		return ret;
 	}
-	if (Z_TYPE_P(data) == IS_STRING) {
-		ret = xmlNewTextLen(BAD_CAST(Z_STRVAL_P(data)), Z_STRLEN_P(data));
-	} else {
-		zend_string *tmp = zval_get_string_func(data);
-		ret = xmlNewTextLen(BAD_CAST(ZSTR_VAL(tmp)), ZSTR_LEN(tmp));
-		zend_string_release_ex(tmp, 0);
-	}
+
+	zend_string *serialization = get_serialization_string_from_zval(data);
+	ret = xmlNewTextLen(BAD_CAST(ZSTR_VAL(serialization)), ZSTR_LEN(serialization));
+	zend_string_release_ex(serialization, false);
 
 	ret->name = xmlStringTextNoenc;
 	ret->parent = parent;
diff --git a/ext/soap/php_http.c b/ext/soap/php_http.c
index bd548b5b303f1..a55780615f4d8 100644
--- a/ext/soap/php_http.c
+++ b/ext/soap/php_http.c
@@ -78,6 +78,68 @@ int basic_authentication(zval* this_ptr, smart_str* soap_headers)
 	return 0;
 }
 
+static void http_context_add_header(const char *s,
+									bool has_authorization,
+									bool has_proxy_authorization,
+									bool has_cookies,
+									smart_str *soap_headers)
+{
+	const char *p;
+	int name_len;
+
+	while (*s) {
+		/* skip leading newlines and spaces */
+		while (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') {
+			s++;
+		}
+		/* extract header name */
+		p = s;
+		name_len = -1;
+		while (*p) {
+			if (*p == ':') {
+				if (name_len < 0) name_len = p - s;
+				break;
+			} else if (*p == ' ' || *p == '\t') {
+				if (name_len < 0) name_len = p - s;
+			} else if (*p == '\r' || *p == '\n') {
+				break;
+			}
+			p++;
+		}
+		if (*p == ':') {
+			/* extract header value */
+			while (*p && *p != '\r' && *p != '\n') {
+				p++;
+			}
+			/* skip some predefined headers */
+			if ((name_len != sizeof("host")-1 ||
+				 strncasecmp(s, "host", sizeof("host")-1) != 0) &&
+				(name_len != sizeof("connection")-1 ||
+				 strncasecmp(s, "connection", sizeof("connection")-1) != 0) &&
+				(name_len != sizeof("user-agent")-1 ||
+				 strncasecmp(s, "user-agent", sizeof("user-agent")-1) != 0) &&
+				(name_len != sizeof("content-length")-1 ||
+				 strncasecmp(s, "content-length", sizeof("content-length")-1) != 0) &&
+				(name_len != sizeof("content-type")-1 ||
+				 strncasecmp(s, "content-type", sizeof("content-type")-1) != 0) &&
+				(!has_cookies ||
+				 name_len != sizeof("cookie")-1 ||
+				 strncasecmp(s, "cookie", sizeof("cookie")-1) != 0) &&
+				(!has_authorization ||
+				 name_len != sizeof("authorization")-1 ||
+				 strncasecmp(s, "authorization", sizeof("authorization")-1) != 0) &&
+				(!has_proxy_authorization ||
+				 name_len != sizeof("proxy-authorization")-1 ||
+				 strncasecmp(s, "proxy-authorization", sizeof("proxy-authorization")-1) != 0)) {
+				/* add header */
+				smart_str_appendl(soap_headers, s, p-s);
+				smart_str_append_const(soap_headers, "\r\n");
+			}
+		}
+		s = (*p) ? (p + 1) : p;
+	}
+}
+
 /* Additional HTTP headers */
 void http_context_headers(php_stream_context* context,
                           bool has_authorization,
@@ -86,64 +148,16 @@ void http_context_headers(php_stream_context* context,
                           smart_str* soap_headers)
 {
 	zval *tmp;
-
-	if (context &&
-		(tmp = php_stream_context_get_option(context, "http", "header")) != NULL &&
-		Z_TYPE_P(tmp) == IS_STRING && Z_STRLEN_P(tmp)) {
-		char *s = Z_STRVAL_P(tmp);
-		char *p;
-		int name_len;
-
-		while (*s) {
-			/* skip leading newlines and spaces */
-			while (*s == ' ' || *s == '\t' || *s == '\r' || *s == '\n') {
-				s++;
-			}
-			/* extract header name */
-			p = s;
-			name_len = -1;
-			while (*p) {
-				if (*p == ':') {
-					if (name_len < 0) name_len = p - s;
-					break;
-				} else if (*p == ' ' || *p == '\t') {
-					if (name_len < 0) name_len = p - s;
-				} else if (*p == '\r' || *p == '\n') {
-					break;
+	if (context && (tmp = php_stream_context_get_option(context, "http", "header")) != NULL) {
+		if (Z_TYPE_P(tmp) == IS_STRING && Z_STRLEN_P(tmp)) {
+			http_context_add_header(Z_STRVAL_P(tmp), has_authorization, has_proxy_authorization, has_cookies, soap_headers);
+		} else if (Z_TYPE_P(tmp) == IS_ARRAY) {
+			zval *value;
+			ZEND_HASH_FOREACH_VAL(Z_ARR_P(tmp), value) {
+				if (Z_TYPE_P(value) == IS_STRING && Z_STRLEN_P(value)) {
+					http_context_add_header(Z_STRVAL_P(value), has_authorization, has_proxy_authorization, has_cookies, soap_headers);
 				}
-				p++;
-			}
-			if (*p == ':') {
-				/* extract header value */
-				while (*p && *p != '\r' && *p != '\n') {
-					p++;
-				}
-				/* skip some predefined headers */
-				if ((name_len != sizeof("host")-1 ||
-				     strncasecmp(s, "host", sizeof("host")-1) != 0) &&
-				    (name_len != sizeof("connection")-1 ||
-				     strncasecmp(s, "connection", sizeof("connection")-1) != 0) &&
-				    (name_len != sizeof("user-agent")-1 ||
-				     strncasecmp(s, "user-agent", sizeof("user-agent")-1) != 0) &&
-				    (name_len != sizeof("content-length")-1 ||
-				     strncasecmp(s, "content-length", sizeof("content-length")-1) != 0) &&
-				    (name_len != sizeof("content-type")-1 ||
-				     strncasecmp(s, "content-type", sizeof("content-type")-1) != 0) &&
-				    (!has_cookies ||
-				     name_len != sizeof("cookie")-1 ||
-				     strncasecmp(s, "cookie", sizeof("cookie")-1) != 0) &&
-				    (!has_authorization ||
-				     name_len != sizeof("authorization")-1 ||
-				     strncasecmp(s, "authorization", sizeof("authorization")-1) != 0) &&
-				    (!has_proxy_authorization ||
-				     name_len != sizeof("proxy-authorization")-1 ||
-				     strncasecmp(s, "proxy-authorization", sizeof("proxy-authorization")-1) != 0)) {
-				    /* add header */
-					smart_str_appendl(soap_headers, s, p-s);
-					smart_str_append_const(soap_headers, "\r\n");
-				}
-			}
-			s = (*p) ? (p + 1) : p;
+			} ZEND_HASH_FOREACH_END();
 		}
 	}
 }
@@ -442,6 +456,7 @@ int make_http_soap_request(zval        *this_ptr,
 		}
 		add_soap_fault(this_ptr, "HTTP", "Unable to parse URL", NULL, NULL);
 		smart_str_free(&soap_headers_z);
+		efree(http_msg);
 		return FALSE;
 	}
 
@@ -455,6 +470,7 @@ int make_http_soap_request(zval        *this_ptr,
 		}
 		add_soap_fault(this_ptr, "HTTP", "Unknown protocol. Only http and https are allowed.", NULL, NULL);
 		smart_str_free(&soap_headers_z);
+		efree(http_msg);
 		return FALSE;
 	}
 
@@ -468,6 +484,7 @@ int make_http_soap_request(zval        *this_ptr,
 		add_soap_fault(this_ptr, "HTTP", "SSL support is not available in this build", NULL, NULL);
 		PG(allow_url_fopen) = old_allow_url_fopen;
 		smart_str_free(&soap_headers_z);
+		efree(http_msg);
 		return FALSE;
 	}
 
@@ -522,6 +539,7 @@ int make_http_soap_request(zval        *this_ptr,
 			add_soap_fault(this_ptr, "HTTP", "Could not connect to host", NULL, NULL);
 			PG(allow_url_fopen) = old_allow_url_fopen;
 			smart_str_free(&soap_headers_z);
+			efree(http_msg);
 			return FALSE;
 		}
 	}
@@ -673,6 +691,7 @@ int make_http_soap_request(zval        *this_ptr,
 					convert_to_null(Z_CLIENT_USE_PROXY_P(this_ptr));
 					smart_str_free(&soap_headers_z);
 					smart_str_free(&soap_headers);
+					efree(http_msg);
 					return FALSE;
 				}
 
@@ -890,12 +909,14 @@ int make_http_soap_request(zval        *this_ptr,
 			convert_to_null(Z_CLIENT_USE_PROXY_P(this_ptr));
 			add_soap_fault(this_ptr, "HTTP", "Failed Sending HTTP SOAP request", NULL, NULL);
 			smart_str_free(&soap_headers_z);
+			efree(http_msg);
 			return FALSE;
 		}
 		smart_str_free(&soap_headers);
 	} else {
 		add_soap_fault(this_ptr, "HTTP", "Failed to create stream??", NULL, NULL);
 		smart_str_free(&soap_headers_z);
+		efree(http_msg);
 		return FALSE;
 	}
 
@@ -912,6 +933,7 @@ int make_http_soap_request(zval        *this_ptr,
 				convert_to_null(Z_CLIENT_USE_PROXY_P(this_ptr));
 				add_soap_fault(this_ptr, "HTTP", "Error Fetching http headers", NULL, NULL);
 				smart_str_free(&soap_headers_z);
+				efree(http_msg);
 				return FALSE;
 			}
 
@@ -1159,6 +1181,7 @@ int make_http_soap_request(zval        *this_ptr,
 				if (--redirect_max < 1) {
 					add_soap_fault(this_ptr, "HTTP", "Redirection limit reached, aborting", NULL, NULL);
 					smart_str_free(&soap_headers_z);
+					efree(http_msg);
 					return FALSE;
 				}
 
diff --git a/ext/soap/php_schema.c b/ext/soap/php_schema.c
index 8f94ec07b2ed6..e1bf37686ac1d 100644
--- a/ext/soap/php_schema.c
+++ b/ext/soap/php_schema.c
@@ -98,6 +98,13 @@ static encodePtr get_create_encoder(sdlPtr sdl, sdlTypePtr cur_type, const xmlCh
 	return enc;
 }
 
+/* Necessary for some error paths to avoid leaking persistent memory. */
+static void requestify_string(xmlChar **str) {
+	xmlChar *copy = (xmlChar *) estrdup((const char *) *str);
+	xmlFree(*str);
+	*str = copy;
+}
+
 static void schema_load_file(sdlCtx *ctx, xmlAttrPtr ns, xmlChar *location, xmlAttrPtr tns, int import) {
 	if (location != NULL &&
 	    !zend_hash_str_exists(&ctx->docs, (char*)location, xmlStrlen(location))) {
@@ -110,22 +117,35 @@ static void schema_load_file(sdlCtx *ctx, xmlAttrPtr ns, xmlChar *location, xmlA
 		sdl_restore_uri_credentials(ctx);
 
 		if (doc == NULL) {
+			requestify_string(&location);
 			soap_error1(E_ERROR, "Parsing Schema: can't import schema from '%s'", location);
 		}
 		schema = get_node(doc->children, "schema");
 		if (schema == NULL) {
+			requestify_string(&location);
 			xmlFreeDoc(doc);
 			soap_error1(E_ERROR, "Parsing Schema: can't import schema from '%s'", location);
 		}
 		new_tns = get_attribute(schema->properties, "targetNamespace");
 		if (import) {
 			if (ns != NULL && (new_tns == NULL || xmlStrcmp(ns->children->content, new_tns->children->content) != 0)) {
-				xmlFreeDoc(doc);
-				soap_error2(E_ERROR, "Parsing Schema: can't import schema from '%s', unexpected 'targetNamespace'='%s'", location, ns->children->content);
+				requestify_string(&location);
+				if (new_tns == NULL) {
+					xmlFreeDoc(doc);
+					soap_error2(E_ERROR, "Parsing Schema: can't import schema from '%s', missing 'targetNamespace', expected '%s'", location, ns->children->content);
+				} else {
+					/* Have to make a copy to avoid a UAF after freeing `doc` */
+					const char *target_ns_copy = estrdup((const char *) new_tns->children->content);
+					xmlFreeDoc(doc);
+					soap_error3(E_ERROR, "Parsing Schema: can't import schema from '%s', unexpected 'targetNamespace'='%s', expected '%s'", location, target_ns_copy, ns->children->content);
+				}
 			}
 			if (ns == NULL && new_tns != NULL) {
+				requestify_string(&location);
+				/* Have to make a copy to avoid a UAF after freeing `doc` */
+				const char *target_ns_copy = estrdup((const char *) new_tns->children->content);
 				xmlFreeDoc(doc);
-				soap_error2(E_ERROR, "Parsing Schema: can't import schema from '%s', unexpected 'targetNamespace'='%s'", location, new_tns->children->content);
+				soap_error2(E_ERROR, "Parsing Schema: can't import schema from '%s', unexpected 'targetNamespace'='%s', expected no 'targetNamespace'", location, target_ns_copy);
 			}
 		} else {
 			new_tns = get_attribute(schema->properties, "targetNamespace");
@@ -134,6 +154,7 @@ static void schema_load_file(sdlCtx *ctx, xmlAttrPtr ns, xmlChar *location, xmlA
 					xmlSetProp(schema, BAD_CAST("targetNamespace"), tns->children->content);
 				}
 			} else if (tns != NULL && xmlStrcmp(tns->children->content, new_tns->children->content) != 0) {
+				requestify_string(&location);
 				xmlFreeDoc(doc);
 				soap_error1(E_ERROR, "Parsing Schema: can't include schema from '%s', different 'targetNamespace'", location);
 			}
@@ -143,6 +164,22 @@ static void schema_load_file(sdlCtx *ctx, xmlAttrPtr ns, xmlChar *location, xmlA
 	}
 }
 
+/* Returned uri must be freed by the caller. */
+xmlChar *schema_location_construct_uri(const xmlAttr *attribute)
+{
+	xmlChar *uri;
+	xmlChar *base = xmlNodeGetBase(attribute->doc, attribute->parent);
+
+	if (base == NULL) {
+		uri = xmlBuildURI(attribute->children->content, attribute->doc->URL);
+	} else {
+		uri = xmlBuildURI(attribute->children->content, base);
+		xmlFree(base);
+	}
+
+	return uri;
+}
+
 /*
 2.6.1 xsi:type
 2.6.2 xsi:nil
@@ -196,15 +233,7 @@ int load_schema(sdlCtx *ctx, xmlNodePtr schema)
 			if (location == NULL) {
 				soap_error0(E_ERROR, "Parsing Schema: include has no 'schemaLocation' attribute");
 			} else {
-				xmlChar *uri;
-				xmlChar *base = xmlNodeGetBase(trav->doc, trav);
-
-				if (base == NULL) {
-			    uri = xmlBuildURI(location->children->content, trav->doc->URL);
-				} else {
-	    		uri = xmlBuildURI(location->children->content, base);
-			    xmlFree(base);
-				}
+				xmlChar *uri = schema_location_construct_uri(location);
 				schema_load_file(ctx, NULL, uri, tns, 0);
 				xmlFree(uri);
 			}
@@ -216,15 +245,7 @@ int load_schema(sdlCtx *ctx, xmlNodePtr schema)
 			if (location == NULL) {
 				soap_error0(E_ERROR, "Parsing Schema: redefine has no 'schemaLocation' attribute");
 			} else {
-			  xmlChar *uri;
-				xmlChar *base = xmlNodeGetBase(trav->doc, trav);
-
-				if (base == NULL) {
-			    uri = xmlBuildURI(location->children->content, trav->doc->URL);
-				} else {
-	    		uri = xmlBuildURI(location->children->content, base);
-			    xmlFree(base);
-				}
+				xmlChar *uri = schema_location_construct_uri(location);
 				schema_load_file(ctx, NULL, uri, tns, 0);
 				xmlFree(uri);
 				/* TODO:  support */
@@ -245,14 +266,7 @@ int load_schema(sdlCtx *ctx, xmlNodePtr schema)
 				}
 			}
 			if (location) {
-				xmlChar *base = xmlNodeGetBase(trav->doc, trav);
-
-				if (base == NULL) {
-			    uri = xmlBuildURI(location->children->content, trav->doc->URL);
-				} else {
-	    		uri = xmlBuildURI(location->children->content, base);
-			    xmlFree(base);
-				}
+				uri = schema_location_construct_uri(location);
 			}
 			schema_load_file(ctx, ns, uri, tns, 1);
 			if (uri != NULL) {xmlFree(uri);}
@@ -421,7 +435,8 @@ static int schema_list(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr listType, sdlTypeP
 
 	itemType = get_attribute(listType->properties, "itemType");
 	if (itemType != NULL) {
-		char *type, *ns;
+		const char *type;
+		char *ns;
 		xmlNsPtr nsptr;
 
 		parse_namespace(itemType->children->content, &type, &ns);
@@ -443,7 +458,6 @@ static int schema_list(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr listType, sdlTypeP
 			}
 			zend_hash_next_index_insert_ptr(cur_type->elements, newType);
 		}
-		if (type) {efree(type);}
 		if (ns) {efree(ns);}
 	}
 
@@ -505,7 +519,8 @@ static int schema_union(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr unionType, sdlTyp
 	memberTypes = get_attribute(unionType->properties, "memberTypes");
 	if (memberTypes != NULL) {
 		char *str, *start, *end, *next;
-		char *type, *ns;
+		const char *type;
+		char *ns;
 		xmlNsPtr nsptr;
 
 		str = estrdup((char*)memberTypes->children->content);
@@ -539,7 +554,6 @@ static int schema_union(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr unionType, sdlTyp
 				}
 				zend_hash_next_index_insert_ptr(cur_type->elements, newType);
 			}
-			if (type) {efree(type);}
 			if (ns) {efree(ns);}
 
 			start = next;
@@ -648,7 +662,8 @@ static int schema_restriction_simpleContent(sdlPtr sdl, xmlAttrPtr tns, xmlNodeP
 
 	base = get_attribute(restType->properties, "base");
 	if (base != NULL) {
-		char *type, *ns;
+		const char *type;
+		char *ns;
 		xmlNsPtr nsptr;
 
 		parse_namespace(base->children->content, &type, &ns);
@@ -656,7 +671,6 @@ static int schema_restriction_simpleContent(sdlPtr sdl, xmlAttrPtr tns, xmlNodeP
 		if (nsptr != NULL) {
 			cur_type->encode = get_create_encoder(sdl, cur_type, nsptr->href, BAD_CAST(type));
 		}
-		if (type) {efree(type);}
 		if (ns) {efree(ns);}
 	} else if (!simpleType) {
 		soap_error0(E_ERROR, "Parsing Schema: restriction has no 'base' attribute");
@@ -753,7 +767,8 @@ static int schema_restriction_complexContent(sdlPtr sdl, xmlAttrPtr tns, xmlNode
 
 	base = get_attribute(restType->properties, "base");
 	if (base != NULL) {
-		char *type, *ns;
+		const char *type;
+		char *ns;
 		xmlNsPtr nsptr;
 
 		parse_namespace(base->children->content, &type, &ns);
@@ -761,7 +776,6 @@ static int schema_restriction_complexContent(sdlPtr sdl, xmlAttrPtr tns, xmlNode
 		if (nsptr != NULL) {
 			cur_type->encode = get_create_encoder(sdl, cur_type, nsptr->href, BAD_CAST(type));
 		}
-		if (type) {efree(type);}
 		if (ns) {efree(ns);}
 	} else {
 		soap_error0(E_ERROR, "Parsing Schema: restriction has no 'base' attribute");
@@ -878,7 +892,8 @@ static int schema_extension_simpleContent(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr
 
 	base = get_attribute(extType->properties, "base");
 	if (base != NULL) {
-		char *type, *ns;
+		const char *type;
+		char *ns;
 		xmlNsPtr nsptr;
 
 		parse_namespace(base->children->content, &type, &ns);
@@ -886,7 +901,6 @@ static int schema_extension_simpleContent(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr
 		if (nsptr != NULL) {
 			cur_type->encode = get_create_encoder(sdl, cur_type, nsptr->href, BAD_CAST(type));
 		}
-		if (type) {efree(type);}
 		if (ns) {efree(ns);}
 	} else {
 		soap_error0(E_ERROR, "Parsing Schema: extension has no 'base' attribute");
@@ -933,7 +947,8 @@ static int schema_extension_complexContent(sdlPtr sdl, xmlAttrPtr tns, xmlNodePt
 
 	base = get_attribute(extType->properties, "base");
 	if (base != NULL) {
-		char *type, *ns;
+		const char *type;
+		char *ns;
 		xmlNsPtr nsptr;
 
 		parse_namespace(base->children->content, &type, &ns);
@@ -941,7 +956,6 @@ static int schema_extension_complexContent(sdlPtr sdl, xmlAttrPtr tns, xmlNodePt
 		if (nsptr != NULL) {
 			cur_type->encode = get_create_encoder(sdl, cur_type, nsptr->href, BAD_CAST(type));
 		}
-		if (type) {efree(type);}
 		if (ns) {efree(ns);}
 	} else {
 		soap_error0(E_ERROR, "Parsing Schema: extension has no 'base' attribute");
@@ -1082,7 +1096,8 @@ static int schema_group(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr groupType, sdlTyp
 		smart_str key = {0};
 
 		if (ref) {
-			char *type, *ns;
+			const char *type;
+			char *ns;
 			xmlNsPtr nsptr;
 
 			parse_namespace(ref->children->content, &type, &ns);
@@ -1106,7 +1121,6 @@ static int schema_group(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr groupType, sdlTyp
 			newModel->kind = XSD_CONTENT_GROUP_REF;
 			newModel->u.group_ref = estrndup(ZSTR_VAL(key.s), ZSTR_LEN(key.s));
 
-			if (type) {efree(type);}
 			if (ns) {efree(ns);}
 		} else {
 			newModel = emalloc(sizeof(sdlContentModel));
@@ -1520,7 +1534,8 @@ static int schema_element(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr element, sdlTyp
 
 		if (ref) {
 			smart_str nscat = {0};
-			char *type, *ns;
+			const char *type;
+			char *ns;
 			xmlNsPtr nsptr;
 
 			parse_namespace(ref->children->content, &type, &ns);
@@ -1541,7 +1556,6 @@ static int schema_element(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr element, sdlTyp
 			smart_str_appends(&nscat, type);
 			newType->name = estrdup(type);
 			smart_str_0(&nscat);
-			if (type) {efree(type);}
 			if (ns) {efree(ns);}
 			newType->ref = estrndup(ZSTR_VAL(nscat.s), ZSTR_LEN(nscat.s));
 			smart_str_free(&nscat);
@@ -1665,7 +1679,8 @@ static int schema_element(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr element, sdlTyp
 	/* type = QName */
 	type = get_attribute(attrs, "type");
 	if (type) {
-		char *cptype, *str_ns;
+		const char *cptype;
+		char *str_ns;
 		xmlNsPtr nsptr;
 
 		if (ref != NULL) {
@@ -1677,7 +1692,6 @@ static int schema_element(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr element, sdlTyp
 			cur_type->encode = get_create_encoder(sdl, cur_type, nsptr->href, BAD_CAST(cptype));
 		}
 		if (str_ns) {efree(str_ns);}
-		if (cptype) {efree(cptype);}
 	}
 
 	trav = element->children;
@@ -1752,7 +1766,8 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
 		memset(newAttr, 0, sizeof(sdlAttribute));
 
 		if (ref) {
-			char *attr_name, *ns;
+			const char *attr_name;
+			char *ns;
 			xmlNsPtr nsptr;
 
 			parse_namespace(ref->children->content, &attr_name, &ns);
@@ -1773,7 +1788,6 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
 			smart_str_appends(&key, attr_name);
 			smart_str_0(&key);
 			newAttr->ref = estrndup(ZSTR_VAL(key.s), ZSTR_LEN(key.s));
-			if (attr_name) {efree(attr_name);}
 			if (ns) {efree(ns);}
 		} else {
 			xmlAttrPtr ns;
@@ -1813,7 +1827,8 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
 	/* type = QName */
 	type = get_attribute(attrType->properties, "type");
 	if (type) {
-		char *cptype, *str_ns;
+		const char *cptype;
+		char *str_ns;
 		xmlNsPtr nsptr;
 
 		if (ref != NULL) {
@@ -1825,7 +1840,6 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
 			newAttr->encode = get_create_encoder(sdl, cur_type, nsptr->href, BAD_CAST(cptype));
 		}
 		if (str_ns) {efree(str_ns);}
-		if (cptype) {efree(cptype);}
 	}
 
 	attr = attrType->properties;
@@ -1867,7 +1881,8 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
 				smart_str key2 = {0};
 				sdlExtraAttributePtr ext;
 				xmlNsPtr nsptr;
-				char *value, *ns;
+				const char *value;
+				char *ns;
 
 				ext = emalloc(sizeof(sdlExtraAttribute));
 				memset(ext, 0, sizeof(sdlExtraAttribute));
@@ -1880,7 +1895,6 @@ static int schema_attribute(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrType, sdl
 					ext->val = estrdup((char*)attr->children->content);
 				}
 				if (ns) {efree(ns);}
-				efree(value);
 
 				if (!newAttr->extraAttributes) {
 					newAttr->extraAttributes = emalloc(sizeof(HashTable));
@@ -1993,7 +2007,8 @@ static int schema_attributeGroup(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrGrou
 			smart_str_free(&key);
 		} else if (ref) {
 			sdlAttributePtr newAttr;
-			char *group_name, *ns;
+			const char *group_name;
+			char *ns;
 			smart_str key = {0};
 			xmlNsPtr nsptr;
 
@@ -2013,7 +2028,6 @@ static int schema_attributeGroup(sdlPtr sdl, xmlAttrPtr tns, xmlNodePtr attrGrou
 			smart_str_appends(&key, group_name);
 			smart_str_0(&key);
 			newAttr->ref = estrndup(ZSTR_VAL(key.s), ZSTR_LEN(key.s));
-			if (group_name) {efree(group_name);}
 			if (ns) {efree(ns);}
 			smart_str_free(&key);
 
diff --git a/ext/soap/php_schema.h b/ext/soap/php_schema.h
index e84c77baff724..68035000e1e57 100644
--- a/ext/soap/php_schema.h
+++ b/ext/soap/php_schema.h
@@ -22,6 +22,8 @@
 int load_schema(sdlCtx *ctx, xmlNodePtr schema);
 void schema_pass2(sdlCtx *ctx);
 
+xmlChar *schema_location_construct_uri(const xmlAttr *attribute);
+
 void delete_model(zval *zv);
 void delete_model_persistent(zval *zv);
 void delete_type(zval *zv);
diff --git a/ext/soap/php_sdl.c b/ext/soap/php_sdl.c
index 68565e72dfa2e..5826c82c644ed 100644
--- a/ext/soap/php_sdl.c
+++ b/ext/soap/php_sdl.c
@@ -48,7 +48,8 @@ encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr node, const xmlChar *ty
 {
 	encodePtr enc = NULL;
 	xmlNsPtr nsptr;
-	char *ns, *cptype;
+	const char *cptype;
+	char *ns;
 
 	parse_namespace(type, &cptype, &ns);
 	nsptr = xmlSearchNs(node->doc, node, BAD_CAST(ns));
@@ -60,7 +61,6 @@ encodePtr get_encoder_from_prefix(sdlPtr sdl, xmlNodePtr node, const xmlChar *ty
 	} else {
 		enc = get_encoder_ex(sdl, (char*)type, xmlStrlen(type));
 	}
-	efree(cptype);
 	if (ns) {efree(ns);}
 	return enc;
 }
@@ -71,7 +71,8 @@ static sdlTypePtr get_element(sdlPtr sdl, xmlNodePtr node, const xmlChar *type)
 
 	if (sdl->elements) {
 		xmlNsPtr nsptr;
-		char *ns, *cptype;
+		const char *cptype;
+		char *ns;
 		sdlTypePtr sdl_type;
 
 		parse_namespace(type, &cptype, &ns);
@@ -99,7 +100,6 @@ static sdlTypePtr get_element(sdlPtr sdl, xmlNodePtr node, const xmlChar *type)
 			}
 		}
 
-		efree(cptype);
 		if (ns) {efree(ns);}
 	}
 	return ret;
@@ -259,7 +259,9 @@ void sdl_set_uri_credentials(sdlCtx *ctx, char *uri)
 			ctx->context = php_stream_context_from_zval(context_ptr, 1);
 
 			if (ctx->context &&
-			    (header = php_stream_context_get_option(ctx->context, "http", "header")) != NULL) {
+			    (header = php_stream_context_get_option(ctx->context, "http", "header")) != NULL &&
+				Z_TYPE_P(header) == IS_STRING) {
+				/* TODO: should support header as an array, but this code path is untested */
 				s = strstr(Z_STRVAL_P(header), "Authorization: Basic");
 				if (s && (s == Z_STRVAL_P(header) || *(s-1) == '\n' || *(s-1) == '\r')) {
 					char *rest = strstr(s, "\r\n");
@@ -292,12 +294,11 @@ void sdl_restore_uri_credentials(sdlCtx *ctx)
 
 #define SAFE_STR(a) ((a)?((const char *)a):"")
 
-static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, int include)
+static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, bool include)
 {
 	sdlPtr tmpsdl = ctx->sdl;
 	xmlDocPtr wsdl;
 	xmlNodePtr root, definitions, trav;
-	xmlAttrPtr targetNamespace;
 
 	if (zend_hash_str_exists(&ctx->docs, struri, strlen(struri))) {
 		return;
@@ -333,7 +334,7 @@ static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, int include)
 	}
 
 	if (!include) {
-		targetNamespace = get_attribute(definitions->properties, "targetNamespace");
+		xmlAttrPtr targetNamespace = get_attribute(definitions->properties, "targetNamespace");
 		if (targetNamespace) {
 			tmpsdl->target_ns = estrdup((char*)targetNamespace->children->content);
 		}
@@ -361,16 +362,8 @@ static void load_wsdl_ex(zval *this_ptr, char *struri, sdlCtx *ctx, int include)
 			/* TODO: namespace ??? */
 			xmlAttrPtr tmp = get_attribute(trav->properties, "location");
 			if (tmp) {
-				xmlChar *uri;
-				xmlChar *base = xmlNodeGetBase(trav->doc, trav);
-
-				if (base == NULL) {
-					uri = xmlBuildURI(tmp->children->content, trav->doc->URL);
-				} else {
-					uri = xmlBuildURI(tmp->children->content, base);
-					xmlFree(base);
-				}
-				load_wsdl_ex(this_ptr, (char*)uri, ctx, 1);
+				xmlChar *uri = schema_location_construct_uri(tmp);
+				load_wsdl_ex(this_ptr, (char*)uri, ctx, true);
 				xmlFree(uri);
 			}
 
@@ -534,36 +527,35 @@ static sdlSoapBindingFunctionHeaderPtr wsdl_soap_binding_header(sdlCtx* ctx, xml
 
 static void wsdl_soap_binding_body(sdlCtx* ctx, xmlNodePtr node, char* wsdl_soap_namespace, sdlSoapBindingFunctionBody *binding, HashTable* params)
 {
-	xmlNodePtr body, trav;
-	xmlAttrPtr tmp;
+	xmlNodePtr trav;
 
 	trav = node->children;
 	while (trav != NULL) {
 		if (node_is_equal_ex(trav, "body", wsdl_soap_namespace)) {
-			body = trav;
+			xmlNodePtr body = trav;
 
-			tmp = get_attribute(body->properties, "use");
-			if (tmp && !strncmp((char*)tmp->children->content, "literal", sizeof("literal"))) {
+			xmlAttrPtr useAttribute = get_attribute(body->properties, "use");
+			if (useAttribute && !strncmp((char*)useAttribute->children->content, "literal", sizeof("literal"))) {
 				binding->use = SOAP_LITERAL;
 			} else {
 				binding->use = SOAP_ENCODED;
 			}
 
-			tmp = get_attribute(body->properties, "namespace");
-			if (tmp) {
-				binding->ns = estrdup((char*)tmp->children->content);
+			xmlAttrPtr namespaceAttribute = get_attribute(body->properties, "namespace");
+			if (namespaceAttribute) {
+				binding->ns = estrdup((char*)namespaceAttribute->children->content);
 			}
 
-			tmp = get_attribute(body->properties, "parts");
-			if (tmp) {
+			xmlAttrPtr partsAttribute = get_attribute(body->properties, "parts");
+			if (partsAttribute) {
 				HashTable    ht;
-				char *parts = (char*)tmp->children->content;
+				char *parts = (char*)partsAttribute->children->content;
 
 				/* Delete all parts those are not in the "parts" attribute */
 				zend_hash_init(&ht, 0, NULL, delete_parameter, 0);
 				while (*parts) {
 					sdlParamPtr param;
-					int found = 0;
+					bool found = false;
 					char *end;
 
 					while (*parts == ' ') ++parts;
@@ -571,15 +563,14 @@ static void wsdl_soap_binding_body(sdlCtx* ctx, xmlNodePtr node, char* wsdl_soap
 					end = strchr(parts, ' ');
 					if (end) *end = '\0';
 					ZEND_HASH_FOREACH_PTR(params, param) {
-						if (param->paramName &&
-						    strcmp(parts, param->paramName) == 0) {
-					  	sdlParamPtr x_param;
-					  	x_param = emalloc(sizeof(sdlParam));
-					  	*x_param = *param;
-					  	param->paramName = NULL;
-					  	zend_hash_next_index_insert_ptr(&ht, x_param);
-					  	found = 1;
-					  	break;
+						if (param->paramName && strcmp(parts, param->paramName) == 0) {
+					  		sdlParamPtr x_param;
+					  		x_param = emalloc(sizeof(sdlParam));
+					  		*x_param = *param;
+					  		param->paramName = NULL;
+					  		zend_hash_next_index_insert_ptr(&ht, x_param);
+					  		found = true;
+					  		break;
 						}
 					} ZEND_HASH_FOREACH_END();
 					if (!found) {
@@ -593,14 +584,14 @@ static void wsdl_soap_binding_body(sdlCtx* ctx, xmlNodePtr node, char* wsdl_soap
 			}
 
 			if (binding->use == SOAP_ENCODED) {
-				tmp = get_attribute(body->properties, "encodingStyle");
-				if (tmp) {
-					if (strncmp((char*)tmp->children->content, SOAP_1_1_ENC_NAMESPACE, sizeof(SOAP_1_1_ENC_NAMESPACE)) == 0) {
+				xmlAttrPtr encodingStyleAttribute = get_attribute(body->properties, "encodingStyle");
+				if (encodingStyleAttribute) {
+					if (strncmp((char*)encodingStyleAttribute->children->content, SOAP_1_1_ENC_NAMESPACE, sizeof(SOAP_1_1_ENC_NAMESPACE)) == 0) {
 						binding->encodingStyle = SOAP_ENCODING_1_1;
-					} else if (strncmp((char*)tmp->children->content, SOAP_1_2_ENC_NAMESPACE, sizeof(SOAP_1_2_ENC_NAMESPACE)) == 0) {
+					} else if (strncmp((char*)encodingStyleAttribute->children->content, SOAP_1_2_ENC_NAMESPACE, sizeof(SOAP_1_2_ENC_NAMESPACE)) == 0) {
 						binding->encodingStyle = SOAP_ENCODING_1_2;
 					} else {
-						soap_error1(E_ERROR, "Parsing WSDL: Unknown encodingStyle '%s'", tmp->children->content);
+						soap_error1(E_ERROR, "Parsing WSDL: Unknown encodingStyle '%s'", encodingStyleAttribute->children->content);
 					}
 				} else {
 					soap_error0(E_ERROR, "Parsing WSDL: Unspecified encodingStyle");
@@ -632,29 +623,28 @@ static void wsdl_soap_binding_body(sdlCtx* ctx, xmlNodePtr node, char* wsdl_soap
 	}
 }
 
-static HashTable* wsdl_message(sdlCtx *ctx, xmlChar* message_name)
+static HashTable* wsdl_message(const sdlCtx *ctx, const xmlChar* message_name)
 {
-	xmlNodePtr trav, part, message = NULL, tmp;
 	HashTable* parameters = NULL;
-	char *ctype;
 
-	ctype = strrchr((char*)message_name,':');
+	const char *ctype = strrchr((const char*)message_name,':');
 	if (ctype == NULL) {
-		ctype = (char*)message_name;
+		ctype = (const char*)message_name;
 	} else {
 		++ctype;
 	}
-	if ((tmp = zend_hash_str_find_ptr(&ctx->messages, ctype, strlen(ctype))) == NULL) {
-		soap_error1(E_ERROR, "Parsing WSDL: Missing  with name '%s'", message_name);
+
+	xmlNodePtr message = zend_hash_str_find_ptr(&ctx->messages, ctype, strlen(ctype));
+	if (message == NULL) {
+		soap_error1(E_ERROR, "Parsing WSDL: Missing  with name '%s'", (const char*)message_name);
 	}
-	message = tmp;
 
 	parameters = emalloc(sizeof(HashTable));
 	zend_hash_init(parameters, 0, NULL, delete_parameter, 0);
 
-	trav = message->children;
+	xmlNodePtr trav = message->children;
 	while (trav != NULL) {
-		xmlAttrPtr element, type, name;
+		xmlAttrPtr type, name;
 		sdlParamPtr param;
 
 		if (trav->ns != NULL && strcmp((char*)trav->ns->href, WSDL_NAMESPACE) != 0) {
@@ -667,7 +657,7 @@ static HashTable* wsdl_message(sdlCtx *ctx, xmlChar* message_name)
 		if (!node_is_equal(trav,"part")) {
 			soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>",  SAFE_STR(trav->name));
 		}
-		part = trav;
+		xmlNodePtr part = trav;
 		param = emalloc(sizeof(sdlParam));
 		memset(param,0,sizeof(sdlParam));
 		param->order = 0;
@@ -683,7 +673,7 @@ static HashTable* wsdl_message(sdlCtx *ctx, xmlChar* message_name)
 		if (type != NULL) {
 			param->encode = get_encoder_from_prefix(ctx->sdl, part, type->children->content);
 		} else {
-			element = get_attribute(part->properties, "element");
+			xmlAttrPtr element = get_attribute(part->properties, "element");
 			if (element != NULL) {
 				param->element = get_element(ctx->sdl, part, element->children->content);
 				if (param->element) {
@@ -701,10 +691,8 @@ static HashTable* wsdl_message(sdlCtx *ctx, xmlChar* message_name)
 
 static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 {
-	sdlCtx ctx;
-	size_t i,n;
+	sdlCtx ctx = {0};
 
-	memset(&ctx,0,sizeof(ctx));
 	ctx.sdl = emalloc(sizeof(sdl));
 	memset(ctx.sdl, 0, sizeof(sdl));
 	ctx.sdl->source = estrdup(struri);
@@ -717,16 +705,19 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 	zend_hash_init(&ctx.services,  0, NULL, NULL, 0);
 
 	zend_try {
-	load_wsdl_ex(this_ptr, struri, &ctx, 0);
-	schema_pass2(&ctx);
+		load_wsdl_ex(this_ptr, struri, &ctx, false);
+		schema_pass2(&ctx);
+
+		uint32_t n = zend_hash_num_elements(&ctx.services);
+		if (n == 0) {
+			soap_error0(E_ERROR, "Parsing WSDL: Couldn't bind to service");
+		}
 
-	n = zend_hash_num_elements(&ctx.services);
-	if (n > 0) {
 		zend_hash_internal_pointer_reset(&ctx.services);
-		for (i = 0; i < n; i++) {
+		for (uint32_t i = 0; i < n; i++) {
 			xmlNodePtr service, tmp;
 			xmlNodePtr trav, port;
-			int has_soap_port = 0;
+			bool has_soap_port = false;
 
 			service = tmp = zend_hash_get_current_data_ptr(&ctx.services);
 
@@ -796,7 +787,7 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 						soap_error0(E_ERROR, "Parsing WSDL: No address associated with ");
 					}
 				}
-				has_soap_port = 1;
+				has_soap_port = true;
 
 				location = get_attribute(address->properties, "location");
 				if (!location) {
@@ -819,7 +810,6 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 				if (tmpbinding->bindingType == BINDING_SOAP) {
 					sdlSoapBindingPtr soapBinding;
 					xmlNodePtr soapBindingNode;
-					xmlAttrPtr tmp;
 
 					soapBinding = emalloc(sizeof(sdlSoapBinding));
 					memset(soapBinding, 0, sizeof(sdlSoapBinding));
@@ -827,14 +817,14 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 
 					soapBindingNode = get_node_ex(binding->children, "binding", wsdl_soap_namespace);
 					if (soapBindingNode) {
-						tmp = get_attribute(soapBindingNode->properties, "style");
-						if (tmp && !strncmp((char*)tmp->children->content, "rpc", sizeof("rpc"))) {
+						xmlAttrPtr styleAttribute = get_attribute(soapBindingNode->properties, "style");
+						if (styleAttribute && !strncmp((char*)styleAttribute->children->content, "rpc", sizeof("rpc"))) {
 							soapBinding->style = SOAP_RPC;
 						}
 
-						tmp = get_attribute(soapBindingNode->properties, "transport");
-						if (tmp) {
-							if (strncmp((char*)tmp->children->content, WSDL_HTTP_TRANSPORT, sizeof(WSDL_HTTP_TRANSPORT)) == 0) {
+						xmlAttrPtr transportAttribute = get_attribute(soapBindingNode->properties, "transport");
+						if (transportAttribute) {
+							if (strncmp((char*)transportAttribute->children->content, WSDL_HTTP_TRANSPORT, sizeof(WSDL_HTTP_TRANSPORT)) == 0) {
 								soapBinding->transport = SOAP_TRANSPORT_HTTP;
 							} else {
 								/* try the next binding */
@@ -922,7 +912,6 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 						sdlSoapBindingFunctionPtr soapFunctionBinding;
 						sdlSoapBindingPtr soapBinding;
 						xmlNodePtr soapOperation;
-						xmlAttrPtr tmp;
 
 						soapFunctionBinding = emalloc(sizeof(sdlSoapBindingFunction));
 						memset(soapFunctionBinding, 0, sizeof(sdlSoapBindingFunction));
@@ -931,14 +920,14 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 
 						soapOperation = get_node_ex(operation->children, "operation", wsdl_soap_namespace);
 						if (soapOperation) {
-							tmp = get_attribute(soapOperation->properties, "soapAction");
-							if (tmp) {
-								soapFunctionBinding->soapAction = estrdup((char*)tmp->children->content);
+							xmlAttrPtr soapActionAttribute = get_attribute(soapOperation->properties, "soapAction");
+							if (soapActionAttribute) {
+								soapFunctionBinding->soapAction = estrdup((char*)soapActionAttribute->children->content);
 							}
 
-							tmp = get_attribute(soapOperation->properties, "style");
-							if (tmp) {
-								if (!strncmp((char*)tmp->children->content, "rpc", sizeof("rpc"))) {
+							xmlAttrPtr styleAttribute = get_attribute(soapOperation->properties, "style");
+							if (styleAttribute) {
+								if (!strncmp((char*)styleAttribute->children->content, "rpc", sizeof("rpc"))) {
 									soapFunctionBinding->style = SOAP_RPC;
 								} else {
 									soapFunctionBinding->style = SOAP_DOCUMENT;
@@ -1022,11 +1011,11 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 					fault = portTypeOperation->children;
 					while (fault != NULL) {
 						if (node_is_equal_ex(fault, "fault", WSDL_NAMESPACE)) {
-							xmlAttrPtr message, name;
+							xmlAttrPtr message;
 							sdlFaultPtr f;
 
-							name = get_attribute(fault->properties, "name");
-							if (name == NULL) {
+							xmlAttrPtr faultNameAttribute = get_attribute(fault->properties, "name");
+							if (faultNameAttribute == NULL) {
 								soap_error1(E_ERROR, "Parsing WSDL: Missing name for  of '%s'", op_name->children->content);
 							}
 							message = get_attribute(fault->properties, "message");
@@ -1037,54 +1026,53 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 							f = emalloc(sizeof(sdlFault));
 							memset(f, 0, sizeof(sdlFault));
 
-							f->name = estrdup((char*)name->children->content);
+							f->name = estrdup((char*)faultNameAttribute->children->content);
 							f->details = wsdl_message(&ctx, message->children->content);
 							if (f->details == NULL || zend_hash_num_elements(f->details) > 1) {
 								soap_error1(E_ERROR, "Parsing WSDL: The fault message '%s' must have a single part", message->children->content);
 							}
 
 							if (tmpbinding->bindingType == BINDING_SOAP) {
-								xmlNodePtr soap_fault = get_node_with_attribute_ex(operation->children, "fault", WSDL_NAMESPACE, "name", f->name, NULL);
-								if (soap_fault != NULL) {
-									xmlNodePtr trav = soap_fault->children;
-									while (trav != NULL) {
-										if (node_is_equal_ex(trav, "fault", wsdl_soap_namespace)) {
-											xmlAttrPtr tmp;
-										  sdlSoapBindingFunctionFaultPtr binding;
-
-											binding = f->bindingAttributes = emalloc(sizeof(sdlSoapBindingFunctionFault));
+								xmlNodePtr soapFault = get_node_with_attribute_ex(operation->children, "fault", WSDL_NAMESPACE, "name", f->name, NULL);
+								if (soapFault != NULL) {
+									xmlNodePtr faultNodes = soapFault->children;
+									while (faultNodes != NULL) {
+										if (node_is_equal_ex(faultNodes, "fault", wsdl_soap_namespace)) {
+											sdlSoapBindingFunctionFaultPtr faultBinding;
+
+											faultBinding = f->bindingAttributes = emalloc(sizeof(sdlSoapBindingFunctionFault));
 											memset(f->bindingAttributes, 0, sizeof(sdlSoapBindingFunctionFault));
 
-											tmp = get_attribute(trav->properties, "use");
-											if (tmp && !strncmp((char*)tmp->children->content, "encoded", sizeof("encoded"))) {
-												binding->use = SOAP_ENCODED;
+											xmlAttrPtr faultUseAttribute = get_attribute(faultNodes->properties, "use");
+											if (faultUseAttribute && !strncmp((char*)faultUseAttribute->children->content, "encoded", sizeof("encoded"))) {
+												faultBinding->use = SOAP_ENCODED;
 											} else {
-												binding->use = SOAP_LITERAL;
+												faultBinding->use = SOAP_LITERAL;
 											}
 
-											tmp = get_attribute(trav->properties, "namespace");
-											if (tmp) {
-												binding->ns = estrdup((char*)tmp->children->content);
+											xmlAttrPtr faultNamespaceAttribute = get_attribute(faultNodes->properties, "namespace");
+											if (faultNamespaceAttribute) {
+												faultBinding->ns = estrdup((char*)faultNamespaceAttribute->children->content);
 											}
 
-											if (binding->use == SOAP_ENCODED) {
-												tmp = get_attribute(trav->properties, "encodingStyle");
-												if (tmp) {
-													if (strncmp((char*)tmp->children->content, SOAP_1_1_ENC_NAMESPACE, sizeof(SOAP_1_1_ENC_NAMESPACE)) == 0) {
-														binding->encodingStyle = SOAP_ENCODING_1_1;
-													} else if (strncmp((char*)tmp->children->content, SOAP_1_2_ENC_NAMESPACE, sizeof(SOAP_1_2_ENC_NAMESPACE)) == 0) {
-														binding->encodingStyle = SOAP_ENCODING_1_2;
+											if (faultBinding->use == SOAP_ENCODED) {
+												xmlAttrPtr faultEncodingStyleAttribute = get_attribute(faultNodes->properties, "encodingStyle");
+												if (faultEncodingStyleAttribute) {
+													if (strncmp((char*)faultEncodingStyleAttribute->children->content, SOAP_1_1_ENC_NAMESPACE, sizeof(SOAP_1_1_ENC_NAMESPACE)) == 0) {
+														faultBinding->encodingStyle = SOAP_ENCODING_1_1;
+													} else if (strncmp((char*)faultEncodingStyleAttribute->children->content, SOAP_1_2_ENC_NAMESPACE, sizeof(SOAP_1_2_ENC_NAMESPACE)) == 0) {
+														faultBinding->encodingStyle = SOAP_ENCODING_1_2;
 													} else {
-														soap_error1(E_ERROR, "Parsing WSDL: Unknown encodingStyle '%s'", tmp->children->content);
+														soap_error1(E_ERROR, "Parsing WSDL: Unknown encodingStyle '%s'", faultEncodingStyleAttribute->children->content);
 													}
 												} else {
 													soap_error0(E_ERROR, "Parsing WSDL: Unspecified encodingStyle");
 												}
 											}
-										} else if (is_wsdl_element(trav) && !node_is_equal(trav,"documentation")) {
-											soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>",  SAFE_STR(trav->name));
+										} else if (is_wsdl_element(faultNodes) && !node_is_equal(faultNodes,"documentation")) {
+											soap_error1(E_ERROR, "Parsing WSDL: Unexpected WSDL element <%s>",  SAFE_STR(faultNodes->name));
 										}
-										trav = trav->next;
+										faultNodes = faultNodes->next;
 									}
 								}
 							}
@@ -1102,24 +1090,24 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 					function->binding = tmpbinding;
 
 					{
-						char *tmp = estrdup(function->functionName);
-						size_t len = strlen(tmp);
+						size_t function_name_len = strlen(function->functionName);
+						char *lc_function_name = zend_str_tolower_dup(function->functionName, function_name_len);
 
-						zend_str_tolower(tmp, len);
-						if (zend_hash_str_add_ptr(&ctx.sdl->functions, tmp, len, function) == NULL) {
+						if (zend_hash_str_add_ptr(&ctx.sdl->functions, lc_function_name, function_name_len, function) == NULL) {
 							zend_hash_next_index_insert_ptr(&ctx.sdl->functions, function);
 						}
-						efree(tmp);
+						efree(lc_function_name);
+
 						if (function->requestName != NULL && strcmp(function->requestName,function->functionName) != 0) {
 							if (ctx.sdl->requests == NULL) {
 								ctx.sdl->requests = emalloc(sizeof(HashTable));
 								zend_hash_init(ctx.sdl->requests, 0, NULL, NULL, 0);
 							}
-							tmp = estrdup(function->requestName);
-							len = strlen(tmp);
-							zend_str_tolower(tmp, len);
-							zend_hash_str_add_ptr(ctx.sdl->requests, tmp, len, function);
-							efree(tmp);
+
+							size_t request_name_len = strlen(function->requestName);
+							char *lc_request_name = zend_str_tolower_dup(function->requestName, request_name_len);
+							zend_hash_str_add_ptr(ctx.sdl->requests, lc_request_name, request_name_len, function);
+							efree(lc_request_name);
 						}
 					}
 					trav2 = trav2->next;
@@ -1138,13 +1126,10 @@ static sdlPtr load_wsdl(zval *this_ptr, char *struri)
 
 			zend_hash_move_forward(&ctx.services);
 		}
-	} else {
-		soap_error0(E_ERROR, "Parsing WSDL: Couldn't bind to service");
-	}
 
-	if (ctx.sdl->bindings == NULL || ctx.sdl->bindings->nNumOfElements == 0) {
-		soap_error0(E_ERROR, "Parsing WSDL: Could not find any usable binding services in WSDL.");
-	}
+		if (ctx.sdl->bindings == NULL || ctx.sdl->bindings->nNumOfElements == 0) {
+			soap_error0(E_ERROR, "Parsing WSDL: Could not find any usable binding services in WSDL.");
+		}
 
 	} zend_catch {
 		/* Avoid persistent memory leak. */
diff --git a/ext/soap/php_soap.h b/ext/soap/php_soap.h
index 715af76faf5fb..a78734aa7f17a 100644
--- a/ext/soap/php_soap.h
+++ b/ext/soap/php_soap.h
@@ -98,6 +98,9 @@ struct _soapService {
 	int        features;
 	int        send_errors;
 	struct _soapHeader **soap_headers_ptr;
+
+	bool         trace;
+	zend_string *last_response_body;
 };
 
 #define SOAP_CLASS 1
diff --git a/ext/soap/php_xml.c b/ext/soap/php_xml.c
index 78e928996664e..d39688b59b5cd 100644
--- a/ext/soap/php_xml.c
+++ b/ext/soap/php_xml.c
@@ -315,17 +315,16 @@ xmlNodePtr get_node_with_attribute_recursive_ex(xmlNodePtr node, char *name, cha
 	return NULL;
 }
 
-int parse_namespace(const xmlChar *inval, char **value, char **namespace)
+/* namespace is either a copy or NULL, value is never NULL and never a copy. */
+void parse_namespace(const xmlChar *inval, const char **value, char **namespace)
 {
-	char *found = strrchr((char*)inval, ':');
+	const char *found = strrchr((const char *) inval, ':');
 
-	if (found != NULL && found != (char*)inval) {
-		(*namespace) = estrndup((char*)inval, found - (char*)inval);
-		(*value) = estrdup(++found);
+	if (found != NULL && found != (const char *) inval) {
+		(*namespace) = estrndup((const char *) inval, found - (const char *) inval);
+		(*value) = ++found;
 	} else {
-		(*value) = estrdup((char*)inval);
+		(*value) = (const char *) inval;
 		(*namespace) = NULL;
 	}
-
-	return FALSE;
 }
diff --git a/ext/soap/php_xml.h b/ext/soap/php_xml.h
index ac56003083fea..8bbb8f316061e 100644
--- a/ext/soap/php_xml.h
+++ b/ext/soap/php_xml.h
@@ -39,7 +39,7 @@ xmlNodePtr get_node_ex(xmlNodePtr node,char *name, char *ns);
 xmlNodePtr get_node_recursive_ex(xmlNodePtr node,char *name, char *ns);
 xmlNodePtr get_node_with_attribute_ex(xmlNodePtr node, char *name, char *name_ns, char *attribute, char *value, char *attr_ns);
 xmlNodePtr get_node_with_attribute_recursive_ex(xmlNodePtr node, char *name, char *name_ns, char *attribute, char *value, char *attr_ns);
-int parse_namespace(const xmlChar *inval,char **value,char **namespace);
+void parse_namespace(const xmlChar *inval, const char **value, char **namespace);
 
 #define FOREACHATTRNODE(n,c,i)      FOREACHATTRNODEEX(n,c,NULL,i)
 #define FOREACHATTRNODEEX(n,c,ns,i) \
diff --git a/ext/soap/soap.c b/ext/soap/soap.c
index 401fbde9d82a9..48a7fc8885e44 100644
--- a/ext/soap/soap.c
+++ b/ext/soap/soap.c
@@ -58,7 +58,7 @@ static sdlParamPtr get_param(sdlFunctionPtr function, const char *param_name, ze
 static sdlFunctionPtr get_function(sdlPtr sdl, const char *function_name, size_t function_name_length);
 static sdlFunctionPtr get_doc_function(sdlPtr sdl, xmlNodePtr params);
 
-static sdlFunctionPtr deserialize_function_call(sdlPtr sdl, xmlDocPtr request, const char* actor, zval *function_name, uint32_t *num_params, zval **parameters, int *version, soapHeader **headers);
+static sdlFunctionPtr deserialize_function_call(sdlPtr sdl, xmlDocPtr request, const char* actor, const char *soap_action, zval *function_name, uint32_t *num_params, zval **parameters, int *version, soapHeader **headers);
 static xmlDocPtr serialize_response_call(sdlFunctionPtr function, const char *function_name, const char *uri,zval *ret, soapHeader *headers, int version);
 static xmlDocPtr serialize_function_call(zval *this_ptr, sdlFunctionPtr function, const char *function_name, const char *uri, zval *arguments, uint32_t arg_count, int version, HashTable *soap_headers);
 static xmlNodePtr serialize_parameter(sdlParamPtr param,zval *param_val, uint32_t index,const char *name, int style, xmlNodePtr parent);
@@ -508,6 +508,7 @@ PHP_MINIT_FUNCTION(soap)
 	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.free_obj = soap_server_object_free;
+	soap_server_object_handlers.clone_obj = NULL;
 
 	/* Register SoapFault class */
 	soap_fault_class_entry = register_class_SoapFault(zend_ce_exception);
@@ -954,6 +955,9 @@ PHP_METHOD(SoapServer, __construct)
 
 		if ((tmp = zend_hash_str_find(ht, "classmap", sizeof("classmap")-1)) != NULL &&
 			Z_TYPE_P(tmp) == IS_ARRAY) {
+			if (HT_IS_PACKED(Z_ARRVAL_P(tmp))) {
+				php_error_docref(NULL, E_ERROR, "'classmap' option must be an associative array");
+			}
 			service->class_map = zend_array_dup(Z_ARRVAL_P(tmp));
 		}
 
@@ -983,6 +987,11 @@ PHP_METHOD(SoapServer, __construct)
 			}
 		}
 
+		if ((tmp = zend_hash_find(ht, ZSTR_KNOWN(ZEND_STR_TRACE))) != NULL &&
+		    (Z_TYPE_P(tmp) == IS_TRUE ||
+		     (Z_TYPE_P(tmp) == IS_LONG && Z_LVAL_P(tmp) == 1))) {
+			service->trace = true;
+		}
 	} else if (!wsdl) {
 		php_error_docref(NULL, E_ERROR, "'uri' option is required in nonWSDL mode");
 	}
@@ -1268,6 +1277,7 @@ PHP_METHOD(SoapServer, handle)
 	HashTable *old_class_map, *old_typemap;
 	int old_features;
 	zval tmp_soap;
+	const char *soap_action = NULL;
 
 	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|s!", &arg, &arg_len) == FAILURE) {
 		RETURN_THROWS();
@@ -1336,42 +1346,44 @@ PHP_METHOD(SoapServer, handle)
 
 	if (!arg) {
 		if (SG(request_info).request_body && 0 == php_stream_rewind(SG(request_info).request_body)) {
-			zval *server_vars, *encoding;
+			zval *server_vars, *encoding, *soap_action_z;
 			php_stream_filter *zf = NULL;
 			zend_string *server = ZSTR_KNOWN(ZEND_STR_AUTOGLOBAL_SERVER);
 
 			zend_is_auto_global(server);
-			if ((server_vars = zend_hash_find(&EG(symbol_table), server)) != NULL &&
-			    Z_TYPE_P(server_vars) == IS_ARRAY &&
-			    (encoding = zend_hash_str_find(Z_ARRVAL_P(server_vars), "HTTP_CONTENT_ENCODING", sizeof("HTTP_CONTENT_ENCODING")-1)) != NULL &&
-			    Z_TYPE_P(encoding) == IS_STRING) {
-
-				if (zend_string_equals_literal(Z_STR_P(encoding), "gzip")
-					|| zend_string_equals_literal(Z_STR_P(encoding), "x-gzip")
-					|| zend_string_equals_literal(Z_STR_P(encoding), "deflate")
-				) {
-					zval filter_params;
-
-					array_init_size(&filter_params, 1);
-					add_assoc_long_ex(&filter_params, "window", sizeof("window")-1, 0x2f); /* ANY WBITS */
-
-					zf = php_stream_filter_create("zlib.inflate", &filter_params, 0);
-					zend_array_destroy(Z_ARR(filter_params));
-
-					if (zf) {
-						php_stream_filter_append(&SG(request_info).request_body->readfilters, zf);
+			if ((server_vars = zend_hash_find(&EG(symbol_table), server)) != NULL && Z_TYPE_P(server_vars) == IS_ARRAY) {
+			    if ((encoding = zend_hash_str_find(Z_ARRVAL_P(server_vars), "HTTP_CONTENT_ENCODING", sizeof("HTTP_CONTENT_ENCODING")-1)) != NULL && Z_TYPE_P(encoding) == IS_STRING) {
+					if (zend_string_equals_literal(Z_STR_P(encoding), "gzip")
+						|| zend_string_equals_literal(Z_STR_P(encoding), "x-gzip")
+						|| zend_string_equals_literal(Z_STR_P(encoding), "deflate")
+					) {
+						zval filter_params;
+
+						array_init_size(&filter_params, 1);
+						add_assoc_long_ex(&filter_params, "window", sizeof("window")-1, 0x2f); /* ANY WBITS */
+
+						zf = php_stream_filter_create("zlib.inflate", &filter_params, 0);
+						zend_array_destroy(Z_ARR(filter_params));
+
+						if (zf) {
+							php_stream_filter_append(&SG(request_info).request_body->readfilters, zf);
+						} else {
+							php_error_docref(NULL, E_WARNING,"Can't uncompress compressed request");
+							SOAP_SERVER_END_CODE();
+							return;
+						}
 					} else {
-						php_error_docref(NULL, E_WARNING,"Can't uncompress compressed request");
+						php_error_docref(NULL, E_WARNING,"Request is compressed with unknown compression '%s'",Z_STRVAL_P(encoding));
 						SOAP_SERVER_END_CODE();
 						return;
 					}
-				} else {
-					php_error_docref(NULL, E_WARNING,"Request is compressed with unknown compression '%s'",Z_STRVAL_P(encoding));
-					SOAP_SERVER_END_CODE();
-					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);
+			}
+
 			doc_request = soap_xmlParseFile("php://input");
 
 			if (zf) {
@@ -1415,7 +1427,7 @@ PHP_METHOD(SoapServer, handle)
 	old_soap_version = SOAP_GLOBAL(soap_version);
 
 	zend_try {
-		function = deserialize_function_call(service->sdl, doc_request, service->actor, &function_name, &num_params, ¶ms, &soap_version, &soap_headers);
+		function = deserialize_function_call(service->sdl, doc_request, service->actor, soap_action, &function_name, &num_params, ¶ms, &soap_version, &soap_headers);
 	} zend_catch {
 		/* Avoid leaking persistent memory */
 		xmlFreeDoc(doc_request);
@@ -1644,6 +1656,12 @@ PHP_METHOD(SoapServer, handle)
 			sapi_add_header(cont_len, strlen(cont_len), 1);
 		}
 		php_write(buf, size);
+		if (service->trace) {
+			if (service->last_response_body) {
+				zend_string_release_ex(service->last_response_body, false);
+			}
+			service->last_response_body = zend_string_init((const char *) buf, size, false);
+		}
 		xmlFree(buf);
 	} else {
 		sapi_add_header("HTTP/1.1 202 Accepted", sizeof("HTTP/1.1 202 Accepted")-1, 1);
@@ -1752,6 +1770,16 @@ PHP_METHOD(SoapServer, addSoapHeader)
 }
 /* }}} */
 
+PHP_METHOD(SoapServer, __getLastResponse)
+{
+	soapServicePtr service;
+	ZEND_PARSE_PARAMETERS_NONE();
+	FETCH_THIS_SERVICE_NO_BAILOUT(service);
+	if (service->last_response_body) {
+		RETURN_STR_COPY(service->last_response_body);
+	}
+}
+
 static void soap_server_fault_ex(sdlFunctionPtr function, zval* fault, soapHeader *hdr) /* {{{ */
 {
 	int soap_version;
@@ -2092,6 +2120,9 @@ PHP_METHOD(SoapClient, __construct)
 		}
 		if ((tmp = zend_hash_str_find(ht, "classmap", sizeof("classmap")-1)) != NULL &&
 			Z_TYPE_P(tmp) == IS_ARRAY) {
+			if (HT_IS_PACKED(Z_ARRVAL_P(tmp))) {
+				php_error_docref(NULL, E_ERROR, "'classmap' option must be an associative array");
+			}
 			ZVAL_COPY(Z_CLIENT_CLASSMAP_P(this_ptr), tmp);
 		}
 
@@ -3039,6 +3070,8 @@ static void deserialize_parameters(xmlNodePtr params, sdlFunctionPtr function, u
 }
 /* }}} */
 
+/* This function attempts to find the right function name based on the first node's name in the soap body.
+ * If that doesn't work it falls back to get_doc_function(). */
 static sdlFunctionPtr find_function(sdlPtr sdl, xmlNodePtr func, zval* function_name) /* {{{ */
 {
 	sdlFunctionPtr function;
@@ -3069,6 +3102,37 @@ static sdlFunctionPtr find_function(sdlPtr sdl, xmlNodePtr func, zval* function_
 }
 /* }}} */
 
+static sdlFunctionPtr find_function_using_soap_action(const sdl *sdl, const char *soap_action, zval* function_name)
+{
+	if (!sdl) {
+		return NULL;
+	}
+
+	/* The soap action may be a http-quoted string, in which case we're removing the quotes here. */
+	size_t soap_action_length = strlen(soap_action);
+	if (soap_action[0] == '"') {
+		if (soap_action_length < 2 || soap_action[soap_action_length - 1] != '"') {
+			return NULL;
+		}
+		soap_action++;
+		soap_action_length -= 2;
+	}
+
+	/* 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;
+	ZEND_HASH_FOREACH_PTR(&sdl->functions, function) {
+		if (function->binding && function->binding->bindingType == BINDING_SOAP) {
+			sdlSoapBindingFunctionPtr fnb = function->bindingAttributes;
+			if (fnb && fnb->soapAction && strncmp(fnb->soapAction, soap_action, soap_action_length) == 0 && fnb->soapAction[soap_action_length] == '\0') {
+				ZVAL_STRING(function_name, function->functionName);
+				return function;
+			}
+		}
+	} ZEND_HASH_FOREACH_END();
+	return NULL;
+}
+
 static xmlNodePtr get_envelope(xmlNodePtr trav, int *version, char **envelope_ns) {
 	while (trav != NULL) {
 		if (trav->type == XML_ELEMENT_NODE) {
@@ -3094,12 +3158,12 @@ static xmlNodePtr get_envelope(xmlNodePtr trav, int *version, char **envelope_ns
 	return NULL;
 }
 
-static sdlFunctionPtr deserialize_function_call(sdlPtr sdl, xmlDocPtr request, const char* actor, zval *function_name, uint32_t *num_params, zval **parameters, int *version, soapHeader **headers) /* {{{ */
+static sdlFunctionPtr deserialize_function_call(sdlPtr sdl, xmlDocPtr request, const char* actor, const char *soap_action, zval *function_name, uint32_t *num_params, zval **parameters, int *version, soapHeader **headers) /* {{{ */
 {
 	char* envelope_ns = NULL;
 	xmlNodePtr trav,env,head,body,func;
 	xmlAttrPtr attr;
-	sdlFunctionPtr function;
+	sdlFunctionPtr function = NULL;
 
 	encode_reset_ns();
 
@@ -3183,12 +3247,17 @@ static sdlFunctionPtr deserialize_function_call(sdlPtr sdl, xmlDocPtr request, c
 		}
 		trav = trav->next;
 	}
+	if (soap_action) {
+		function = find_function_using_soap_action(sdl, soap_action, function_name);
+	}
 	if (func == NULL) {
-		function = get_doc_function(sdl, NULL);
-		if (function != NULL) {
-			ZVAL_STRING(function_name, (char *)function->functionName);
-		} else {
-			soap_server_fault("Client", "looks like we got \"Body\" without function call", NULL, NULL, NULL);
+		if (!function) {
+			function = get_doc_function(sdl, NULL);
+			if (function) {
+				ZVAL_STRING(function_name, (char *)function->functionName);
+			} else {
+				soap_server_fault("Client", "looks like we got \"Body\" without function call", NULL, NULL, NULL);
+			}
 		}
 	} else {
 		if (*version == SOAP_1_1) {
@@ -3202,7 +3271,9 @@ static sdlFunctionPtr deserialize_function_call(sdlPtr sdl, xmlDocPtr request, c
 				soap_server_fault("DataEncodingUnknown","Unknown Data Encoding Style", NULL, NULL, NULL);
 			}
 		}
-		function = find_function(sdl, func, function_name);
+		if (!function) {
+			function = find_function(sdl, func, function_name);
+		}
 		if (sdl != NULL && function == NULL) {
 			if (*version == SOAP_1_2) {
 				soap_server_fault("rpc:ProcedureNotPresent","Procedure not present", NULL, NULL, NULL);
@@ -4155,22 +4226,21 @@ static sdlFunctionPtr get_function(sdlPtr sdl, const char *function_name, size_t
 {
 	sdlFunctionPtr tmp;
 
-	char *str = estrndup(function_name, function_name_length);
-	zend_str_tolower(str, function_name_length);
 	if (sdl != NULL) {
-		if ((tmp = zend_hash_str_find_ptr(&sdl->functions, str, function_name_length)) != NULL) {
-			efree(str);
+		if ((tmp = zend_hash_str_find_ptr_lc(&sdl->functions, function_name, function_name_length)) != NULL) {
 			return tmp;
-		} else if (sdl->requests != NULL && (tmp = zend_hash_str_find_ptr(sdl->requests, str, function_name_length)) != NULL) {
-			efree(str);
+		} else if (sdl->requests != NULL && (tmp = zend_hash_str_find_ptr_lc(sdl->requests, function_name, function_name_length)) != NULL) {
 			return tmp;
 		}
 	}
-	efree(str);
 	return NULL;
 }
 /* }}} */
 
+/* This function tries to find the function that matches the given parameters.
+ * If params is NULL, it will return the first function that has no parameters.
+ * If params is not NULL, it will return the first function that has the same
+ * parameters as the given XML node. */
 static sdlFunctionPtr get_doc_function(sdlPtr sdl, xmlNodePtr params) /* {{{ */
 {
 	if (sdl) {
@@ -4533,6 +4603,9 @@ static void delete_service(soapServicePtr service) /* {{{ */
 		zend_hash_destroy(service->class_map);
 		FREE_HASHTABLE(service->class_map);
 	}
+	if (service->last_response_body) {
+		zend_string_release_ex(service->last_response_body, false);
+	}
 	zval_ptr_dtor(&service->soap_object);
 	efree(service);
 }
diff --git a/ext/soap/soap.stub.php b/ext/soap/soap.stub.php
index a387c3a2d7555..82f884e24b308 100644
--- a/ext/soap/soap.stub.php
+++ b/ext/soap/soap.stub.php
@@ -527,6 +527,8 @@ public function addFunction($functions): void {}
 
         /** @tentative-return-type */
         public function handle(?string $request = null): void {}
+
+        public function __getLastResponse(): ?string {}
     }
 
     class SoapClient
diff --git a/ext/soap/soap_arginfo.h b/ext/soap/soap_arginfo.h
index 4f6709094dd33..9ec093c5c9cd2 100644
--- a/ext/soap/soap_arginfo.h
+++ b/ext/soap/soap_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 66221c42416635403ee6d49c12884e94073b67f2 */
+ * Stub hash: 7712aba90b16090fbe7c124c1e3f26b2cc3e2ab2 */
 
 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")
@@ -84,6 +84,9 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SoapServer_handl
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, request, IS_STRING, 1, "null")
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SoapServer___getLastResponse, 0, 0, IS_STRING, 1)
+ZEND_END_ARG_INFO()
+
 #define arginfo_class_SoapClient___construct arginfo_class_SoapServer___construct
 
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SoapClient___call, 0, 2, IS_MIXED, 0)
@@ -152,6 +155,7 @@ ZEND_METHOD(SoapServer, setObject);
 ZEND_METHOD(SoapServer, getFunctions);
 ZEND_METHOD(SoapServer, addFunction);
 ZEND_METHOD(SoapServer, handle);
+ZEND_METHOD(SoapServer, __getLastResponse);
 ZEND_METHOD(SoapClient, __construct);
 ZEND_METHOD(SoapClient, __call);
 ZEND_METHOD(SoapClient, __soapCall);
@@ -204,6 +208,7 @@ static const zend_function_entry class_SoapServer_methods[] = {
 	ZEND_ME(SoapServer, getFunctions, arginfo_class_SoapServer_getFunctions, ZEND_ACC_PUBLIC)
 	ZEND_ME(SoapServer, addFunction, arginfo_class_SoapServer_addFunction, ZEND_ACC_PUBLIC)
 	ZEND_ME(SoapServer, handle, arginfo_class_SoapServer_handle, ZEND_ACC_PUBLIC)
+	ZEND_ME(SoapServer, __getLastResponse, arginfo_class_SoapServer___getLastResponse, ZEND_ACC_PUBLIC)
 	ZEND_FE_END
 };
 
@@ -367,9 +372,7 @@ static zend_class_entry *register_class_SoapHeader(void)
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_data_default_value;
 	ZVAL_NULL(&property_data_default_value);
@@ -540,9 +543,7 @@ static zend_class_entry *register_class_SoapClient(void)
 
 	zval property_trace_default_value;
 	ZVAL_FALSE(&property_trace_default_value);
-	zend_string *property_trace_name = zend_string_init("trace", sizeof("trace") - 1, 1);
-	zend_declare_typed_property(class_entry, property_trace_name, &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
-	zend_string_release(property_trace_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_TRACE), &property_trace_default_value, ZEND_ACC_PRIVATE, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_BOOL));
 
 	zval property_compression_default_value;
 	ZVAL_NULL(&property_compression_default_value);
diff --git a/ext/soap/tests/SoapServer/__getLastResponse.phpt b/ext/soap/tests/SoapServer/__getLastResponse.phpt
new file mode 100644
index 0000000000000..83c20d3c3a49c
--- /dev/null
+++ b/ext/soap/tests/SoapServer/__getLastResponse.phpt
@@ -0,0 +1,65 @@
+--TEST--
+Request #47317 (SoapServer::__getLastResponse)
+--EXTENSIONS--
+soap
+--INI--
+soap.wsdl_cache_enabled=0
+--FILE--
+server = new SoapServer($wsdl, $options);
+    $this->server->addFunction("f");
+  }
+
+  function __doRequest($request, $location, $action, $version, $one_way = 0): string {
+    ob_start();
+    $this->server->handle($request);
+    $response = ob_get_contents();
+    ob_end_clean();
+    return $response;
+  }
+}
+
+$client = new LocalSoapClient(__DIR__."/../classmap003.wsdl", ["trace" => false]);
+$client->f();
+var_dump($client->__getLastResponse());
+var_dump($client->server->__getLastResponse());
+var_dump($client->__getLastResponse() === $client->server->__getLastResponse());
+
+echo "---\n";
+
+$client = new LocalSoapClient(__DIR__."/../classmap003.wsdl", ["trace" => true]);
+var_dump($client->__getLastResponse());
+var_dump($client->server->__getLastResponse());
+var_dump($client->__getLastResponse() === $client->server->__getLastResponse());
+
+echo "---\n";
+
+$client->f();
+echo $client->__getLastResponse(), "\n";
+echo $client->server->__getLastResponse(), "\n";
+var_dump($client->__getLastResponse() === $client->server->__getLastResponse());
+?>
+--EXPECT--
+NULL
+NULL
+bool(true)
+---
+NULL
+NULL
+bool(true)
+---
+
+
+    
+        hello 
+     
+ 
+--FILE--
+addfunction("test");
+$server->addfunction("test2");
+$_SERVER["HTTP_SOAPACTION"] = "#test";
+$server->handle();
+$_SERVER["HTTP_SOAPACTION"] = "#test2";
+$server->handle();
+?>
+--EXPECT--
+
+olleh 5 
+    
+         
+    
+        
+             
+        
+             
+     
+    
+        
+            
+                 
+         
+        
+            
+                 
+         
+     
+    
+        
+             
+     
+ 
diff --git a/ext/soap/tests/bugs/bug62900.phpt b/ext/soap/tests/bugs/bug62900.phpt
new file mode 100644
index 0000000000000..c78afda5304af
--- /dev/null
+++ b/ext/soap/tests/bugs/bug62900.phpt
@@ -0,0 +1,95 @@
+--TEST--
+Bug #62900 (Wrong namespace on xsd import error message)
+--EXTENSIONS--
+soap
+--INI--
+soap.wsdl_cache_enabled=0
+--FILE--
+
+	
+		
+			 
+	 
+
+XML;
+
+$wsdl_without_ns = <<
+	
+		
+			 
+	 
+
+XML;
+
+$xsd_with_wrong_ns = <<
+
+
@@ -27,7 +39,7 @@ $HTTP_RAW_POST_DATA = <<
 
 EOF;
-$s->handle($HTTP_RAW_POST_DATA);
+handleFormatted($s, $HTTP_RAW_POST_DATA);
 
 // soap 1.2
 $HTTP_RAW_POST_DATA = <<
 
 EOF;
-$s->handle($HTTP_RAW_POST_DATA);
+handleFormatted($s, $HTTP_RAW_POST_DATA);
 ?>
 --EXPECT--
 
-some msg some msg some msg some msg SOAP-ENV:Server SoapServer::__construct(): 'classmap' option must be an associative array SOAP-ENV:Server Cannot instantiate abstract class CT_A1 QmFja2luZ1ZhbHVlMQ== BackingValue2 Third BackingValue3 4261636B696E6756616C756534 BackingValue5 1 2 
+	
+		
+			
+				
+					 
+			 
+   
+	 
+	
+		 
+	
+		
+			 
+	 
+	
+		
+			 
+	 
+	
+		
+			 
+	 
+ 
diff --git a/ext/soap/tests/gh16318.phpt b/ext/soap/tests/gh16318.phpt
new file mode 100644
index 0000000000000..a0a4c925df051
--- /dev/null
+++ b/ext/soap/tests/gh16318.phpt
@@ -0,0 +1,36 @@
+--TEST--
+GH-16318 (Recursive array segfaults soap encoding)
+--EXTENSIONS--
+soap
+--FILE--
+"test://","uri"=>"http://soapinterop.org/","trace"=>1,"exceptions"=>0));
+
+foreach ([$test1, $test2] as $test) {
+    try {
+        $client->__soapCall("echoStructArray", array($test), array("soapaction"=>"http://soapinterop.org/","uri"=>"http://soapinterop.org/"));
+    } catch (ValueError $e) {
+        echo $e->getMessage(), "\n";
+    }
+}
+
+?>
+--EXPECT--
+Recursive array cannot be encoded
+Recursive array cannot be encoded
diff --git a/ext/soap/tests/server011.phpt b/ext/soap/tests/server011.phpt
index ad4a626c79016..f236ec3affc59 100644
--- a/ext/soap/tests/server011.phpt
+++ b/ext/soap/tests/server011.phpt
@@ -1,5 +1,11 @@
 --TEST--
 SOAP Server 11: bind
+--SKIPIF--
+
 --EXTENSIONS--
 soap
 --GET--
diff --git a/ext/soap/tests/server012.phpt b/ext/soap/tests/server012.phpt
index 230108e2b9202..703aefbaa7874 100644
--- a/ext/soap/tests/server012.phpt
+++ b/ext/soap/tests/server012.phpt
@@ -1,5 +1,11 @@
 --TEST--
 SOAP Server 12: WSDL generation
+--SKIPIF--
+
 --EXTENSIONS--
 soap
 --GET--
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c
index 9e33f4e6cfdb7..48221479a7974 100644
--- a/ext/sockets/sockets.c
+++ b/ext/sockets/sockets.c
@@ -1248,6 +1248,11 @@ PHP_FUNCTION(socket_strerror)
 		Z_PARAM_LONG(arg1)
 	ZEND_PARSE_PARAMETERS_END();
 
+	if (ZEND_LONG_EXCEEDS_INT(arg1)) {
+		zend_argument_value_error(1, "must be between %d and %d", INT_MIN, INT_MAX);
+		RETURN_THROWS();
+	}
+
 	RETURN_STRING(sockets_strerror(arg1));
 }
 /* }}} */
@@ -1447,7 +1452,8 @@ PHP_FUNCTION(socket_recvfrom)
 
 	/* overflow check */
 	/* Shouldthrow ? */
-	if ((arg3 + 2) < 3) {
+
+	if (arg3 <= 0 || arg3 > ZEND_LONG_MAX - 1) {
 		RETURN_FALSE;
 	}
 
diff --git a/ext/sockets/tests/gh16267.phpt b/ext/sockets/tests/gh16267.phpt
new file mode 100644
index 0000000000000..d2462b3164530
--- /dev/null
+++ b/ext/sockets/tests/gh16267.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GH-16267 - overflow on socket_strerror argument
+--EXTENSIONS--
+sockets
+--SKIPIF--
+
+--FILE--
+getMessage() . PHP_EOL;
+}
+try {
+	socket_strerror(PHP_INT_MAX);
+} catch (\ValueError $e) {
+	echo $e->getMessage() . PHP_EOL;
+}
+?>
+--EXPECTF--
+socket_strerror(): Argument #1 ($error_code) must be between %s and %s
+socket_strerror(): Argument #1 ($error_code) must be between %s and %s
diff --git a/ext/sockets/tests/socket_recv_overflow.phpt b/ext/sockets/tests/socket_recv_overflow.phpt
new file mode 100644
index 0000000000000..9b3f7a0bbb538
--- /dev/null
+++ b/ext/sockets/tests/socket_recv_overflow.phpt
@@ -0,0 +1,19 @@
+--TEST--
+socket_recvfrom overflow on length argument
+--EXTENSIONS--
+sockets
+--SKIPIF--
+
+--EXPECT--
+bool(false)
+bool(false)
diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c
index 3b238569b82be..ffe8178afa77d 100644
--- a/ext/spl/spl_array.c
+++ b/ext/spl/spl_array.c
@@ -964,12 +964,18 @@ static void spl_array_set_array(zval *object, spl_array_object *intern, zval *ar
 			}
 		} else {
 			zend_object_get_properties_t handler = Z_OBJ_HANDLER_P(array, get_properties);
-			if (handler != zend_std_get_properties) {
+			if (handler != zend_std_get_properties || Z_OBJ_HANDLER_P(array, get_properties_for)) {
 				zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0,
 					"Overloaded object of type %s is not compatible with %s",
 					ZSTR_VAL(Z_OBJCE_P(array)->name), ZSTR_VAL(intern->std.ce->name));
 				return;
 			}
+			if (UNEXPECTED(Z_OBJCE_P(array)->ce_flags & ZEND_ACC_ENUM)) {
+				zend_throw_exception_ex(spl_ce_InvalidArgumentException, 0,
+					"Enums are not compatible with %s",
+					ZSTR_VAL(intern->std.ce->name));
+				return;
+			}
 			zval_ptr_dtor(&intern->array);
 			ZVAL_COPY(&intern->array, array);
 		}
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 1f75c4e3ae8f8..10134c21e1e90 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -187,7 +187,11 @@ static zend_object *spl_filesystem_object_new(zend_class_entry *class_type)
 {
 	spl_filesystem_object *intern;
 
-	intern = ecalloc(1, sizeof(spl_filesystem_object) + zend_object_properties_size(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)));
 	/* intern->type = SPL_FS_INFO; done by set 0 */
 	intern->file_class = spl_ce_SplFileObject;
 	intern->info_class = spl_ce_SplFileInfo;
@@ -365,6 +369,7 @@ static zend_result spl_filesystem_file_open(spl_filesystem_object *intern, bool
 	intern->u.file.delimiter = ',';
 	intern->u.file.enclosure = '"';
 	intern->u.file.escape = (unsigned char) '\\';
+	intern->u.file.is_escape_default = true;
 
 	intern->u.file.func_getCurr = zend_hash_str_find_ptr(&intern->std.ce->function_table, "getcurrentline", sizeof("getcurrentline") - 1);
 
@@ -2273,16 +2278,33 @@ PHP_METHOD(SplFileObject, getChildren)
 	/* return NULL */
 } /* }}} */
 
+static int spl_csv_enclosure_param_handling(const zend_string* escape_str, const spl_filesystem_object *intern, uint32_t arg_num)
+{
+	if (escape_str == NULL) {
+		if (intern->u.file.is_escape_default) {
+			php_error_docref(NULL, E_DEPRECATED, "the $escape parameter must be provided,"
+				" as its default value will change,"
+				" either explicitly or via SplFileObject::setCsvControl()");
+			if (UNEXPECTED(EG(exception))) {
+				return PHP_CSV_ESCAPE_ERROR;
+			}
+		}
+		return intern->u.file.escape;
+	} else {
+		return php_csv_handle_escape_argument(escape_str, arg_num);
+	}
+}
+
 /* {{{ Return current line as CSV */
 PHP_METHOD(SplFileObject, fgetcsv)
 {
 	spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS));
 	char delimiter = intern->u.file.delimiter, enclosure = intern->u.file.enclosure;
-	int escape = intern->u.file.escape;
-	char *delim = NULL, *enclo = NULL, *esc = NULL;
-	size_t d_len = 0, e_len = 0, esc_len = 0;
+	char *delim = NULL, *enclo = NULL;
+	size_t d_len = 0, e_len = 0;
+	zend_string *escape_str = NULL;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ssS", &delim, &d_len, &enclo, &e_len, &escape_str) == FAILURE) {
 		RETURN_THROWS();
 	}
 
@@ -2302,23 +2324,12 @@ PHP_METHOD(SplFileObject, fgetcsv)
 		}
 		enclosure = enclo[0];
 	}
-	if (esc) {
-		if (esc_len > 1) {
-			zend_argument_value_error(3, "must be empty or a single character");
-			RETURN_THROWS();
-		}
-		if (esc_len == 0) {
-			escape = PHP_CSV_NO_ESCAPE;
-		} else {
-			php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4");
-			if (UNEXPECTED(EG(exception))) {
-				RETURN_THROWS();
-			}
-			escape = (unsigned char) esc[0];
-		}
+	int escape_char = spl_csv_enclosure_param_handling(escape_str, intern, 3);
+	if (escape_char == PHP_CSV_ESCAPE_ERROR) {
+		RETURN_THROWS();
 	}
 
-	if (spl_filesystem_file_read_csv(intern, delimiter, enclosure, escape, return_value, true) == FAILURE) {
+	if (spl_filesystem_file_read_csv(intern, delimiter, enclosure, escape_char, return_value, true) == FAILURE) {
 		RETURN_FALSE;
 	}
 }
@@ -2329,14 +2340,14 @@ PHP_METHOD(SplFileObject, fputcsv)
 {
 	spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS));
 	char delimiter = intern->u.file.delimiter, enclosure = intern->u.file.enclosure;
-	int escape = intern->u.file.escape;
-	char *delim = NULL, *enclo = NULL, *esc = NULL;
-	size_t d_len = 0, e_len = 0, esc_len = 0;
+	char *delim = NULL, *enclo = NULL;
+	size_t d_len = 0, e_len = 0;
 	zend_long ret;
 	zval *fields = NULL;
+	zend_string *escape_str = NULL;
 	zend_string *eol = NULL;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|sssS", &fields, &delim, &d_len, &enclo, &e_len, &esc, &esc_len, &eol) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|ssSS", &fields, &delim, &d_len, &enclo, &e_len, &escape_str, &eol) == FAILURE) {
 		RETURN_THROWS();
 	}
 
@@ -2354,23 +2365,12 @@ PHP_METHOD(SplFileObject, fputcsv)
 		}
 		enclosure = enclo[0];
 	}
-	if (esc) {
-		if (esc_len > 1) {
-			zend_argument_value_error(4, "must be empty or a single character");
-			RETURN_THROWS();
-		}
-		if (esc_len == 0) {
-			escape = PHP_CSV_NO_ESCAPE;
-		} else {
-			php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4");
-			if (UNEXPECTED(EG(exception))) {
-				RETURN_THROWS();
-			}
-			escape = (unsigned char) esc[0];
-		}
+	int escape_char = spl_csv_enclosure_param_handling(escape_str, intern, 4);
+	if (escape_char == PHP_CSV_ESCAPE_ERROR) {
+		RETURN_THROWS();
 	}
 
-	ret = php_fputcsv(intern->u.file.stream, fields, delimiter, enclosure, escape, eol);
+	ret = php_fputcsv(intern->u.file.stream, fields, delimiter, enclosure, escape_char, eol);
 	if (ret < 0) {
 		RETURN_FALSE;
 	}
@@ -2383,11 +2383,11 @@ PHP_METHOD(SplFileObject, setCsvControl)
 {
 	spl_filesystem_object *intern = spl_filesystem_from_obj(Z_OBJ_P(ZEND_THIS));
 	char delimiter = ',', enclosure = '"';
-	int escape = (unsigned char) '\\';
-	char *delim = NULL, *enclo = NULL, *esc = NULL;
-	size_t d_len = 0, e_len = 0, esc_len = 0;
+	char *delim = NULL, *enclo = NULL;
+	size_t d_len = 0, e_len = 0;
+	zend_string *escape_str = NULL;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sss", &delim, &d_len, &enclo, &e_len, &esc, &esc_len) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "|ssS", &delim, &d_len, &enclo, &e_len, &escape_str) == FAILURE) {
 		RETURN_THROWS();
 	}
 
@@ -2405,25 +2405,17 @@ PHP_METHOD(SplFileObject, setCsvControl)
 		}
 		enclosure = enclo[0];
 	}
-	if (esc) {
-		if (esc_len > 1) {
-			zend_argument_value_error(3, "must be empty or a single character");
-			RETURN_THROWS();
-		}
-		if (esc_len == 0) {
-			escape = PHP_CSV_NO_ESCAPE;
-		} else {
-			php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4");
-			if (UNEXPECTED(EG(exception))) {
-				RETURN_THROWS();
-			}
-			escape = (unsigned char) esc[0];
-		}
+	int escape_char = php_csv_handle_escape_argument(escape_str, 3);
+	if (escape_char == PHP_CSV_ESCAPE_ERROR) {
+		RETURN_THROWS();
+	}
+	if (escape_str != NULL) {
+		intern->u.file.is_escape_default = false;
 	}
 
 	intern->u.file.delimiter = delimiter;
 	intern->u.file.enclosure = enclosure;
-	intern->u.file.escape    = escape;
+	intern->u.file.escape    = escape_char;
 }
 /* }}} */
 
diff --git a/ext/spl/spl_directory.h b/ext/spl/spl_directory.h
index 5f104c48c9885..549dfb1dc4d0f 100644
--- a/ext/spl/spl_directory.h
+++ b/ext/spl/spl_directory.h
@@ -82,6 +82,7 @@ struct _spl_filesystem_object {
 			char               delimiter;
 			char               enclosure;
 			int                escape;
+			bool               is_escape_default;
 		} file;
 	} u;
 	zend_object        std;
diff --git a/ext/spl/spl_directory.stub.php b/ext/spl/spl_directory.stub.php
index a9f49715e8f78..a53a50eb71f98 100644
--- a/ext/spl/spl_directory.stub.php
+++ b/ext/spl/spl_directory.stub.php
@@ -97,9 +97,6 @@ public function __toString(): string {}
     /** @tentative-return-type */
     public function __debugInfo(): array {}
 
-    /**
-     * @tentative-return-type
-     */
     #[\Deprecated(since: '8.2')]
     final public function _bad_state_ex(): void {}
 }
diff --git a/ext/spl/spl_directory_arginfo.h b/ext/spl/spl_directory_arginfo.h
index b8b3869b73939..9874b756f4a77 100644
--- a/ext/spl/spl_directory_arginfo.h
+++ b/ext/spl/spl_directory_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 3ed3a9f6609e1b8fa642f1e4cfaa1de40e3cc11e */
+ * Stub hash: c8c3c642d6f8c19a83f6a94ede5b6138a969bc12 */
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFileInfo___construct, 0, 0, 1)
 	ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -83,7 +83,7 @@ ZEND_END_ARG_INFO()
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SplFileInfo___debugInfo, 0, 0, IS_ARRAY, 0)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_SplFileInfo__bad_state_ex, 0, 0, IS_VOID, 0)
+ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_SplFileInfo__bad_state_ex, 0, 0, IS_VOID, 0)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_DirectoryIterator___construct, 0, 0, 1)
@@ -98,7 +98,8 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_DirectoryIterator_isDot arginfo_class_SplFileInfo_isWritable
 
-#define arginfo_class_DirectoryIterator_rewind arginfo_class_SplFileInfo__bad_state_ex
+ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_DirectoryIterator_rewind, 0, 0, IS_VOID, 0)
+ZEND_END_ARG_INFO()
 
 #define arginfo_class_DirectoryIterator_valid arginfo_class_SplFileInfo_isWritable
 
@@ -107,7 +108,7 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_DirectoryIterator_current arginfo_class_DirectoryIterator_key
 
-#define arginfo_class_DirectoryIterator_next arginfo_class_SplFileInfo__bad_state_ex
+#define arginfo_class_DirectoryIterator_next arginfo_class_DirectoryIterator_rewind
 
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_DirectoryIterator_seek, 0, 1, IS_VOID, 0)
 	ZEND_ARG_TYPE_INFO(0, offset, IS_LONG, 0)
@@ -120,7 +121,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FilesystemIterator___construct, 0, 0, 1)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "FilesystemIterator::KEY_AS_PATHNAME | FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::SKIP_DOTS")
 ZEND_END_ARG_INFO()
 
-#define arginfo_class_FilesystemIterator_rewind arginfo_class_SplFileInfo__bad_state_ex
+#define arginfo_class_FilesystemIterator_rewind arginfo_class_DirectoryIterator_rewind
 
 #define arginfo_class_FilesystemIterator_key arginfo_class_SplFileInfo_getPath
 
@@ -167,7 +168,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_SplFileObject___construct, 0, 0, 1)
 	ZEND_ARG_INFO_WITH_DEFAULT_VALUE(0, context, "null")
 ZEND_END_ARG_INFO()
 
-#define arginfo_class_SplFileObject_rewind arginfo_class_SplFileInfo__bad_state_ex
+#define arginfo_class_SplFileObject_rewind arginfo_class_DirectoryIterator_rewind
 
 #define arginfo_class_SplFileObject_eof arginfo_class_SplFileInfo_isWritable
 
@@ -240,7 +241,7 @@ ZEND_END_ARG_INFO()
 
 #define arginfo_class_SplFileObject_key arginfo_class_FilesystemIterator_getFlags
 
-#define arginfo_class_SplFileObject_next arginfo_class_SplFileInfo__bad_state_ex
+#define arginfo_class_SplFileObject_next arginfo_class_DirectoryIterator_rewind
 
 #define arginfo_class_SplFileObject_setFlags arginfo_class_FilesystemIterator_setFlags
 
@@ -487,7 +488,7 @@ static zend_class_entry *register_class_SplFileInfo(zend_class_entry *class_entr
 	zend_class_implements(class_entry, 1, class_entry_Stringable);
 
 
-	zend_attribute *attribute_Deprecated_func__bad_state_ex_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "_bad_state_ex", sizeof("_bad_state_ex") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func__bad_state_ex_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "_bad_state_ex", sizeof("_bad_state_ex") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func__bad_state_ex_0_arg0;
 	zend_string *attribute_Deprecated_func__bad_state_ex_0_arg0_str = zend_string_init("8.2", strlen("8.2"), 1);
 	ZVAL_STR(&attribute_Deprecated_func__bad_state_ex_0_arg0, attribute_Deprecated_func__bad_state_ex_0_arg0_str);
diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c
index 5c3fb0dd74879..74ae655b220dc 100644
--- a/ext/spl/spl_dllist.c
+++ b/ext/spl/spl_dllist.c
@@ -726,8 +726,10 @@ PHP_METHOD(SplDoublyLinkedList, offsetSet)
 		if (element != NULL) {
 			/* the element is replaced, delref the old one as in
 			 * SplDoublyLinkedList::pop() */
-			zval_ptr_dtor(&element->data);
+			zval garbage;
+			ZVAL_COPY_VALUE(&garbage, &element->data);
 			ZVAL_COPY(&element->data, value);
+			zval_ptr_dtor(&garbage);
 		} else {
 			zval_ptr_dtor(value);
 			zend_argument_error(spl_ce_OutOfRangeException, 1, "is an invalid offset");
diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c
index 96a09309f305e..5d7949308a303 100644
--- a/ext/spl/spl_fixedarray.c
+++ b/ext/spl/spl_fixedarray.c
@@ -459,8 +459,10 @@ static void spl_fixedarray_object_unset_dimension_helper(spl_fixedarray_object *
 		zend_throw_exception(spl_ce_OutOfBoundsException, "Index invalid or out of range", 0);
 		return;
 	} else {
-		zval_ptr_dtor(&(intern->array.elements[index]));
+		zval garbage;
+		ZVAL_COPY_VALUE(&garbage, &intern->array.elements[index]);
 		ZVAL_NULL(&intern->array.elements[index]);
+		zval_ptr_dtor(&garbage);
 	}
 }
 
diff --git a/ext/spl/spl_fixedarray_arginfo.h b/ext/spl/spl_fixedarray_arginfo.h
index e517833a02b89..5d83183d91b81 100644
--- a/ext/spl/spl_fixedarray_arginfo.h
+++ b/ext/spl/spl_fixedarray_arginfo.h
@@ -98,7 +98,7 @@ static zend_class_entry *register_class_SplFixedArray(zend_class_entry *class_en
 	zend_class_implements(class_entry, 4, class_entry_IteratorAggregate, class_entry_ArrayAccess, class_entry_Countable, class_entry_JsonSerializable);
 
 
-	zend_attribute *attribute_Deprecated_func___wakeup_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "__wakeup", sizeof("__wakeup") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func___wakeup_0 = zend_add_function_attribute(zend_hash_str_find_ptr(&class_entry->function_table, "__wakeup", sizeof("__wakeup") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func___wakeup_0_arg0;
 	zend_string *attribute_Deprecated_func___wakeup_0_arg0_str = zend_string_init("8.4", strlen("8.4"), 1);
 	ZVAL_STR(&attribute_Deprecated_func___wakeup_0_arg0, attribute_Deprecated_func___wakeup_0_arg0_str);
diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c
index 1fdc2c5bdf962..d4450da42009c 100644
--- a/ext/spl/spl_heap.c
+++ b/ext/spl/spl_heap.c
@@ -30,6 +30,7 @@
 #define PTR_HEAP_BLOCK_SIZE 64
 
 #define SPL_HEAP_CORRUPTED       0x00000001
+#define SPL_HEAP_WRITE_LOCKED    0x00000002
 
 static zend_object_handlers spl_handler_SplHeap;
 static zend_object_handlers spl_handler_SplPriorityQueue;
@@ -276,12 +277,16 @@ static void spl_ptr_heap_insert(spl_ptr_heap *heap, void *elem, void *cmp_userda
 		heap->max_size *= 2;
 	}
 
+	heap->flags |= SPL_HEAP_WRITE_LOCKED;
+
 	/* sifting up */
 	for (i = heap->count; i > 0 && heap->cmp(spl_heap_elem(heap, (i-1)/2), elem, cmp_userdata) < 0; i = (i-1)/2) {
 		spl_heap_elem_copy(heap, spl_heap_elem(heap, i), spl_heap_elem(heap, (i-1)/2));
 	}
 	heap->count++;
 
+	heap->flags &= ~SPL_HEAP_WRITE_LOCKED;
+
 	if (EG(exception)) {
 		/* exception thrown during comparison */
 		heap->flags |= SPL_HEAP_CORRUPTED;
@@ -309,6 +314,8 @@ static zend_result spl_ptr_heap_delete_top(spl_ptr_heap *heap, void *elem, void
 		return FAILURE;
 	}
 
+	heap->flags |= SPL_HEAP_WRITE_LOCKED;
+
 	if (elem) {
 		spl_heap_elem_copy(heap, elem, spl_heap_elem(heap, 0));
 	} else {
@@ -332,6 +339,8 @@ static zend_result spl_ptr_heap_delete_top(spl_ptr_heap *heap, void *elem, void
 		}
 	}
 
+	heap->flags &= ~SPL_HEAP_WRITE_LOCKED;
+
 	if (EG(exception)) {
 		/* exception thrown during comparison */
 		heap->flags |= SPL_HEAP_CORRUPTED;
@@ -377,10 +386,14 @@ static void spl_ptr_heap_destroy(spl_ptr_heap *heap) { /* {{{ */
 
 	int i;
 
+	heap->flags |= SPL_HEAP_WRITE_LOCKED;
+
 	for (i = 0; i < heap->count; ++i) {
 		heap->dtor(spl_heap_elem(heap, i));
 	}
 
+	heap->flags &= ~SPL_HEAP_WRITE_LOCKED;
+
 	efree(heap->elements);
 	efree(heap);
 }
@@ -589,6 +602,21 @@ PHP_METHOD(SplHeap, isEmpty)
 }
 /* }}} */
 
+static zend_result spl_heap_consistency_validations(const spl_heap_object *intern, bool write)
+{
+	if (intern->heap->flags & SPL_HEAP_CORRUPTED) {
+		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+		return FAILURE;
+	}
+
+	if (write && (intern->heap->flags & SPL_HEAP_WRITE_LOCKED)) {
+		zend_throw_exception(spl_ce_RuntimeException, "Heap cannot be changed when it is already being modified.", 0);
+		return FAILURE;
+	}
+
+	return SUCCESS;
+}
+
 /* {{{ Push $value on the heap */
 PHP_METHOD(SplHeap, insert)
 {
@@ -601,8 +629,7 @@ PHP_METHOD(SplHeap, insert)
 
 	intern = Z_SPLHEAP_P(ZEND_THIS);
 
-	if (intern->heap->flags & SPL_HEAP_CORRUPTED) {
-		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+	if (UNEXPECTED(spl_heap_consistency_validations(intern, true) != SUCCESS)) {
 		RETURN_THROWS();
 	}
 
@@ -624,8 +651,7 @@ PHP_METHOD(SplHeap, extract)
 
 	intern = Z_SPLHEAP_P(ZEND_THIS);
 
-	if (intern->heap->flags & SPL_HEAP_CORRUPTED) {
-		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+	if (UNEXPECTED(spl_heap_consistency_validations(intern, true) != SUCCESS)) {
 		RETURN_THROWS();
 	}
 
@@ -650,8 +676,7 @@ PHP_METHOD(SplPriorityQueue, insert)
 
 	intern = Z_SPLHEAP_P(ZEND_THIS);
 
-	if (intern->heap->flags & SPL_HEAP_CORRUPTED) {
-		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+	if (UNEXPECTED(spl_heap_consistency_validations(intern, true) != SUCCESS)) {
 		RETURN_THROWS();
 	}
 
@@ -691,8 +716,7 @@ PHP_METHOD(SplPriorityQueue, extract)
 
 	intern = Z_SPLHEAP_P(ZEND_THIS);
 
-	if (intern->heap->flags & SPL_HEAP_CORRUPTED) {
-		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+	if (UNEXPECTED(spl_heap_consistency_validations(intern, true) != SUCCESS)) {
 		RETURN_THROWS();
 	}
 
@@ -718,8 +742,7 @@ PHP_METHOD(SplPriorityQueue, top)
 
 	intern = Z_SPLHEAP_P(ZEND_THIS);
 
-	if (intern->heap->flags & SPL_HEAP_CORRUPTED) {
-		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+	if (UNEXPECTED(spl_heap_consistency_validations(intern, false) != SUCCESS)) {
 		RETURN_THROWS();
 	}
 
@@ -829,8 +852,7 @@ PHP_METHOD(SplHeap, top)
 
 	intern = Z_SPLHEAP_P(ZEND_THIS);
 
-	if (intern->heap->flags & SPL_HEAP_CORRUPTED) {
-		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+	if (UNEXPECTED(spl_heap_consistency_validations(intern, false) != SUCCESS)) {
 		RETURN_THROWS();
 	}
 
@@ -894,8 +916,7 @@ static zval *spl_heap_it_get_current_data(zend_object_iterator *iter) /* {{{ */
 {
 	spl_heap_object *object = Z_SPLHEAP_P(&iter->data);
 
-	if (object->heap->flags & SPL_HEAP_CORRUPTED) {
-		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+	if (UNEXPECTED(spl_heap_consistency_validations(object, false) != SUCCESS)) {
 		return NULL;
 	}
 
@@ -912,8 +933,7 @@ static zval *spl_pqueue_it_get_current_data(zend_object_iterator *iter) /* {{{ *
 	zend_user_iterator *user_it = (zend_user_iterator *) iter;
 	spl_heap_object *object = Z_SPLHEAP_P(&iter->data);
 
-	if (object->heap->flags & SPL_HEAP_CORRUPTED) {
-		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+	if (UNEXPECTED(spl_heap_consistency_validations(object, false) != SUCCESS)) {
 		return NULL;
 	}
 
@@ -941,8 +961,7 @@ static void spl_heap_it_move_forward(zend_object_iterator *iter) /* {{{ */
 {
 	spl_heap_object *object = Z_SPLHEAP_P(&iter->data);
 
-	if (object->heap->flags & SPL_HEAP_CORRUPTED) {
-		zend_throw_exception(spl_ce_RuntimeException, "Heap is corrupted, heap properties are no longer ensured.", 0);
+	if (UNEXPECTED(spl_heap_consistency_validations(object, false) != SUCCESS)) {
 		return;
 	}
 
diff --git a/ext/spl/spl_iterators.stub.php b/ext/spl/spl_iterators.stub.php
index 6803fec1e70a2..efa979924bf3c 100644
--- a/ext/spl/spl_iterators.stub.php
+++ b/ext/spl/spl_iterators.stub.php
@@ -422,9 +422,8 @@ class RecursiveTreeIterator extends RecursiveIteratorIterator
 
     public const int PREFIX_RIGHT = 5;
 
-    /** @param RecursiveIterator|IteratorAggregate $iterator */
     public function __construct(
-        $iterator,
+        RecursiveIterator|IteratorAggregate $iterator,
         int $flags = RecursiveTreeIterator::BYPASS_KEY,
         int $cachingIteratorFlags = CachingIterator::CATCH_GET_CHILD,
         int $mode = RecursiveTreeIterator::SELF_FIRST
diff --git a/ext/spl/spl_iterators_arginfo.h b/ext/spl/spl_iterators_arginfo.h
index d0b0d5ddbcc87..439236643471e 100644
--- a/ext/spl/spl_iterators_arginfo.h
+++ b/ext/spl/spl_iterators_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 68008c87b5dd1895761f51bff8f63df4b517a54b */
+ * Stub hash: ab66d2fff7ac7556d4244582a2bd3e83a3f95243 */
 
 ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_EmptyIterator_current, 0, 0, IS_NEVER, 0)
 ZEND_END_ARG_INFO()
@@ -286,7 +286,7 @@ ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_OBJ_INFO_EX(arginfo_class_RecursiveRegexIte
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RecursiveTreeIterator___construct, 0, 0, 1)
-	ZEND_ARG_INFO(0, iterator)
+	ZEND_ARG_OBJ_TYPE_MASK(0, iterator, RecursiveIterator|IteratorAggregate, 0, NULL)
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "RecursiveTreeIterator::BYPASS_KEY")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, cachingIteratorFlags, IS_LONG, 0, "CachingIterator::CATCH_GET_CHILD")
 	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, mode, IS_LONG, 0, "RecursiveTreeIterator::SELF_FIRST")
diff --git a/ext/spl/spl_observer.c b/ext/spl/spl_observer.c
index 5f5fbca70d4f3..aff414e786491 100644
--- a/ext/spl/spl_observer.c
+++ b/ext/spl/spl_observer.c
@@ -739,8 +739,10 @@ PHP_METHOD(SplObjectStorage, setInfo)
 	if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) == NULL) {
 		RETURN_NULL();
 	}
-	zval_ptr_dtor(&element->inf);
+	zval garbage;
+	ZVAL_COPY_VALUE(&garbage, &element->inf);
 	ZVAL_COPY(&element->inf, inf);
+	zval_ptr_dtor(&garbage);
 } /* }}} */
 
 /* {{{ Moves position forward */
diff --git a/ext/spl/tests/ArrayObject_enum.phpt b/ext/spl/tests/ArrayObject_enum.phpt
new file mode 100644
index 0000000000000..906c89b54dff1
--- /dev/null
+++ b/ext/spl/tests/ArrayObject_enum.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Enums are not compatible with ArrayObject
+--FILE--
+
+--EXPECTF--
+Fatal error: Uncaught InvalidArgumentException: Enums are not compatible with ArrayObject in %s:%d
+%a
diff --git a/ext/spl/tests/ArrayObject_overloaded_SplFixedArray.phpt b/ext/spl/tests/ArrayObject_overloaded_SplFixedArray.phpt
index 7abbd266e3371..f46e4cc1c9aa4 100644
--- a/ext/spl/tests/ArrayObject_overloaded_SplFixedArray.phpt
+++ b/ext/spl/tests/ArrayObject_overloaded_SplFixedArray.phpt
@@ -1,28 +1,16 @@
 --TEST--
-SplFixedArray properties is compatible with ArrayObject
+SplFixedArray properties is incompatible with ArrayObject
 --FILE--
 exchangeArray($fixedArray);
-$ao[0] = new stdClass();
-var_dump($ao);
+try {
+  // See GH-15918: this *should* fail to not break invariants
+  $ao->exchangeArray($fixedArray);
+} catch (InvalidArgumentException $e) {
+  echo $e->getMessage(), "\n";
+}
 ?>
 --EXPECT--
-object(ArrayObject)#1 (1) {
-  ["storage":"ArrayObject":private]=>
-  object(SplFixedArray)#2 (2) {
-    [0]=>
-    object(SplDoublyLinkedList)#3 (2) {
-      ["flags":"SplDoublyLinkedList":private]=>
-      int(0)
-      ["dllist":"SplDoublyLinkedList":private]=>
-      array(0) {
-      }
-    }
-    ["0"]=>
-    object(stdClass)#4 (0) {
-    }
-  }
-}
+Overloaded object of type SplFixedArray is not compatible with ArrayObject
diff --git a/ext/spl/tests/RecursiveIteratorIterator_dtor_order.phpt b/ext/spl/tests/RecursiveIteratorIterator_dtor_order.phpt
index c23d3073f9f23..9bc74dc644be1 100644
--- a/ext/spl/tests/RecursiveIteratorIterator_dtor_order.phpt
+++ b/ext/spl/tests/RecursiveIteratorIterator_dtor_order.phpt
@@ -11,4 +11,4 @@ foreach ($it as $v) {
 }
 ?>
 --EXPECTF--
-Fatal error: Cannot use 'self' as class name as it is reserved in %s on line %d
+Fatal error: Cannot use "self" as a class name as it is reserved in %s on line %d
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt
index 2580021426fd3..dd42be924cdd5 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_basic.phpt
@@ -3,15 +3,20 @@ SplFileObject::fgetcsv default path
 --FILE--
 setCsvControl(escape: '');
 var_dump($fo->fgetcsv());
 ?>
 --CLEAN--
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_basic.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_basic.phpt
index 6bf5b43f6bd9a..13bbfd9064abb 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_basic.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_basic.phpt
@@ -1,17 +1,23 @@
 --TEST--
-SplFileObject::fgetcsv with alternative delimiter
+SplFileObject::fgetcsv with alternative separator
 --FILE--
 setCsvControl(escape: '');
 var_dump($fo->fgetcsv('|'));
 ?>
 --CLEAN--
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_error.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_error.phpt
index b14e7ca479f50..7bfd61bbc188d 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_error.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_delimiter_error.phpt
@@ -1,17 +1,22 @@
 --TEST--
-SplFileObject::fgetcsv with alternative delimiter
+SplFileObject::fgetcsv() delimiter error
 --FILE--
 setCsvControl(escape: '');
 try {
     var_dump($fo->fgetcsv('invalid'));
 } catch (ValueError $e) {
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_enclosure_basic.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_enclosure_basic.phpt
index 971e44ba4d321..d200d440f7769 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_enclosure_basic.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_enclosure_basic.phpt
@@ -1,18 +1,24 @@
 --TEST--
-SplFileObject::fgetcsv with alternative delimiter
+SplFileObject::fgetcsv with alternative enclosure
 --FILE--
 fgetcsv(',', '"'));
+$fo->setCsvControl(escape: '');
+var_dump($fo->fgetcsv(enclosure: '"'));
 ?>
 --CLEAN--
 setCsvControl(escape: '');
 try {
-    var_dump($fo->fgetcsv(',', 'invalid'));
+    var_dump($fo->fgetcsv(enclosure: 'invalid'));
 } catch (ValueError $e) {
     echo $e->getMessage(), "\n";
 }
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_basic.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_basic.phpt
index df66463db7896..4a8bccaf671a1 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_basic.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_basic.phpt
@@ -1,5 +1,5 @@
 --TEST--
-SplFileObject::fgetcsv with alternative delimiter
+SplFileObject::fgetcsv with alternative escape
 --FILE--
 fgetcsv(',', '"', '"'));
 unlink('SplFileObject__fgetcsv6.csv');
 ?>
 --EXPECTF--
-Deprecated: SplFileObject::fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
 array(3) {
   [0]=>
   string(3) "aaa"
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_default.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_default.phpt
index 9614f91d4149d..b6a878f3cf356 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_default.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_default.phpt
@@ -13,7 +13,8 @@ var_dump($fo->fgetcsv());
 
---EXPECT--
+--EXPECTF--
+Deprecated: SplFileObject::fgetcsv(): the $escape parameter must be provided, as its default value will change, either explicitly or via SplFileObject::setCsvControl() in %s on line %d
 array(3) {
   [0]=>
   string(4) "aa\""
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_error.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_error.phpt
index a1471c8e0e7d7..eb6fc49161119 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_error.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fgetcsv_escape_error.phpt
@@ -1,5 +1,5 @@
 --TEST--
-SplFileObject::fgetcsv with alternative delimiter
+SplFileObject::fgetcsv() escape error
 --FILE--
 setCsvControl(escape: '\\');
 
 $list = array (
   0 => 'aaa,bbb',
@@ -42,7 +44,7 @@ echo '$list = ';var_export($res);echo ";\n";
 
 $fp = fopen($file, "r");
 $res = array();
-while($l=fgetcsv($fp))
+while($l=fgetcsv($fp, escape: '\\'))
 {
     $res[] = join(',',$l);
 }
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_002.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_002.phpt
index 77f6d76bbf5cc..41b1db637f249 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_002.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_002.phpt
@@ -3,6 +3,7 @@ SplFileObject::fputcsv(): Checking data after calling the function
 --FILE--
 setCsvControl(escape: '');
 
 $data = array(1, 2, 'foo', 'haha', array(4, 5, 6), 1.3, null);
 
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation1.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation1.phpt
index 47f8c609be537..2b9e649678bdb 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation1.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation1.phpt
@@ -42,6 +42,7 @@ foreach ($csv_lists as $csv_list) {
     } else {
       $fo = new SplFileObject($file, $file_modes[$mode_counter]);
     }
+    $fo->setCsvControl(escape: '');
     $delimiter = $csv_list[0];
     $enclosure = $csv_list[1];
     $csv_field = $csv_list[2];
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation10.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation10.phpt
index 49f77d4158883..6c6f5109df041 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation10.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation10.phpt
@@ -36,6 +36,8 @@ foreach ($fields as $field) {
     } else {
       $fo = new SplFileObject($file, $file_modes[$mode_counter]);
     }
+    $fo->setCsvControl(escape: '\\');
+
     $csv_field = $field;
 
     // write to a file in csv format
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation11.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation11.phpt
index 77d041689c9c7..b59dfafcfcb72 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation11.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation11.phpt
@@ -42,6 +42,8 @@ foreach ($csv_lists as $csv_list) {
     } else {
       $fo = new SplFileObject($file, $file_modes[$mode_counter]);
     }
+    $fo->setCsvControl(escape: '\\');
+
     $delimiter = $csv_list[0];
     $enclosure = $csv_list[1];
     $csv_field = $csv_list[2];
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation12.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation12.phpt
index 947d89b763b90..04fd4c30b2767 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation12.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation12.phpt
@@ -43,6 +43,8 @@ foreach ($csv_lists as $csv_list) {
     } else {
       $fo = new SplFileObject($file, $file_modes[$mode_counter]);
     }
+    $fo->setCsvControl(escape: '\\');
+
     $delimiter = $csv_list[0];
     $enclosure = $csv_list[1];
     $csv_field = $csv_list[2];
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation5.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation5.phpt
index 898d89681e5da..468b66b44c238 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation5.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation5.phpt
@@ -42,6 +42,8 @@ foreach ($csv_lists as $csv_list) {
     } else {
       $fo = new SplFileObject($file, $file_modes[$mode_counter]);
     }
+    $fo->setCsvControl(escape: '\\');
+
     $delimiter = $csv_list[0];
     $enclosure = $csv_list[1];
     $csv_field = $csv_list[2];
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation6.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation6.phpt
index 33bae5e48d22a..8a4fb8ed9c5df 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation6.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation6.phpt
@@ -45,6 +45,8 @@ foreach ($csv_lists as $csv_list) {
     } else {
       $fo = new SplFileObject($file, $file_modes[$mode_counter]);
     }
+    $fo->setCsvControl(escape: '\\');
+
     $delimiter = $csv_list[0];
     $enclosure = $csv_list[1];
     $csv_field = $csv_list[2];
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation7.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation7.phpt
index bae8962567d28..46642a4f52d76 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation7.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation7.phpt
@@ -45,6 +45,8 @@ foreach ($csv_lists as $csv_list) {
     } else {
       $fo = new SplFileObject($file, $file_modes[$mode_counter]);
     }
+    $fo->setCsvControl(escape: '\\');
+
     $delimiter = $csv_list[0];
     $enclosure = $csv_list[1];
     $csv_field = $csv_list[2];
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation8.phpt b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation8.phpt
index 2306c92ce3f9c..608a61bf3d57c 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation8.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_fputcsv_variation8.phpt
@@ -45,6 +45,8 @@ foreach ($csv_lists as $csv_list) {
     } else {
       $fo = new SplFileObject($file, $file_modes[$mode_counter]);
     }
+    $fo->setCsvControl(escape: '\\');
+
     $delimiter = $csv_list[0];
     $enclosure = $csv_list[1];
     $csv_field = $csv_list[2];
diff --git a/ext/spl/tests/SplFileObject/SplFileObject_setCsvControl_variation001.phpt b/ext/spl/tests/SplFileObject/SplFileObject_setCsvControl_variation001.phpt
index f54f8eeabd35a..8c8e52e9743c9 100644
--- a/ext/spl/tests/SplFileObject/SplFileObject_setCsvControl_variation001.phpt
+++ b/ext/spl/tests/SplFileObject/SplFileObject_setCsvControl_variation001.phpt
@@ -23,7 +23,8 @@ foreach ($s as $row) {
 
---EXPECT--
+--EXPECTF--
+Deprecated: SplFileObject::setCsvControl(): the $escape parameter must be provided as its default value will change in %s on line %d
 groene appelen : 10
 gele bananen : 20
 rode kersen : 30
diff --git a/ext/spl/tests/SplFileObject/bug46569.phpt b/ext/spl/tests/SplFileObject/bug46569.phpt
index 0c1ab6ce1427e..be5d20ce99e3d 100644
--- a/ext/spl/tests/SplFileObject/bug46569.phpt
+++ b/ext/spl/tests/SplFileObject/bug46569.phpt
@@ -3,6 +3,7 @@ Bug #46569 (SplFileObject: fgetcsv after seek returns wrong line)
 --FILE--
 setCsvControl(escape: "");
 $file->seek(1);
 print_r($file->fgetcsv());
 ?>
diff --git a/ext/spl/tests/SplFileObject/bug75917.phpt b/ext/spl/tests/SplFileObject/bug75917.phpt
index c9bc02869c2d1..27ce3f792c598 100644
--- a/ext/spl/tests/SplFileObject/bug75917.phpt
+++ b/ext/spl/tests/SplFileObject/bug75917.phpt
@@ -8,6 +8,7 @@ $expected = [
 ];
 
 $tmp = new SplTempFileObject();
+$tmp->setCsvControl(escape: "");
 foreach ($expected as $row) {
     $tmp->fputcsv($row);
 }
diff --git a/ext/spl/tests/SplFileObject/bug77024.phpt b/ext/spl/tests/SplFileObject/bug77024.phpt
index d61dc941d4a65..a82713fb3a83d 100644
--- a/ext/spl/tests/SplFileObject/bug77024.phpt
+++ b/ext/spl/tests/SplFileObject/bug77024.phpt
@@ -4,6 +4,7 @@ Bug #77024 SplFileObject::__toString() may return array
 setCsvControl(escape: "");
 $file->fputcsv(['foo', 'bar', 'baz']);
 $file->rewind();
 $file->setFlags(SplFileObject::READ_CSV);
diff --git a/ext/spl/tests/SplFileObject/bug78976.phpt b/ext/spl/tests/SplFileObject/bug78976.phpt
index 059807eb74796..23123a34eb3b0 100644
--- a/ext/spl/tests/SplFileObject/bug78976.phpt
+++ b/ext/spl/tests/SplFileObject/bug78976.phpt
@@ -3,6 +3,7 @@ Bug #78976 (SplFileObject::fputcsv returns -1 on failure)
 --FILE--
 setCsvControl(escape: "");
 var_dump($file->fputcsv(['foo', 'bar']));
 ?>
 --EXPECT--
diff --git a/ext/spl/tests/SplFileObject/fgetcsv_blank_file.phpt b/ext/spl/tests/SplFileObject/fgetcsv_blank_file.phpt
index f34dafce48732..a2dadecae4139 100644
--- a/ext/spl/tests/SplFileObject/fgetcsv_blank_file.phpt
+++ b/ext/spl/tests/SplFileObject/fgetcsv_blank_file.phpt
@@ -3,9 +3,8 @@ SplFileObject: fgetcsv() on a blank line
 --FILE--
 setCsvControl(escape: "");
 
 // write to file
 $file->fwrite("");
@@ -18,11 +17,6 @@ $file->setFlags(SplFileObject::SKIP_EMPTY);
 $file->rewind();
 var_dump($file->fgetcsv());
 ?>
---CLEAN--
-
 --EXPECT--
 array(1) {
   [0]=>
diff --git a/ext/spl/tests/bug69181.phpt b/ext/spl/tests/bug69181.phpt
index 729a5bd600b7a..085fccd326524 100644
--- a/ext/spl/tests/bug69181.phpt
+++ b/ext/spl/tests/bug69181.phpt
@@ -12,6 +12,7 @@ CSV;
 file_put_contents($filename, $csv);
 
 $file = new SplFileObject($filename);
+$file->setCsvControl(escape: "");
 $file->setFlags(SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE | SplFileObject::READ_CSV);
 var_dump(iterator_to_array($file));
 
diff --git a/ext/spl/tests/gh15918.phpt b/ext/spl/tests/gh15918.phpt
new file mode 100644
index 0000000000000..b26ff8adfc140
--- /dev/null
+++ b/ext/spl/tests/gh15918.phpt
@@ -0,0 +1,13 @@
+--TEST--
+GH-15918 (Assertion failure in ext/spl/spl_fixedarray.c)
+--FILE--
+getMessage(), "\n";
+}
+?>
+--EXPECT--
+Overloaded object of type SplFixedArray is not compatible with ArrayObject
diff --git a/ext/spl/tests/gh16054.phpt b/ext/spl/tests/gh16054.phpt
new file mode 100644
index 0000000000000..cef6e547afbf0
--- /dev/null
+++ b/ext/spl/tests/gh16054.phpt
@@ -0,0 +1,15 @@
+--TEST--
+GH-16054 (Segmentation fault when resizing hash table iterator list while adding)
+--FILE--
+ $v) {
+    if (++$counter > 200) break;
+}
+echo "ok\n";
+?>
+--EXPECT--
+ok
diff --git a/ext/spl/tests/gh16337.phpt b/ext/spl/tests/gh16337.phpt
new file mode 100644
index 0000000000000..94cf9d90cb1a9
--- /dev/null
+++ b/ext/spl/tests/gh16337.phpt
@@ -0,0 +1,49 @@
+--TEST--
+GH-16337 (Use-after-free in SplHeap)
+--FILE--
+extract();
+        } catch (Throwable $e) {
+            echo $e->getMessage(), "\n";
+        }
+        try {
+            $heap->insert(1);
+        } catch (Throwable $e) {
+            echo $e->getMessage(), "\n";
+        }
+        echo $heap->top(), "\n";
+        return "0";
+    }
+}
+
+$heap = new SplMinHeap;
+for ($i = 0; $i < 100; $i++) {
+    $heap->insert((string) $i);
+}
+$heap->insert(new C);
+
+?>
+--EXPECT--
+Heap cannot be changed when it is already being modified.
+Heap cannot be changed when it is already being modified.
+0
+Heap cannot be changed when it is already being modified.
+Heap cannot be changed when it is already being modified.
+0
+Heap cannot be changed when it is already being modified.
+Heap cannot be changed when it is already being modified.
+0
+Heap cannot be changed when it is already being modified.
+Heap cannot be changed when it is already being modified.
+0
+Heap cannot be changed when it is already being modified.
+Heap cannot be changed when it is already being modified.
+0
+Heap cannot be changed when it is already being modified.
+Heap cannot be changed when it is already being modified.
+0
diff --git a/ext/spl/tests/gh16464.phpt b/ext/spl/tests/gh16464.phpt
new file mode 100644
index 0000000000000..7b3b1e80e6fca
--- /dev/null
+++ b/ext/spl/tests/gh16464.phpt
@@ -0,0 +1,29 @@
+--TEST--
+GH-16464: Use-after-free in SplDoublyLinkedList::offsetSet() when modifying list in destructor of overwritten object
+--FILE--
+pop());
+    }
+}
+
+$list = new SplDoublyLinkedList;
+$list->add(0, new C);
+$list[0] = 42;
+var_dump($list);
+
+?>
+--EXPECTF--
+int(42)
+object(SplDoublyLinkedList)#%d (2) {
+  ["flags":"SplDoublyLinkedList":private]=>
+  int(0)
+  ["dllist":"SplDoublyLinkedList":private]=>
+  array(0) {
+  }
+}
diff --git a/ext/spl/tests/gh16478.phpt b/ext/spl/tests/gh16478.phpt
new file mode 100644
index 0000000000000..5a708b36fe80a
--- /dev/null
+++ b/ext/spl/tests/gh16478.phpt
@@ -0,0 +1,21 @@
+--TEST--
+GH-16478: Use-after-free in SplFixedArray::unset()
+--FILE--
+setSize(0);
+    }
+}
+
+$arr = new SplFixedArray(2);
+$arr[0] = new C;
+unset($arr[0]);
+var_dump($arr);
+
+?>
+--EXPECT--
+object(SplFixedArray)#1 (0) {
+}
diff --git a/ext/spl/tests/gh16479.phpt b/ext/spl/tests/gh16479.phpt
new file mode 100644
index 0000000000000..5309a450b9d45
--- /dev/null
+++ b/ext/spl/tests/gh16479.phpt
@@ -0,0 +1,25 @@
+--TEST--
+GH-16479: Use-after-free in SplObjectStorage::setInfo()
+--FILE--
+removeAll($store);
+    }
+}
+
+$o = new stdClass;
+$store = new SplObjectStorage;
+$store[$o] = new C;
+$store->setInfo(1);
+var_dump($store);
+
+?>
+--EXPECT--
+object(SplObjectStorage)#2 (1) {
+  ["storage":"SplObjectStorage":private]=>
+  array(0) {
+  }
+}
diff --git a/ext/standard/array.c b/ext/standard/array.c
index a2fef8b145283..8f6418b032731 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -4037,7 +4037,6 @@ PHPAPI int php_array_merge_recursive(HashTable *dest, HashTable *src) /* {{{ */
 				}
 
 				ZEND_ASSERT(!Z_ISREF_P(dest_entry) || Z_REFCOUNT_P(dest_entry) > 1);
-				SEPARATE_ZVAL(dest_entry);
 				dest_zval = dest_entry;
 
 				if (Z_TYPE_P(dest_zval) == IS_NULL) {
@@ -4046,6 +4045,8 @@ PHPAPI int php_array_merge_recursive(HashTable *dest, HashTable *src) /* {{{ */
 				} else {
 					convert_to_array(dest_zval);
 				}
+				SEPARATE_ZVAL(dest_zval);
+
 				ZVAL_UNDEF(&tmp);
 				if (Z_TYPE_P(src_zval) == IS_OBJECT) {
 					ZVAL_COPY(&tmp, src_zval);
@@ -6628,7 +6629,7 @@ static zend_result php_array_find(const HashTable *array, zend_fcall_info fci, z
 
 			if (retval_true) {
 				if (result_value != NULL) {
-					ZVAL_COPY(result_value, &args[0]);
+					ZVAL_COPY_DEREF(result_value, &args[0]);
 				}
 
 				if (result_key != NULL) {
diff --git a/ext/standard/assert.c b/ext/standard/assert.c
index 9b823bf864ab1..f0b6adadbe17d 100644
--- a/ext/standard/assert.c
+++ b/ext/standard/assert.c
@@ -238,6 +238,11 @@ PHP_FUNCTION(assert)
 	}
 
 	if (ASSERTG(bail)) {
+		if (EG(exception)) {
+			/* The callback might have thrown. Use E_WARNING to print the
+			 * exception so we can avoid bailout and use unwind_exit. */
+			zend_exception_error(EG(exception), E_WARNING);
+		}
 		zend_throw_unwind_exit();
 		RETURN_THROWS();
 	} else {
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 67276adb1627e..dbbf9896f2b73 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -117,6 +117,10 @@ PHPAPI php_basic_globals basic_globals;
 #include "zend_frameless_function.h"
 #include "basic_functions_arginfo.h"
 
+#if __has_feature(memory_sanitizer)
+# include 
+#endif
+
 typedef struct _user_tick_function_entry {
 	zend_fcall_info fci;
 	zend_fcall_info_cache fci_cache;
@@ -2233,6 +2237,10 @@ PHP_FUNCTION(getservbyport)
 		RETURN_FALSE;
 	}
 
+	/* MSAN false positive, getservbyport() is not properly intercepted. */
+#if __has_feature(memory_sanitizer)
+	__msan_unpoison_string(serv->s_name);
+#endif
 	RETURN_STRING(serv->s_name);
 }
 /* }}} */
diff --git a/ext/standard/basic_functions_arginfo.h b/ext/standard/basic_functions_arginfo.h
index d6445a04d21e9..e429281125053 100644
--- a/ext/standard/basic_functions_arginfo.h
+++ b/ext/standard/basic_functions_arginfo.h
@@ -3992,7 +3992,7 @@ static void register_basic_functions_symbols(int module_number)
 	zend_add_parameter_attribute(zend_hash_str_find_ptr(CG(function_table), "crypt", sizeof("crypt") - 1), 0, ZSTR_KNOWN(ZEND_STR_SENSITIVEPARAMETER), 0);
 #if defined(HAVE_STRPTIME)
 
-	zend_attribute *attribute_Deprecated_func_strptime_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "strptime", sizeof("strptime") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_strptime_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "strptime", sizeof("strptime") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_strptime_0_arg0;
 	zend_string *attribute_Deprecated_func_strptime_0_arg0_str = zend_string_init("8.2", strlen("8.2"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_strptime_0_arg0, attribute_Deprecated_func_strptime_0_arg0_str);
@@ -4005,14 +4005,14 @@ static void register_basic_functions_symbols(int module_number)
 	attribute_Deprecated_func_strptime_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 #endif
 
-	zend_attribute *attribute_Deprecated_func_assert_options_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "assert_options", sizeof("assert_options") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_assert_options_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "assert_options", sizeof("assert_options") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_assert_options_0_arg0;
 	zend_string *attribute_Deprecated_func_assert_options_0_arg0_str = zend_string_init("8.3", strlen("8.3"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_assert_options_0_arg0, attribute_Deprecated_func_assert_options_0_arg0_str);
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_assert_options_0->args[0].value, &attribute_Deprecated_func_assert_options_0_arg0);
 	attribute_Deprecated_func_assert_options_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
 
-	zend_attribute *attribute_Deprecated_func_utf8_encode_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "utf8_encode", sizeof("utf8_encode") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_utf8_encode_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "utf8_encode", sizeof("utf8_encode") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_utf8_encode_0_arg0;
 	zend_string *attribute_Deprecated_func_utf8_encode_0_arg0_str = zend_string_init("8.2", strlen("8.2"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_utf8_encode_0_arg0, attribute_Deprecated_func_utf8_encode_0_arg0_str);
@@ -4024,7 +4024,7 @@ static void register_basic_functions_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_utf8_encode_0->args[1].value, &attribute_Deprecated_func_utf8_encode_0_arg1);
 	attribute_Deprecated_func_utf8_encode_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_utf8_decode_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "utf8_decode", sizeof("utf8_decode") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_utf8_decode_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "utf8_decode", sizeof("utf8_decode") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_utf8_decode_0_arg0;
 	zend_string *attribute_Deprecated_func_utf8_decode_0_arg0_str = zend_string_init("8.2", strlen("8.2"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_utf8_decode_0_arg0, attribute_Deprecated_func_utf8_decode_0_arg0_str);
diff --git a/ext/standard/browscap.c b/ext/standard/browscap.c
index c9591e270a3f4..e8fe9d4da3d73 100644
--- a/ext/standard/browscap.c
+++ b/ext/standard/browscap.c
@@ -88,7 +88,7 @@ static inline bool is_placeholder(char c) {
 }
 
 /* Length of prefix not containing any wildcards */
-static uint8_t browscap_compute_prefix_len(zend_string *pattern) {
+static uint8_t browscap_compute_prefix_len(const zend_string *pattern) {
 	size_t i;
 	for (i = 0; i < ZSTR_LEN(pattern); i++) {
 		if (is_placeholder(ZSTR_VAL(pattern)[i])) {
@@ -126,7 +126,7 @@ static size_t browscap_compute_contains(
 }
 
 /* Length of regex, including escapes, anchors, etc. */
-static size_t browscap_compute_regex_len(zend_string *pattern) {
+static size_t browscap_compute_regex_len(const zend_string *pattern) {
 	size_t i, len = ZSTR_LEN(pattern);
 	for (i = 0; i < ZSTR_LEN(pattern); i++) {
 		switch (ZSTR_VAL(pattern)[i]) {
@@ -145,7 +145,7 @@ static size_t browscap_compute_regex_len(zend_string *pattern) {
 	return len + sizeof("~^$~")-1;
 }
 
-static zend_string *browscap_convert_pattern(zend_string *pattern, int persistent) /* {{{ */
+static zend_string *browscap_convert_pattern(const zend_string *pattern, bool persistent) /* {{{ */
 {
 	size_t i, j=0;
 	char *t;
@@ -306,7 +306,7 @@ static void php_browscap_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callb
 {
 	browscap_parser_ctx *ctx = arg;
 	browser_data *bdata = ctx->bdata;
-	int persistent = GC_FLAGS(bdata->htab) & IS_ARRAY_PERSISTENT;
+	bool persistent = GC_FLAGS(bdata->htab) & IS_ARRAY_PERSISTENT;
 
 	if (!arg1) {
 		return;
@@ -315,7 +315,7 @@ static void php_browscap_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callb
 	switch (callback_type) {
 		case ZEND_INI_PARSER_ENTRY:
 			if (ctx->current_entry != NULL && arg2) {
-				zend_string *new_key, *new_value;
+				zend_string *new_value;
 
 				/* Set proper value for true/false settings */
 				if (zend_string_equals_literal_ci(Z_STR_P(arg2), "on")
@@ -350,7 +350,7 @@ static void php_browscap_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callb
 
 					ctx->current_entry->parent = new_value;
 				} else {
-					new_key = browscap_intern_str_ci(ctx, Z_STR_P(arg1), persistent);
+					zend_string *new_key = browscap_intern_str_ci(ctx, Z_STR_P(arg1), persistent);
 					browscap_add_kv(bdata, new_key, new_value, persistent);
 					ctx->current_entry->kv_end = bdata->kv_used;
 				}
@@ -402,7 +402,7 @@ static void php_browscap_parser_cb(zval *arg1, zval *arg2, zval *arg3, int callb
 }
 /* }}} */
 
-static int browscap_read_file(char *filename, browser_data *browdata, int persistent) /* {{{ */
+static zend_result browscap_read_file(char *filename, browser_data *browdata, bool persistent) /* {{{ */
 {
 	zend_file_handle fh;
 	browscap_parser_ctx ctx = {0};
@@ -459,7 +459,7 @@ static void browscap_globals_ctor(zend_browscap_globals *browscap_globals) /* {{
 /* }}} */
 #endif
 
-static void browscap_bdata_dtor(browser_data *bdata, int persistent) /* {{{ */
+static void browscap_bdata_dtor(browser_data *bdata, bool persistent) /* {{{ */
 {
 	if (bdata->htab != NULL) {
 		uint32_t i;
@@ -510,7 +510,7 @@ PHP_MINIT_FUNCTION(browscap) /* {{{ */
 	/* ctor call not really needed for non-ZTS */
 
 	if (browscap && browscap[0]) {
-		if (browscap_read_file(browscap, &global_bdata, 1) == FAILURE) {
+		if (browscap_read_file(browscap, &global_bdata, true) == FAILURE) {
 			return FAILURE;
 		}
 	}
@@ -538,7 +538,7 @@ PHP_MSHUTDOWN_FUNCTION(browscap) /* {{{ */
 }
 /* }}} */
 
-static inline size_t browscap_get_minimum_length(browscap_entry *entry) {
+static inline size_t browscap_get_minimum_length(const browscap_entry *entry) {
 	size_t len = entry->prefix_len;
 	int i;
 	for (i = 0; i < BROWSCAP_NUM_CONTAINS; i++) {
@@ -622,13 +622,12 @@ static bool browscap_match_string_wildcard(const char *s, const char *s_end, con
 	return pattern_current == pattern_end;
 }
 
-static int browser_reg_compare(browscap_entry *entry, zend_string *agent_name, browscap_entry **found_entry_ptr, size_t *cached_prev_len) /* {{{ */
+static int browser_reg_compare(browscap_entry *entry, const zend_string *agent_name, browscap_entry **found_entry_ptr, size_t *cached_prev_len) /* {{{ */
 {
 	browscap_entry *found_entry = *found_entry_ptr;
 	ALLOCA_FLAG(use_heap)
 	zend_string *pattern_lc;
 	const char *cur;
-	int i;
 
 	/* Lowercase the pattern, the agent name is already lowercase */
 	ZSTR_ALLOCA_ALLOC(pattern_lc, ZSTR_LEN(entry->pattern), use_heap);
@@ -636,7 +635,7 @@ static int browser_reg_compare(browscap_entry *entry, zend_string *agent_name, b
 
 	/* Check if the agent contains the "contains" portions */
 	cur = ZSTR_VAL(agent_name) + entry->prefix_len;
-	for (i = 0; i < BROWSCAP_NUM_CONTAINS; i++) {
+	for (int i = 0; i < BROWSCAP_NUM_CONTAINS; i++) {
 		if (entry->contains_len[i] != 0) {
 			cur = zend_memnstr(cur,
 				ZSTR_VAL(pattern_lc) + entry->contains_start[i],
@@ -668,7 +667,7 @@ static int browser_reg_compare(browscap_entry *entry, zend_string *agent_name, b
 		   number of characters changed in the user agent being checked versus
 		   the previous match found and the current match. */
 		size_t curr_len = entry->prefix_len; /* Start from the prefix because the prefix is free of wildcards */
-		zend_string *current_match = entry->pattern;
+		const zend_string *current_match = entry->pattern;
 		for (size_t i = curr_len; i < ZSTR_LEN(current_match); i++) {
 			switch (ZSTR_VAL(current_match)[i]) {
 				case '?':
@@ -717,7 +716,7 @@ PHP_FUNCTION(get_browser)
 	if (BROWSCAP_G(activation_bdata).filename[0] != '\0') {
 		bdata = &BROWSCAP_G(activation_bdata);
 		if (bdata->htab == NULL) { /* not initialized yet */
-			if (browscap_read_file(bdata->filename, bdata, 0) == FAILURE) {
+			if (browscap_read_file(bdata->filename, bdata, false) == FAILURE) {
 				RETURN_FALSE;
 			}
 		}
diff --git a/ext/standard/dir_arginfo.h b/ext/standard/dir_arginfo.h
index 47ab180ed7b17..8440c154e60b9 100644
--- a/ext/standard/dir_arginfo.h
+++ b/ext/standard/dir_arginfo.h
@@ -62,9 +62,7 @@ static zend_class_entry *register_class_Directory(void)
 
 	zval property_path_default_value;
 	ZVAL_UNDEF(&property_path_default_value);
-	zend_string *property_path_name = zend_string_init("path", sizeof("path") - 1, 1);
-	zend_declare_typed_property(class_entry, property_path_name, &property_path_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_path_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_PATH), &property_path_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_handle_default_value;
 	ZVAL_UNDEF(&property_handle_default_value);
diff --git a/ext/standard/exec.c b/ext/standard/exec.c
index 8ebca90bce396..1df46cc050b01 100644
--- a/ext/standard/exec.c
+++ b/ext/standard/exec.c
@@ -118,11 +118,7 @@ PHPAPI int php_exec(int type, const char *cmd, zval *array, zval *return_value)
 	php_stream *stream;
 	size_t buflen, bufl = 0;
 #if PHP_SIGCHILD
-	void (*sig_handler)() = NULL;
-#endif
-
-#if PHP_SIGCHILD
-	sig_handler = signal (SIGCHLD, SIG_DFL);
+	void (*sig_handler)() = signal(SIGCHLD, SIG_DFL);
 #endif
 
 #ifdef PHP_WIN32
@@ -272,8 +268,7 @@ PHP_FUNCTION(passthru)
    Escape all chars that could possibly be used to
    break out of a shell command
 
-   This function emalloc's a string and returns the pointer.
-   Remember to efree it when done with it.
+   This function returns an owned zend_string, remember to release it when done.
 
    *NOT* safe for binary strings
 */
diff --git a/ext/standard/file.c b/ext/standard/file.c
index 11d174cd9d5d3..01f49640e4af6 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -1109,30 +1109,6 @@ PHPAPI PHP_FUNCTION(fseek)
 }
 /* }}} */
 
-/* {{{ php_mkdir */
-
-/* DEPRECATED APIs: Use php_stream_mkdir() instead */
-PHPAPI int php_mkdir_ex(const char *dir, zend_long mode, int options)
-{
-	int ret;
-
-	if (php_check_open_basedir(dir)) {
-		return -1;
-	}
-
-	if ((ret = VCWD_MKDIR(dir, (mode_t)mode)) < 0 && (options & REPORT_ERRORS)) {
-		php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
-	}
-
-	return ret;
-}
-
-PHPAPI int php_mkdir(const char *dir, zend_long mode)
-{
-	return php_mkdir_ex(dir, mode, REPORT_ERRORS);
-}
-/* }}} */
-
 /* {{{ Create a directory */
 PHP_FUNCTION(mkdir)
 {
@@ -1677,6 +1653,28 @@ static const char *php_fgetcsv_lookup_trailing_spaces(const char *ptr, size_t le
 }
 /* }}} */
 
+PHPAPI int php_csv_handle_escape_argument(const zend_string *escape_str, uint32_t arg_num)
+{
+	if (escape_str != NULL) {
+		if (ZSTR_LEN(escape_str) > 1) {
+			zend_argument_value_error(arg_num, "must be empty or a single character");
+			return PHP_CSV_ESCAPE_ERROR;
+		}
+		if (ZSTR_LEN(escape_str) < 1) {
+			return PHP_CSV_NO_ESCAPE;
+		} else {
+			/* use first character from string */
+			return (unsigned char) ZSTR_VAL(escape_str)[0];
+		}
+	} else {
+		php_error_docref(NULL, E_DEPRECATED, "the $escape parameter must be provided as its default value will change");
+		if (UNEXPECTED(EG(exception))) {
+			return PHP_CSV_ESCAPE_ERROR;
+		}
+		return (unsigned char) '\\';
+	}
+}
+
 #define FPUTCSV_FLD_CHK(c) memchr(ZSTR_VAL(field_str), c, ZSTR_LEN(field_str))
 
 /* {{{ Format line as CSV and write to file pointer */
@@ -1684,12 +1682,12 @@ PHP_FUNCTION(fputcsv)
 {
 	char delimiter = ',';					/* allow this to be set as parameter */
 	char enclosure = '"';					/* allow this to be set as parameter */
-	int escape_char = (unsigned char) '\\';	/* allow this to be set as parameter */
 	php_stream *stream;
 	zval *fp = NULL, *fields = NULL;
 	ssize_t ret;
-	char *delimiter_str = NULL, *enclosure_str = NULL, *escape_str = NULL;
-	size_t delimiter_str_len = 0, enclosure_str_len = 0, escape_str_len = 0;
+	char *delimiter_str = NULL, *enclosure_str = NULL;
+	zend_string *escape_str = NULL;
+	size_t delimiter_str_len = 0, enclosure_str_len = 0;
 	zend_string *eol_str = NULL;
 
 	ZEND_PARSE_PARAMETERS_START(2, 6)
@@ -1698,7 +1696,7 @@ PHP_FUNCTION(fputcsv)
 		Z_PARAM_OPTIONAL
 		Z_PARAM_STRING(delimiter_str, delimiter_str_len)
 		Z_PARAM_STRING(enclosure_str, enclosure_str_len)
-		Z_PARAM_STRING(escape_str, escape_str_len)
+		Z_PARAM_STR(escape_str)
 		Z_PARAM_STR_OR_NULL(eol_str)
 	ZEND_PARSE_PARAMETERS_END();
 
@@ -1722,21 +1720,9 @@ PHP_FUNCTION(fputcsv)
 		enclosure = *enclosure_str;
 	}
 
-	if (escape_str != NULL) {
-		if (escape_str_len > 1) {
-			zend_argument_value_error(5, "must be empty or a single character");
-			RETURN_THROWS();
-		}
-		if (escape_str_len < 1) {
-			escape_char = PHP_CSV_NO_ESCAPE;
-		} else {
-			php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4");
-			if (UNEXPECTED(EG(exception))) {
-				RETURN_THROWS();
-			}
-			/* use first character from string */
-			escape_char = (unsigned char) *escape_str;
-		}
+	int escape_char = php_csv_handle_escape_argument(escape_str, 5);
+	if (escape_char == PHP_CSV_ESCAPE_ERROR) {
+		RETURN_THROWS();
 	}
 
 	PHP_STREAM_FROM_ZVAL(stream, fp);
@@ -1819,80 +1805,64 @@ PHP_FUNCTION(fgetcsv)
 {
 	char delimiter = ',';	/* allow this to be set as parameter */
 	char enclosure = '"';	/* allow this to be set as parameter */
-	int escape = (unsigned char) '\\';
 
 	zend_long len = 0;
 	size_t buf_len;
 	char *buf;
 	php_stream *stream;
 
-	{
-		zval *fd;
-		bool len_is_null = 1;
-		char *delimiter_str = NULL;
-		size_t delimiter_str_len = 0;
-		char *enclosure_str = NULL;
-		size_t enclosure_str_len = 0;
-		char *escape_str = NULL;
-		size_t escape_str_len = 0;
-
-		ZEND_PARSE_PARAMETERS_START(1, 5)
-			Z_PARAM_RESOURCE(fd)
-			Z_PARAM_OPTIONAL
-			Z_PARAM_LONG_OR_NULL(len, len_is_null)
-			Z_PARAM_STRING(delimiter_str, delimiter_str_len)
-			Z_PARAM_STRING(enclosure_str, enclosure_str_len)
-			Z_PARAM_STRING(escape_str, escape_str_len)
-		ZEND_PARSE_PARAMETERS_END();
-
-		if (delimiter_str != NULL) {
-			/* Make sure that there is at least one character in string */
-			if (delimiter_str_len != 1) {
-				zend_argument_value_error(3, "must be a single character");
-				RETURN_THROWS();
-			}
-
-			/* use first character from string */
-			delimiter = delimiter_str[0];
-		}
+	zval *fd;
+	bool len_is_null = 1;
+	char *delimiter_str = NULL;
+	size_t delimiter_str_len = 0;
+	char *enclosure_str = NULL;
+	size_t enclosure_str_len = 0;
+	zend_string *escape_str = NULL;
 
-		if (enclosure_str != NULL) {
-			if (enclosure_str_len != 1) {
-				zend_argument_value_error(4, "must be a single character");
-				RETURN_THROWS();
-			}
+	ZEND_PARSE_PARAMETERS_START(1, 5)
+		Z_PARAM_RESOURCE(fd)
+		Z_PARAM_OPTIONAL
+		Z_PARAM_LONG_OR_NULL(len, len_is_null)
+		Z_PARAM_STRING(delimiter_str, delimiter_str_len)
+		Z_PARAM_STRING(enclosure_str, enclosure_str_len)
+		Z_PARAM_STR(escape_str)
+	ZEND_PARSE_PARAMETERS_END();
 
-			/* use first character from string */
-			enclosure = enclosure_str[0];
+	if (delimiter_str != NULL) {
+		/* Make sure that there is at least one character in string */
+		if (delimiter_str_len != 1) {
+			zend_argument_value_error(3, "must be a single character");
+			RETURN_THROWS();
 		}
 
-		if (escape_str != NULL) {
-			if (escape_str_len > 1) {
-				zend_argument_value_error(5, "must be empty or a single character");
-				RETURN_THROWS();
-			}
-
-			if (escape_str_len < 1) {
-				escape = PHP_CSV_NO_ESCAPE;
-			} else {
-				php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4");
-				if (UNEXPECTED(EG(exception))) {
-					RETURN_THROWS();
-				}
-				escape = (unsigned char) escape_str[0];
-			}
-		}
+		/* use first character from string */
+		delimiter = delimiter_str[0];
+	}
 
-		if (len_is_null || len == 0) {
-			len = -1;
-		} else if (len < 0 || len > (ZEND_LONG_MAX - 1)) {
-			zend_argument_value_error(2, "must be between 0 and " ZEND_LONG_FMT, (ZEND_LONG_MAX - 1));
+	if (enclosure_str != NULL) {
+		if (enclosure_str_len != 1) {
+			zend_argument_value_error(4, "must be a single character");
 			RETURN_THROWS();
 		}
 
-		PHP_STREAM_FROM_ZVAL(stream, fd);
+		/* use first character from string */
+		enclosure = enclosure_str[0];
+	}
+
+	int escape_char = php_csv_handle_escape_argument(escape_str, 5);
+	if (escape_char == PHP_CSV_ESCAPE_ERROR) {
+		RETURN_THROWS();
 	}
 
+	if (len_is_null || len == 0) {
+		len = -1;
+	} else if (len < 0 || len > (ZEND_LONG_MAX - 1)) {
+		zend_argument_value_error(2, "must be between 0 and " ZEND_LONG_FMT, (ZEND_LONG_MAX - 1));
+		RETURN_THROWS();
+	}
+
+	PHP_STREAM_FROM_ZVAL(stream, fd);
+
 	if (len < 0) {
 		if ((buf = php_stream_get_line(stream, NULL, 0, &buf_len)) == NULL) {
 			RETURN_FALSE;
@@ -1905,7 +1875,7 @@ PHP_FUNCTION(fgetcsv)
 		}
 	}
 
-	HashTable *values = php_fgetcsv(stream, delimiter, enclosure, escape, buf_len, buf);
+	HashTable *values = php_fgetcsv(stream, delimiter, enclosure, escape_char, buf_len, buf);
 	if (values == NULL) {
 		values = php_bc_fgetcsv_empty_line();
 	}
diff --git a/ext/standard/file.h b/ext/standard/file.h
index eead935848877..3a9cf1435b143 100644
--- a/ext/standard/file.h
+++ b/ext/standard/file.h
@@ -40,14 +40,15 @@ PHPAPI int php_le_stream_context(void);
 PHPAPI zend_result php_copy_file(const char *src, const char *dest);
 PHPAPI zend_result php_copy_file_ex(const char *src, const char *dest, int src_flags);
 PHPAPI zend_result php_copy_file_ctx(const char *src, const char *dest, int src_flags, php_stream_context *ctx);
-PHPAPI int php_mkdir_ex(const char *dir, zend_long mode, int options);
-PHPAPI int php_mkdir(const char *dir, zend_long mode);
 PHPAPI void php_fstat(php_stream *stream, zval *return_value);
 PHPAPI void php_flock_common(php_stream *stream, zend_long operation, uint32_t operation_arg_num,
 	zval *wouldblock, zval *return_value);
 
 #define PHP_CSV_NO_ESCAPE EOF
+#define PHP_CSV_ESCAPE_ERROR -500
+
 PHPAPI HashTable *php_bc_fgetcsv_empty_line(void);
+PHPAPI int php_csv_handle_escape_argument(const zend_string *escape_str, uint32_t arg_num);
 PHPAPI HashTable *php_fgetcsv(php_stream *stream, char delimiter, char enclosure, int escape_char, size_t buf_len, char *buf);
 PHPAPI ssize_t php_fputcsv(php_stream *stream, zval *fields, char delimiter, char enclosure, int escape_char, zend_string *eol_str);
 
diff --git a/ext/standard/html.c b/ext/standard/html.c
index 92cee224e068b..0c6231d590d88 100644
--- a/ext/standard/html.c
+++ b/ext/standard/html.c
@@ -451,7 +451,7 @@ static inline unsigned char unimap_bsearch(const uni_to_enc *table, unsigned cod
 /* }}} */
 
 /* {{{ map_from_unicode */
-static inline int map_from_unicode(unsigned code, enum entity_charset charset, unsigned *res)
+static inline zend_result map_from_unicode(unsigned code, enum entity_charset charset, unsigned *res)
 {
 	unsigned char found;
 	const uni_to_enc *table;
@@ -667,7 +667,7 @@ static inline int numeric_entity_is_allowed(unsigned uni_cp, int document_type)
  * On input, *buf should point to the first character after # and on output, it's the last
  * byte read, no matter if there was success or insuccess.
  */
-static inline int process_numeric_entity(const char **buf, unsigned *code_point)
+static inline zend_result process_numeric_entity(const char **buf, unsigned *code_point)
 {
 	zend_long code_l;
 	int hexadecimal = (**buf == 'x' || **buf == 'X'); /* TODO: XML apparently disallows "X" */
@@ -703,7 +703,7 @@ static inline int process_numeric_entity(const char **buf, unsigned *code_point)
 /* }}} */
 
 /* {{{ process_named_entity */
-static inline int process_named_entity_html(const char **buf, const char **start, size_t *length)
+static inline zend_result process_named_entity_html(const char **buf, const char **start, size_t *length)
 {
 	*start = *buf;
 
@@ -732,7 +732,7 @@ static inline int process_named_entity_html(const char **buf, const char **start
 /* }}} */
 
 /* {{{ resolve_named_entity_html */
-static int resolve_named_entity_html(const char *start, size_t length, const entity_ht *ht, unsigned *uni_cp1, unsigned *uni_cp2)
+static zend_result resolve_named_entity_html(const char *start, size_t length, const entity_ht *ht, unsigned *uni_cp1, unsigned *uni_cp2)
 {
 	const entity_cp_map *s;
 	zend_ulong hash = zend_inline_hash_func(start, length);
@@ -780,9 +780,7 @@ static inline size_t write_octet_sequence(unsigned char *buf, enum entity_charse
 #if 0
 		return php_mb2_int_to_char(buf, code);
 #else
-#if ZEND_DEBUG
-		assert(code <= 0xFFU);
-#endif
+		ZEND_ASSERT(code <= 0xFFU);
 		*buf = code;
 		return 1;
 #endif
@@ -791,9 +789,7 @@ static inline size_t write_octet_sequence(unsigned char *buf, enum entity_charse
 #if 0 /* idem */
 		return php_mb2_int_to_char(buf, code);
 #else
-#if ZEND_DEBUG
-		assert(code <= 0xFFU);
-#endif
+		ZEND_ASSERT(code <= 0xFFU);
 		*buf = code;
 		return 1;
 #endif
diff --git a/ext/standard/http.c b/ext/standard/http.c
index 5f796a4a4026b..fd862b605a7e6 100644
--- a/ext/standard/http.c
+++ b/ext/standard/http.c
@@ -20,6 +20,7 @@
 #include "SAPI.h"
 #include "zend_exceptions.h"
 #include "basic_functions.h"
+#include "zend_enum.h"
 
 static void php_url_encode_scalar(zval *scalar, smart_str *form_str,
 	int encoding_type, zend_ulong index_int,
@@ -56,6 +57,7 @@ static void php_url_encode_scalar(zval *scalar, smart_str *form_str,
 	}
 	smart_str_appendc(form_str, '=');
 
+try_again:
 	switch (Z_TYPE_P(scalar)) {
 		case IS_STRING: {
 			zend_string *encoded_data;
@@ -90,6 +92,14 @@ static void php_url_encode_scalar(zval *scalar, smart_str *form_str,
 		case IS_TRUE:
 			smart_str_appendc(form_str, '1');
 			break;
+		case IS_OBJECT:
+			ZEND_ASSERT(Z_OBJCE_P(scalar)->ce_flags & ZEND_ACC_ENUM);
+			if (Z_OBJCE_P(scalar)->enum_backing_type == IS_UNDEF) {
+				zend_value_error("Unbacked enum %s cannot be converted to a string", ZSTR_VAL(Z_OBJCE_P(scalar)->name));
+				return;
+			}
+			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();
 	}
@@ -154,7 +164,9 @@ PHPAPI void php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
 		}
 
 		ZVAL_DEREF(zdata);
-		if (Z_TYPE_P(zdata) == IS_ARRAY || Z_TYPE_P(zdata) == IS_OBJECT) {
+		if (Z_TYPE_P(zdata) == IS_ARRAY
+		 || (Z_TYPE_P(zdata) == IS_OBJECT
+		  && !(Z_OBJCE_P(zdata)->ce_flags & ZEND_ACC_ENUM))) {
 			zend_string *new_prefix;
 			if (key) {
 				zend_string *encoded_key;
@@ -233,6 +245,11 @@ PHP_FUNCTION(http_build_query)
 		Z_PARAM_LONG(enc_type)
 	ZEND_PARSE_PARAMETERS_END();
 
+	if (UNEXPECTED(Z_TYPE_P(formdata) == IS_OBJECT && (Z_OBJCE_P(formdata)->ce_flags & ZEND_ACC_ENUM))) {
+		zend_argument_type_error(1, "must be of type array, %s given", zend_zval_value_name(formdata));
+		RETURN_THROWS();
+	}
+
 	php_url_encode_hash_ex(HASH_OF(formdata), &formstr, prefix, prefix_len, /* key_prefix */ NULL, (Z_TYPE_P(formdata) == IS_OBJECT ? formdata : NULL), arg_sep, (int)enc_type);
 
 	RETURN_STR(smart_str_extract(&formstr));
diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c
index edc3327aa1150..3194b65262ba0 100644
--- a/ext/standard/http_fopen_wrapper.c
+++ b/ext/standard/http_fopen_wrapper.c
@@ -115,6 +115,34 @@ static bool check_has_header(const char *headers, const char *header) {
 	return 0;
 }
 
+static zend_result php_stream_handle_proxy_authorization_header(const char *s, smart_str *header)
+{
+	const char *p;
+
+	do {
+		while (*s == ' ' || *s == '\t') s++;
+		p = s;
+		while (*p != 0 && *p != ':' && *p != '\r' && *p !='\n') p++;
+		if (*p == ':') {
+			p++;
+			if (p - s == sizeof("Proxy-Authorization:") - 1 &&
+				zend_binary_strcasecmp(s, sizeof("Proxy-Authorization:") - 1,
+									   "Proxy-Authorization:", sizeof("Proxy-Authorization:") - 1) == 0) {
+				while (*p != 0 && *p != '\r' && *p !='\n') p++;
+				smart_str_appendl(header, s, p - s);
+				smart_str_appendl(header, "\r\n", sizeof("\r\n")-1);
+				return SUCCESS;
+			} else {
+				while (*p != 0 && *p != '\r' && *p !='\n') p++;
+			}
+		}
+		s = p;
+		while (*s == '\r' || *s == '\n') s++;
+	} while (*s != 0);
+
+	return FAILURE;
+}
+
 static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 		const char *path, const char *mode, int options, zend_string **opened_path,
 		php_stream_context *context, int redirect_max, int flags,
@@ -254,7 +282,7 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 
 	    /* check if we have Proxy-Authorization header */
 		if (context && (tmpzval = php_stream_context_get_option(context, "http", "header")) != NULL) {
-			char *s, *p;
+			const char *s;
 
 			if (Z_TYPE_P(tmpzval) == IS_ARRAY) {
 				zval *tmpheader = NULL;
@@ -262,50 +290,16 @@ static php_stream *php_stream_url_wrap_http_ex(php_stream_wrapper *wrapper,
 				ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(tmpzval), tmpheader) {
 					if (Z_TYPE_P(tmpheader) == IS_STRING) {
 						s = Z_STRVAL_P(tmpheader);
-						do {
-							while (*s == ' ' || *s == '\t') s++;
-							p = s;
-							while (*p != 0 && *p != ':' && *p != '\r' && *p !='\n') p++;
-							if (*p == ':') {
-								p++;
-								if (p - s == sizeof("Proxy-Authorization:") - 1 &&
-								    zend_binary_strcasecmp(s, sizeof("Proxy-Authorization:") - 1,
-								        "Proxy-Authorization:", sizeof("Proxy-Authorization:") - 1) == 0) {
-									while (*p != 0 && *p != '\r' && *p !='\n') p++;
-									smart_str_appendl(&header, s, p - s);
-									smart_str_appendl(&header, "\r\n", sizeof("\r\n")-1);
-									goto finish;
-								} else {
-									while (*p != 0 && *p != '\r' && *p !='\n') p++;
-								}
-							}
-							s = p;
-							while (*s == '\r' || *s == '\n') s++;
-						} while (*s != 0);
+						if (php_stream_handle_proxy_authorization_header(s, &header) == SUCCESS) {
+							goto finish;
+						}
 					}
 				} ZEND_HASH_FOREACH_END();
 			} else if (Z_TYPE_P(tmpzval) == IS_STRING && Z_STRLEN_P(tmpzval)) {
 				s = Z_STRVAL_P(tmpzval);
-				do {
-					while (*s == ' ' || *s == '\t') s++;
-					p = s;
-					while (*p != 0 && *p != ':' && *p != '\r' && *p !='\n') p++;
-					if (*p == ':') {
-						p++;
-						if (p - s == sizeof("Proxy-Authorization:") - 1 &&
-						    zend_binary_strcasecmp(s, sizeof("Proxy-Authorization:") - 1,
-						        "Proxy-Authorization:", sizeof("Proxy-Authorization:") - 1) == 0) {
-							while (*p != 0 && *p != '\r' && *p !='\n') p++;
-							smart_str_appendl(&header, s, p - s);
-							smart_str_appendl(&header, "\r\n", sizeof("\r\n")-1);
-							goto finish;
-						} else {
-							while (*p != 0 && *p != '\r' && *p !='\n') p++;
-						}
-					}
-					s = p;
-					while (*s == '\r' || *s == '\n') s++;
-				} while (*s != 0);
+				if (php_stream_handle_proxy_authorization_header(s, &header) == SUCCESS) {
+					goto finish;
+				}
 			}
 		}
 finish:
diff --git a/ext/standard/pack.c b/ext/standard/pack.c
index 28d0f3af11c2c..ec30be436741d 100644
--- a/ext/standard/pack.c
+++ b/ext/standard/pack.c
@@ -977,6 +977,13 @@ PHP_FUNCTION(unpack)
 						zend_string *buf;
 						zend_long ipos, opos;
 
+
+						if (size > INT_MAX / 2) {
+							zend_string_release(real_name);
+							zend_argument_value_error(1, "repeater must be less than or equal to %d", INT_MAX / 2);
+							RETURN_THROWS();
+						}
+
 						/* If size was given take minimum of len and size */
 						if (size >= 0 && len > (size * 2)) {
 							len = size * 2;
diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h
index 1be7d9b283772..51c537de6e628 100644
--- a/ext/standard/php_string.h
+++ b/ext/standard/php_string.h
@@ -34,10 +34,6 @@ PHP_MINIT_FUNCTION(string_intrin);
 	strnatcmp_ex(a, strlen(a), b, strlen(b), 1)
 PHPAPI int strnatcmp_ex(char const *a, size_t a_len, char const *b, size_t b_len, bool is_case_insensitive);
 PHPAPI struct lconv *localeconv_r(struct lconv *out);
-PHPAPI char *php_strtoupper(char *s, size_t len);
-PHPAPI char *php_strtolower(char *s, size_t len);
-PHPAPI zend_string *php_string_toupper(zend_string *s);
-PHPAPI zend_string *php_string_tolower(zend_string *s);
 PHPAPI char *php_strtr(char *str, size_t len, const char *str_from, const char *str_to, size_t trlen);
 PHPAPI zend_string *php_addslashes(zend_string *str);
 PHPAPI void php_stripslashes(zend_string *str);
@@ -46,7 +42,7 @@ PHPAPI zend_string *php_addcslashes(zend_string *str, const char *what, size_t w
 PHPAPI void php_stripcslashes(zend_string *str);
 PHPAPI zend_string *php_basename(const char *s, size_t len, const char *suffix, size_t sufflen);
 PHPAPI size_t php_dirname(char *str, size_t len);
-PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len);
+PHPAPI char *php_stristr(const char *s, const char *t, size_t s_len, size_t t_len);
 PHPAPI zend_string *php_str_to_str(const char *haystack, size_t length, const char *needle,
 		size_t needle_len, const char *str, size_t str_len);
 PHPAPI zend_string *php_trim(zend_string *str, const char *what, size_t what_len, int mode);
@@ -80,7 +76,4 @@ PHPAPI bool php_binary_string_shuffle(php_random_algo_with_state engine, char *s
 #define PHP_PATHINFO_FILENAME 	8
 #define PHP_PATHINFO_ALL	(PHP_PATHINFO_DIRNAME | PHP_PATHINFO_BASENAME | PHP_PATHINFO_EXTENSION | PHP_PATHINFO_FILENAME)
 
-#define PHP_STR_STRSPN			0
-#define PHP_STR_STRCSPN			1
-
 #endif /* PHP_STRING_H */
diff --git a/ext/standard/quot_print.c b/ext/standard/quot_print.c
index e6aa2e43f4c6c..a7132df2f7fd3 100644
--- a/ext/standard/quot_print.c
+++ b/ext/standard/quot_print.c
@@ -34,16 +34,12 @@ static char php_hex2int(int c) /* {{{ */
 {
 	if (isdigit(c)) {
 		return c - '0';
-	}
-	else if (c >= 'A' && c <= 'F') {
+	} else if (c >= 'A' && c <= 'F') {
 		return c - 'A' + 10;
-	}
-	else if (c >= 'a' && c <= 'f') {
+	} else {
+		ZEND_ASSERT(c >= 'a' && c <= 'f');
 		return c - 'a' + 10;
 	}
-	else {
-		return -1;
-	}
 }
 /* }}} */
 
@@ -145,7 +141,7 @@ PHPAPI zend_string *php_quot_print_encode(const unsigned char *str, size_t lengt
 {
 	zend_ulong lp = 0;
 	unsigned char c, *d;
-	char *hex = "0123456789ABCDEF";
+	const char *hex = "0123456789ABCDEF";
 	zend_string *ret;
 
 	ret = zend_string_safe_alloc(3, (length + (((3 * length)/(PHP_QPRINT_MAXL-9)) + 1)), 0, 0);
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 1082066dcec55..9f7e0ff60d3a8 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -207,7 +207,7 @@ PHP_FUNCTION(hex2bin)
 }
 /* }}} */
 
-static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, int behavior) /* {{{ */
+static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, bool is_strspn) /* {{{ */
 {
 	zend_string *s11, *s22;
 	zend_long start = 0, len = 0;
@@ -249,13 +249,12 @@ static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, int behavior) /
 		RETURN_LONG(0);
 	}
 
-	if (behavior == PHP_STR_STRSPN) {
+	if (is_strspn) {
 		RETURN_LONG(php_strspn(ZSTR_VAL(s11) + start /*str1_start*/,
 						ZSTR_VAL(s22) /*str2_start*/,
 						ZSTR_VAL(s11) + start + len /*str1_end*/,
 						ZSTR_VAL(s22) + ZSTR_LEN(s22) /*str2_end*/));
 	} else {
-		ZEND_ASSERT(behavior == PHP_STR_STRCSPN);
 		RETURN_LONG(php_strcspn(ZSTR_VAL(s11) + start /*str1_start*/,
 						ZSTR_VAL(s22) /*str2_start*/,
 						ZSTR_VAL(s11) + start + len /*str1_end*/,
@@ -267,14 +266,14 @@ static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, int behavior) /
 /* {{{ Finds length of initial segment consisting entirely of characters found in mask. If start or/and length is provided works like strspn(substr($s,$start,$len),$good_chars) */
 PHP_FUNCTION(strspn)
 {
-	php_spn_common_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_STR_STRSPN);
+	php_spn_common_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, /* is_strspn */ true);
 }
 /* }}} */
 
 /* {{{ Finds length of initial segment consisting entirely of characters not found in mask. If start or/and length is provide works like strcspn(substr($s,$start,$len),$bad_chars) */
 PHP_FUNCTION(strcspn)
 {
-	php_spn_common_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_STR_STRCSPN);
+	php_spn_common_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, /* is_strspn */ false);
 }
 /* }}} */
 
@@ -1212,21 +1211,6 @@ PHP_FUNCTION(strtok)
 }
 /* }}} */
 
-/* {{{ php_strtoupper */
-PHPAPI char *php_strtoupper(char *s, size_t len)
-{
-	zend_str_toupper(s, len);
-	return s;
-}
-/* }}} */
-
-/* {{{ php_string_toupper */
-PHPAPI zend_string *php_string_toupper(zend_string *s)
-{
-	return zend_string_toupper(s);
-}
-/* }}} */
-
 /* {{{ Makes a string uppercase */
 PHP_FUNCTION(strtoupper)
 {
@@ -1240,21 +1224,6 @@ PHP_FUNCTION(strtoupper)
 }
 /* }}} */
 
-/* {{{ php_strtolower */
-PHPAPI char *php_strtolower(char *s, size_t len)
-{
-	zend_str_tolower(s, len);
-	return s;
-}
-/* }}} */
-
-/* {{{ php_string_tolower */
-PHPAPI zend_string *php_string_tolower(zend_string *s)
-{
-	return zend_string_tolower(s);
-}
-/* }}} */
-
 /* {{{ Makes a string lowercase */
 PHP_FUNCTION(strtolower)
 {
@@ -1700,7 +1669,7 @@ PHP_FUNCTION(pathinfo)
 
 /* {{{ php_stristr
    case insensitive strstr */
-PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len)
+PHPAPI char *php_stristr(const char *s, const char *t, size_t s_len, size_t t_len)
 {
 	return (char*)php_memnistr(s, t, t_len, s + s_len);
 }
@@ -5447,16 +5416,16 @@ PHP_FUNCTION(str_getcsv)
 {
 	zend_string *str;
 	char delimiter = ',', enclosure = '"';
-	int escape = (unsigned char) '\\';
-	char *delimiter_str = NULL, *enclosure_str = NULL, *escape_str = NULL;
-	size_t delimiter_str_len = 0, enclosure_str_len = 0, escape_str_len = 0;
+	char *delimiter_str = NULL, *enclosure_str = NULL;
+	size_t delimiter_str_len = 0, enclosure_str_len = 0;
+	zend_string *escape_str = NULL;
 
 	ZEND_PARSE_PARAMETERS_START(1, 4)
 		Z_PARAM_STR(str)
 		Z_PARAM_OPTIONAL
 		Z_PARAM_STRING(delimiter_str, delimiter_str_len)
 		Z_PARAM_STRING(enclosure_str, enclosure_str_len)
-		Z_PARAM_STRING(escape_str, escape_str_len)
+		Z_PARAM_STR(escape_str)
 	ZEND_PARSE_PARAMETERS_END();
 
 	if (delimiter_str != NULL) {
@@ -5476,24 +5445,13 @@ PHP_FUNCTION(str_getcsv)
 		/* use first character from string */
 		enclosure = enclosure_str[0];
 	}
-	if (escape_str != NULL) {
-		if (escape_str_len > 1) {
-			zend_argument_value_error(4, "must be empty or a single character");
-			RETURN_THROWS();
-		}
 
-		if (escape_str_len < 1) {
-			escape = PHP_CSV_NO_ESCAPE;
-		} else {
-			php_error_docref(NULL, E_DEPRECATED, "Passing a non-empty string to the $escape parameter is deprecated since 8.4");
-			if (UNEXPECTED(EG(exception))) {
-				RETURN_THROWS();
-			}
-			escape = (unsigned char) escape_str[0];
-		}
+	int escape_char = php_csv_handle_escape_argument(escape_str, 4);
+	if (escape_char == PHP_CSV_ESCAPE_ERROR) {
+		RETURN_THROWS();
 	}
 
-	HashTable *values = php_fgetcsv(NULL, delimiter, enclosure, escape, ZSTR_LEN(str), ZSTR_VAL(str));
+	HashTable *values = php_fgetcsv(NULL, delimiter, enclosure, escape_char, ZSTR_LEN(str), ZSTR_VAL(str));
 	if (values == NULL) {
 		values = php_bc_fgetcsv_empty_line();
 	}
diff --git a/ext/standard/tests/array/gh15982.phpt b/ext/standard/tests/array/gh15982.phpt
new file mode 100644
index 0000000000000..2eb9eceb2318e
--- /dev/null
+++ b/ext/standard/tests/array/gh15982.phpt
@@ -0,0 +1,11 @@
+--TEST--
+GH-15982 (Assertion failure with array_find when references are involved)
+--FILE--
+ true));
+?>
+--EXPECT--
+string(5) "hello"
diff --git a/ext/standard/tests/array/gh16053.phpt b/ext/standard/tests/array/gh16053.phpt
new file mode 100644
index 0000000000000..7106fb989abae
--- /dev/null
+++ b/ext/standard/tests/array/gh16053.phpt
@@ -0,0 +1,28 @@
+--TEST--
+GH-16053: Assertion failure in Zend/zend_hash.c
+--FILE--
+ $x);
+$arr2 = array("string" => "hello");
+var_dump($arr1);
+var_dump(array_merge_recursive($arr1, $arr2));
+
+?>
+--EXPECTF--
+array(1) {
+  ["string"]=>
+  object(test)#%d (0) {
+  }
+}
+array(1) {
+  ["string"]=>
+  array(1) {
+    [0]=>
+    string(5) "hello"
+  }
+}
diff --git a/ext/standard/tests/file/bug12556.phpt b/ext/standard/tests/file/bug12556.phpt
index 83b39ad7822ae..586b1e6082274 100644
--- a/ext/standard/tests/file/bug12556.phpt
+++ b/ext/standard/tests/file/bug12556.phpt
@@ -3,7 +3,7 @@ Bug #12556 (fgetcsv() ignores lengths when quotes not closed)
 --FILE--
 
 --EXPECTF--
 array(2) {
diff --git a/ext/standard/tests/file/bug39538.phpt b/ext/standard/tests/file/bug39538.phpt
index 5f40192ec90d6..ea2bc9168065f 100644
--- a/ext/standard/tests/file/bug39538.phpt
+++ b/ext/standard/tests/file/bug39538.phpt
@@ -2,38 +2,53 @@
 Bug #39538 (fgetcsv can't handle starting newlines and trailing odd number of backslashes)
 --FILE--
 
+--CLEAN--
+
 --EXPECT--
-Array
-(
-    [0] => 
-this is an test
-    [1] => next data
-    [2] => p
-arsed
-)
-Array
-(
-    [0] => 
-this is an test
-    [1] => next data
-    [2] => p
-arsed
-)
-Array
-(
-    [0] => 
-
this is an test
-    [1] => next data
-    [2] => p
-
arsed
-)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/standard/tests/file/bug40501.phpt b/ext/standard/tests/file/bug40501.phpt
index e278609acab4e..42fcd296cfaaa 100644
--- a/ext/standard/tests/file/bug40501.phpt
+++ b/ext/standard/tests/file/bug40501.phpt
@@ -11,7 +11,6 @@ fclose($h);
 var_dump($data);
 ?>
 --EXPECTF--
-Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
 array(2) {
   [0]=>
   string(%d) "this element contains the delimiter, and ends with an odd number of
diff --git a/ext/standard/tests/file/bug53848.phpt b/ext/standard/tests/file/bug53848.phpt
index d634838b458f9..cae8da9828683 100644
--- a/ext/standard/tests/file/bug53848.phpt
+++ b/ext/standard/tests/file/bug53848.phpt
@@ -6,7 +6,7 @@ $file = __DIR__ . "/bug53848.csv";
 @unlink($file);
 file_put_contents($file, "a,b\n  c,  d");
 $fp = fopen($file, "r");
-while ($l = fgetcsv($fp)) var_dump($l);
+while ($l = fgetcsv($fp, escape: "\\")) var_dump($l);
 fclose($fp);
 @unlink($file);
 ?>
diff --git a/ext/standard/tests/file/bug66588.phpt b/ext/standard/tests/file/bug66588.phpt
index afb9ef36d500d..eb2650f99b5c3 100644
--- a/ext/standard/tests/file/bug66588.phpt
+++ b/ext/standard/tests/file/bug66588.phpt
@@ -9,13 +9,13 @@ and neither should return FALSE.
 $s = fopen("php://memory", "w+");
 fwrite($s, "\",bar");
 rewind($s);
-var_dump(fgetcsv($s));
+var_dump(fgetcsv($s, escape: "\\"));
 fclose($s);
 
 $s = fopen("php://memory", "w+");
 fwrite($s, "\",bar\n");
 rewind($s);
-var_dump(fgetcsv($s));
+var_dump(fgetcsv($s, escape: "\\"));
 fclose($s);
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/file/bug72330.phpt b/ext/standard/tests/file/bug72330.phpt
index d869b7171dccf..822be7d7b02b3 100644
--- a/ext/standard/tests/file/bug72330.phpt
+++ b/ext/standard/tests/file/bug72330.phpt
@@ -11,14 +11,13 @@ if (setlocale(LC_ALL, "en_US.utf8", "en_AU.utf8", "ko_KR.utf8", "zh_CN.utf8", "d
 setlocale(LC_ALL, "en_US.utf8", "en_AU.utf8", "ko_KR.utf8", "zh_CN.utf8", "de_DE.utf8", "es_EC.utf8", "fr_FR.utf8", "ja_JP.utf8", "el_GR.utf8", "nl_NL.utf8");
 
 $utf_1 = chr(0xD1) . chr(0x81); // U+0440;
-$utf_2   = chr(0xD8) . chr(0x80); // U+0600
+$utf_2 = chr(0xD8) . chr(0x80); // U+0600
 
 $string = '"first #' . $utf_1 . $utf_2 . '";"second"';
 $fields = str_getcsv($string, ';', '"', "#");
 var_dump($fields);
 ?>
 --EXPECTF--
-Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
 array(2) {
   [0]=>
   string(11) "first #с"
diff --git a/ext/standard/tests/file/fgetcsv.phpt b/ext/standard/tests/file/fgetcsv.phpt
index 41e89699247ca..ba2aac5c41cf7 100644
--- a/ext/standard/tests/file/fgetcsv.phpt
+++ b/ext/standard/tests/file/fgetcsv.phpt
@@ -34,7 +34,7 @@ various fgetcsv() functionality tests
         fwrite($fp, $v);
         fclose($fp);
 
-        var_dump(fgetcsv(fopen($file, "r"), 1024));
+        var_dump(fgetcsv(fopen($file, "r"), 1024, escape: "\\"));
     }
     @unlink($file);
 ?>
diff --git a/ext/standard/tests/file/fgetcsv_default_escape_deprecation.phpt b/ext/standard/tests/file/fgetcsv_default_escape_deprecation.phpt
new file mode 100644
index 0000000000000..b048c029f4e05
--- /dev/null
+++ b/ext/standard/tests/file/fgetcsv_default_escape_deprecation.phpt
@@ -0,0 +1,27 @@
+--TEST--
+fgetcsv(): Deprecation if using default escape arg
+--FILE--
+
+--CLEAN--
+
+--EXPECTF--
+Deprecated: fgetcsv(): the $escape parameter must be provided as its default value will change in %s on line %d
+array(2) {
+  [0]=>
+  string(5) "test1"
+  [1]=>
+  string(5) "test2"
+}
diff --git a/ext/standard/tests/file/fgetcsv_error_conditions.phpt b/ext/standard/tests/file/fgetcsv_error_conditions.phpt
index cd07ece97ebde..3c1353cb3c20e 100644
--- a/ext/standard/tests/file/fgetcsv_error_conditions.phpt
+++ b/ext/standard/tests/file/fgetcsv_error_conditions.phpt
@@ -12,38 +12,38 @@ $enclosure = '"';
 
 echo 'fgetcsv() with negative length' . \PHP_EOL;
 try {
-    var_dump( fgetcsv($file_handle, -10) );
+    var_dump( fgetcsv($file_handle, -10, escape: "\\") );
 } catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
-    var_dump( fgetcsv($file_handle, -10, $delimiter) );
+    var_dump( fgetcsv($file_handle, -10, $delimiter, escape: "\\") );
 } catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 try {
-    var_dump( fgetcsv($file_handle, -10, $delimiter, $enclosure) );
+    var_dump( fgetcsv($file_handle, -10, $delimiter, $enclosure, escape: "\\") );
 } catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
 echo 'fgetcsv() with delimiter as empty string' . \PHP_EOL;
 try {
-    var_dump( fgetcsv($file_handle, $length, '', $enclosure) );
+    var_dump( fgetcsv($file_handle, $length, '', $enclosure, escape: "\\") );
 } catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
 echo 'fgetcsv() with enclosure as empty string' . \PHP_EOL;
 try {
-    var_dump( fgetcsv($file_handle, $length, $delimiter, '') );
+    var_dump( fgetcsv($file_handle, $length, $delimiter, '', escape: "\\") );
 } catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
 
 echo 'fgetcsv() with delimiter & enclosure as empty string' . \PHP_EOL;
 try {
-    var_dump( fgetcsv($file_handle, $length, '', '') );
+    var_dump( fgetcsv($file_handle, $length, '', '', escape: "\\") );
 } catch (\ValueError $e) {
     echo $e->getMessage() . \PHP_EOL;
 }
diff --git a/ext/standard/tests/general_functions/004.data b/ext/standard/tests/file/fgetcsv_tab_delimiter.data
similarity index 100%
rename from ext/standard/tests/general_functions/004.data
rename to ext/standard/tests/file/fgetcsv_tab_delimiter.data
diff --git a/ext/standard/tests/general_functions/004.phpt b/ext/standard/tests/file/fgetcsv_tab_delimiter.phpt
similarity index 62%
rename from ext/standard/tests/general_functions/004.phpt
rename to ext/standard/tests/file/fgetcsv_tab_delimiter.phpt
index 80a721693923e..8f772c8b0e338 100644
--- a/ext/standard/tests/general_functions/004.phpt
+++ b/ext/standard/tests/file/fgetcsv_tab_delimiter.phpt
@@ -2,9 +2,10 @@
 fgetcsv() with tab delimited fields (BUG #8258)
 --FILE--
 getMessage(), "\n";
     }
diff --git a/ext/standard/tests/file/fgetcsv_variation2.phpt b/ext/standard/tests/file/fgetcsv_variation2.phpt
index 2f88dcad60ef2..6ef75e6b0a77e 100644
--- a/ext/standard/tests/file/fgetcsv_variation2.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation2.phpt
@@ -69,7 +69,7 @@ foreach ($csv_lists as $csv_list) {
 
     // use length as 0
     fseek($file_handle, 0, SEEK_SET);
-    var_dump( fgetcsv($file_handle, 0, $delimiter, $enclosure) );
+    var_dump( fgetcsv($file_handle, 0, $delimiter, $enclosure, escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation20.phpt b/ext/standard/tests/file/fgetcsv_variation20.phpt
index a3c04992db8af..c7a98c4bec12d 100644
--- a/ext/standard/tests/file/fgetcsv_variation20.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation20.phpt
@@ -48,7 +48,7 @@ $loop_counter = 1;
 
     // read the line which is without csv fields, provide delimiter and see the working of fgetcsv
     $fp_pos = ftell($file_handle);
-    var_dump( fgetcsv($file_handle, 1024) );
+    var_dump( fgetcsv($file_handle, 1024, escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation21.phpt b/ext/standard/tests/file/fgetcsv_variation21.phpt
index d47a143d4c161..6a0b461a20679 100644
--- a/ext/standard/tests/file/fgetcsv_variation21.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation21.phpt
@@ -48,7 +48,7 @@ $loop_counter = 1;
 
     // read the line which is a blank line to see the working of fgetcsv
     $fp_pos = ftell($file_handle);
-    var_dump( fgetcsv($file_handle, 1024, '+') );
+    var_dump( fgetcsv($file_handle, 1024, '+', escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation22.phpt b/ext/standard/tests/file/fgetcsv_variation22.phpt
index ba927e01901b3..a6981db52da00 100644
--- a/ext/standard/tests/file/fgetcsv_variation22.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation22.phpt
@@ -66,7 +66,7 @@ foreach ($csv_lists as $csv_list) {
 
     // now file pointer should point to end of the file, try reading again
     var_dump( feof($file_handle) );
-    var_dump( fgetcsv($file_handle, 1024, $delimiter) ); // with length, delimiter
+    var_dump( fgetcsv($file_handle, 1024, $delimiter, escape: "\\") ); // with length, delimiter
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation23.phpt b/ext/standard/tests/file/fgetcsv_variation23.phpt
index e933ae54499a4..fc37594b10271 100644
--- a/ext/standard/tests/file/fgetcsv_variation23.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation23.phpt
@@ -16,13 +16,13 @@ if (!$fp) {
   echo "Error: failed to create file $filename!\n";
   exit();
 }
-var_dump( fgetcsv($fp) );
+var_dump( fgetcsv($fp, escape: "\\") );
 var_dump( ftell($fp) );
-var_dump( fgetcsv($fp, 1024) );
+var_dump( fgetcsv($fp, 1024, escape: "\\") );
 var_dump( ftell($fp) );
-var_dump( fgetcsv($fp, 1024, "+" ) );
+var_dump( fgetcsv($fp, 1024, "+", escape: "\\" ) );
 var_dump( ftell($fp) );
-var_dump( fgetcsv($fp, 1024, "+", "%") );
+var_dump( fgetcsv($fp, 1024, "+", "%", escape: "\\") );
 var_dump( ftell($fp) );
 
 // close and delete the file
diff --git a/ext/standard/tests/file/fgetcsv_variation29.phpt b/ext/standard/tests/file/fgetcsv_variation29.phpt
index de39f3eb79361..1e84728515ff0 100644
--- a/ext/standard/tests/file/fgetcsv_variation29.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation29.phpt
@@ -67,7 +67,7 @@ foreach ($csv_lists as $csv_list) {
 
     // now file pointer should point to end of the file, try reading again
     var_dump( feof($file_handle) );
-    var_dump( fgetcsv($file_handle) );
+    var_dump( fgetcsv($file_handle, escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation30.phpt b/ext/standard/tests/file/fgetcsv_variation30.phpt
index 7b3c13e108667..76a41cf59c314 100644
--- a/ext/standard/tests/file/fgetcsv_variation30.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation30.phpt
@@ -66,7 +66,7 @@ foreach ($csv_lists as $csv_list) {
 
     // now file pointer should point to end of the file, try reading again
     var_dump( feof($file_handle) );
-    var_dump( fgetcsv($file_handle, 1024) );
+    var_dump( fgetcsv($file_handle, 1024, escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation31.phpt b/ext/standard/tests/file/fgetcsv_variation31.phpt
index 8edaa5787f0c6..d6ee23313ca84 100644
--- a/ext/standard/tests/file/fgetcsv_variation31.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation31.phpt
@@ -68,7 +68,7 @@ foreach ($csv_lists as $csv_list) {
     // now file pointer should point to end of the file, try reading again
     var_dump( feof($file_handle) );
     $enc = 'z';
-    var_dump( fgetcsv($file_handle, 1024, $delimiter, $enc ) ); // with length, delimiter
+    var_dump( fgetcsv($file_handle, 1024, $delimiter, $enc, escape: "\\" ) ); // with length, delimiter
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation33.phpt b/ext/standard/tests/file/fgetcsv_variation33.phpt
index 7dfb1437e9ea9..61ed844d776bb 100644
--- a/ext/standard/tests/file/fgetcsv_variation33.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation33.phpt
@@ -9,7 +9,7 @@ EOS;
 $stream = fopen('php://memory', 'w+');
 fwrite($stream, $contents);
 rewind($stream);
-while (($data = fgetcsv($stream)) !== false) {
+while (($data = fgetcsv($stream, escape: "\\")) !== false) {
     var_dump($data);
 }
 fclose($stream);
diff --git a/ext/standard/tests/file/fgetcsv_variation6.phpt b/ext/standard/tests/file/fgetcsv_variation6.phpt
index bd1442155d2c3..6528db85c8bf0 100644
--- a/ext/standard/tests/file/fgetcsv_variation6.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation6.phpt
@@ -71,12 +71,12 @@ foreach ($csv_lists as $csv_list) {
 
     // use length as less than the actual size of the line
     fseek($file_handle, 0, SEEK_SET);
-    var_dump( fgetcsv($file_handle, 9, $delimiter, $enclosure) );
+    var_dump( fgetcsv($file_handle, 9, $delimiter, $enclosure, escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
     // read rest of the line
-    var_dump( fgetcsv($file_handle, 1024, $delimiter, $enclosure) );
+    var_dump( fgetcsv($file_handle, 1024, $delimiter, $enclosure, escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation7.phpt b/ext/standard/tests/file/fgetcsv_variation7.phpt
index 0d5c6dc11399c..14659f06d8290 100644
--- a/ext/standard/tests/file/fgetcsv_variation7.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation7.phpt
@@ -72,7 +72,7 @@ foreach ($csv_lists as $csv_list) {
 
     // use only default arguments
     fseek($file_handle, 0, SEEK_SET);
-    var_dump( fgetcsv($file_handle) );
+    var_dump( fgetcsv($file_handle, escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation8.phpt b/ext/standard/tests/file/fgetcsv_variation8.phpt
index 7978e82e318dc..be9610e6eb5f6 100644
--- a/ext/standard/tests/file/fgetcsv_variation8.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation8.phpt
@@ -74,7 +74,7 @@ foreach ($csv_lists as $csv_list) {
     fseek($file_handle, 0, SEEK_SET);
     $del = "+";
     $enc = "%";
-    var_dump( fgetcsv($file_handle, 1024, $del, $enc) );
+    var_dump( fgetcsv($file_handle, 1024, $del, $enc, escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fgetcsv_variation9.phpt b/ext/standard/tests/file/fgetcsv_variation9.phpt
index b1f14db1c8783..49f9bfda17db0 100644
--- a/ext/standard/tests/file/fgetcsv_variation9.phpt
+++ b/ext/standard/tests/file/fgetcsv_variation9.phpt
@@ -76,7 +76,7 @@ foreach ($csv_lists as $csv_list) {
     // use different delimiter but same enclosure char
     fseek($file_handle, 0, SEEK_SET);
     $del = "+";
-    var_dump( fgetcsv($file_handle, 1024, $del, $enclosure) );
+    var_dump( fgetcsv($file_handle, 1024, $del, $enclosure, escape: "\\") );
     // check the file pointer position and if eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/file_get_contents_basic.phpt b/ext/standard/tests/file/file_get_contents_basic.phpt
index bdd2133146d54..96f74c7611917 100644
--- a/ext/standard/tests/file/file_get_contents_basic.phpt
+++ b/ext/standard/tests/file/file_get_contents_basic.phpt
@@ -13,14 +13,14 @@ echo "*** Testing the basic functionality of the file_get_contents() function **
 echo "-- Testing with simple valid data file --\n";
 
 
-create_files($file_path, 1, "text", 0755, 100, "w", "file", 1, "byte");
-var_dump( file_get_contents($file_path."/file1.tmp") );
-delete_files($file_path, 1);
+create_files($file_path, 1, "text", 0755, 100, "w", "file_get_contents_basic", 1, "byte");
+var_dump( file_get_contents($file_path."/file_get_contents_basic1.tmp") );
+delete_files($file_path, 1, "file_get_contents_basic", 1);
 
 echo "\n-- Testing with empty file --\n";
 
-create_files($file_path, 1, "empty", 0755, 100, "w", "file", 1, "byte");
-var_dump( file_get_contents($file_path."/file1.tmp") );
+create_files($file_path, 1, "empty", 0755, 100, "w", "file_get_contents_basic", 1, "byte");
+var_dump( file_get_contents($file_path."/file_get_contents_basic1.tmp") );
 
 echo "\n*** Done ***";
 ?>
diff --git a/ext/standard/tests/file/file_get_contents_error.phpt b/ext/standard/tests/file/file_get_contents_error.phpt
index 12ddfc73f5787..5ac352123b309 100644
--- a/ext/standard/tests/file/file_get_contents_error.phpt
+++ b/ext/standard/tests/file/file_get_contents_error.phpt
@@ -13,17 +13,17 @@ include($file_path."/file.inc");
 echo "\n-- Testing with  Non-existing file --\n";
 print( file_get_contents("/no/such/file/or/dir") );
 
-create_files($file_path, 1, "text", 0755, 100, "w", "file", 1, "byte");
+create_files($file_path, 1, "text", 0755, 100, "w", "file_get_contents_error", 1, "byte");
 $file_handle = fopen($file_path."/file_put_contents_error.tmp", "w");
 
 echo "\n-- Testing for invalid negative maxlen values --\n";
 try {
-    file_get_contents($file_path."/file1.tmp", FALSE, $file_handle, 0, -5);
+    file_get_contents($file_path."/file_get_contents_error1.tmp", FALSE, $file_handle, 0, -5);
 } catch (ValueError $exception) {
     echo $exception->getMessage() . "\n";
 }
 
-delete_files($file_path, 1);
+delete_files($file_path, 1, "file_get_contents_error", 1);
 fclose($file_handle);
 unlink($file_path."/file_put_contents_error.tmp");
 
diff --git a/ext/standard/tests/file/fputcsv.phpt b/ext/standard/tests/file/fputcsv.phpt
index b303554e9c6e7..e5d5cae6e6234 100644
--- a/ext/standard/tests/file/fputcsv.phpt
+++ b/ext/standard/tests/file/fputcsv.phpt
@@ -31,7 +31,7 @@ $file = __DIR__ . '/fputcsv.csv';
 
 $fp = fopen($file, "w");
 foreach ($list as $v) {
-    fputcsv($fp, explode(',', $v));
+    fputcsv($fp, explode(',', $v), escape: "\\");
 }
 fclose($fp);
 
@@ -44,7 +44,7 @@ echo '$list = ';var_export($res);echo ";\n";
 
 $fp = fopen($file, "r");
 $res = array();
-while($l=fgetcsv($fp))
+while($l=fgetcsv($fp, escape: "\\"))
 {
     $res[] = join(',',$l);
 }
diff --git a/ext/standard/tests/file/fputcsv_002.phpt b/ext/standard/tests/file/fputcsv_002.phpt
index 90999a9e701b6..7009fc54e7d84 100644
--- a/ext/standard/tests/file/fputcsv_002.phpt
+++ b/ext/standard/tests/file/fputcsv_002.phpt
@@ -9,7 +9,7 @@ $data = array(1, 2, 'foo', 'haha', array(4, 5, 6), 1.3, null);
 
 $fp = fopen($file, 'w');
 
-fputcsv($fp, $data);
+fputcsv($fp, $data, escape: "\\");
 
 var_dump($data);
 
diff --git a/ext/standard/tests/file/fputcsv_default_escape_deprecation.phpt b/ext/standard/tests/file/fputcsv_default_escape_deprecation.phpt
new file mode 100644
index 0000000000000..4f8ceb3bb1a77
--- /dev/null
+++ b/ext/standard/tests/file/fputcsv_default_escape_deprecation.phpt
@@ -0,0 +1,27 @@
+--TEST--
+fputcsv(): Deprecation if using default escape arg
+--FILE--
+
+--CLEAN--
+
+--EXPECTF--
+Deprecated: fputcsv(): the $escape parameter must be provided as its default value will change in %s on line %d
+string(12) "test1,test2
+"
diff --git a/ext/standard/tests/file/fputcsv_variation1.phpt b/ext/standard/tests/file/fputcsv_variation1.phpt
index ba82b20428348..008cf1eabd1dd 100644
--- a/ext/standard/tests/file/fputcsv_variation1.phpt
+++ b/ext/standard/tests/file/fputcsv_variation1.phpt
@@ -50,7 +50,7 @@ foreach ($csv_lists as $csv_list) {
     $csv_field = $csv_list[2];
 
 
-    var_dump( fputcsv($file_handle, $csv_field, $delimiter, $enclosure) );
+    var_dump( fputcsv($file_handle, $csv_field, $delimiter, $enclosure, escape: "\\") );
     // check the file pointer position and eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fputcsv_variation10.phpt b/ext/standard/tests/file/fputcsv_variation10.phpt
index ecd184614320c..1baaa2f972f30 100644
--- a/ext/standard/tests/file/fputcsv_variation10.phpt
+++ b/ext/standard/tests/file/fputcsv_variation10.phpt
@@ -42,7 +42,7 @@ foreach ($fields as $field) {
     $csv_field = $field;
 
     // write to a file in csv format
-    var_dump( fputcsv($file_handle, $csv_field) );
+    var_dump( fputcsv($file_handle, $csv_field, escape: "\\") );
 
     // check the file pointer position and eof
     var_dump( ftell($file_handle) );
diff --git a/ext/standard/tests/file/fputcsv_variation11.phpt b/ext/standard/tests/file/fputcsv_variation11.phpt
index 2347b9332c4e4..d53c4606f935a 100644
--- a/ext/standard/tests/file/fputcsv_variation11.phpt
+++ b/ext/standard/tests/file/fputcsv_variation11.phpt
@@ -50,7 +50,7 @@ foreach ($csv_lists as $csv_list) {
     $csv_field = $csv_list[2];
 
     // write to a file in csv format
-    var_dump( fputcsv($file_handle, $csv_field, $delimiter) );
+    var_dump( fputcsv($file_handle, $csv_field, $delimiter, escape: "\\") );
     // check the file pointer position and eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fputcsv_variation12.phpt b/ext/standard/tests/file/fputcsv_variation12.phpt
index e5e14c0c91a06..36519ea212d80 100644
--- a/ext/standard/tests/file/fputcsv_variation12.phpt
+++ b/ext/standard/tests/file/fputcsv_variation12.phpt
@@ -51,7 +51,7 @@ foreach ($csv_lists as $csv_list) {
     $csv_field = $csv_list[2];
 
     // write to a file in csv format
-    var_dump( fputcsv($file_handle, $csv_field, '+') );
+    var_dump( fputcsv($file_handle, $csv_field, '+', escape: "\\") );
     // check the file pointer position and eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fputcsv_variation13.phpt b/ext/standard/tests/file/fputcsv_variation13.phpt
index 297819f68165d..2a2e1ef0470d3 100644
--- a/ext/standard/tests/file/fputcsv_variation13.phpt
+++ b/ext/standard/tests/file/fputcsv_variation13.phpt
@@ -52,7 +52,7 @@ foreach ($csv_lists as $csv_list) {
 
     // write to a file in csv format
     try {
-      var_dump( fputcsv($file_handle, $csv_field, '+', '%%') );
+      var_dump( fputcsv($file_handle, $csv_field, '+', '%%', escape: "\\") );
     } catch (ValueError $e) {
       echo $e->getMessage(), "\n";
     }
diff --git a/ext/standard/tests/file/fputcsv_variation18.phpt b/ext/standard/tests/file/fputcsv_variation18.phpt
index 7a6d84c21b03e..f232d843278d5 100644
--- a/ext/standard/tests/file/fputcsv_variation18.phpt
+++ b/ext/standard/tests/file/fputcsv_variation18.phpt
@@ -42,29 +42,12 @@ $file = __DIR__ . '/fputcsv_variation18.csv';
 @unlink($file);
 ?>
 --EXPECTF--
-Deprecated: fputcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
-
-Deprecated: fputcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
-
-Deprecated: fputcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
-
-Deprecated: fputcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
 $list = array (
   0 => 'aaa,"""/"bbb",ccc',
   1 => '"aaa""/"a""","""bbb"""',
   2 => '"""/"""","""aaa"""',
   3 => '"""/"""""",aaa',
 );
-
-Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
-
-Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
-
-Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
-
-Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
-
-Deprecated: fgetcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
 $list = array (
   0 => 'aaa,"/"bbb,ccc',
   1 => 'aaa"/"a","bbb"',
diff --git a/ext/standard/tests/file/fputcsv_variation5.phpt b/ext/standard/tests/file/fputcsv_variation5.phpt
index 9261f1d2c134c..a705ee4052fb7 100644
--- a/ext/standard/tests/file/fputcsv_variation5.phpt
+++ b/ext/standard/tests/file/fputcsv_variation5.phpt
@@ -50,7 +50,7 @@ foreach ($csv_lists as $csv_list) {
     $csv_field = $csv_list[2];
 
     // write to a file in csv format
-    var_dump( fputcsv($file_handle, $csv_field) );
+    var_dump( fputcsv($file_handle, $csv_field, escape: "\\") );
     // check the file pointer position and eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fputcsv_variation6.phpt b/ext/standard/tests/file/fputcsv_variation6.phpt
index a385c61ce91e5..b71b7267fded2 100644
--- a/ext/standard/tests/file/fputcsv_variation6.phpt
+++ b/ext/standard/tests/file/fputcsv_variation6.phpt
@@ -53,7 +53,7 @@ foreach ($csv_lists as $csv_list) {
     $csv_field = $csv_list[2];
 
     // write to a file in csv format
-    var_dump( fputcsv($file_handle, $csv_field, '+', '%') );
+    var_dump( fputcsv($file_handle, $csv_field, '+', '%', escape: "\\") );
     // check the file pointer position and eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fputcsv_variation7.phpt b/ext/standard/tests/file/fputcsv_variation7.phpt
index 7d7586cebfcfe..93f2cbc755ff6 100644
--- a/ext/standard/tests/file/fputcsv_variation7.phpt
+++ b/ext/standard/tests/file/fputcsv_variation7.phpt
@@ -53,7 +53,7 @@ foreach ($csv_lists as $csv_list) {
     $csv_field = $csv_list[2];
 
     // write to a file in csv format
-    var_dump( fputcsv($file_handle, $csv_field, '+', $enclosure) );
+    var_dump( fputcsv($file_handle, $csv_field, '+', $enclosure, escape: "\\") );
     // check the file pointer position and eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/fputcsv_variation8.phpt b/ext/standard/tests/file/fputcsv_variation8.phpt
index ed981284f5c34..61aabeebcd7cf 100644
--- a/ext/standard/tests/file/fputcsv_variation8.phpt
+++ b/ext/standard/tests/file/fputcsv_variation8.phpt
@@ -53,7 +53,7 @@ foreach ($csv_lists as $csv_list) {
     $csv_field = $csv_list[2];
 
     // write to a file in csv format
-    var_dump( fputcsv($file_handle, $csv_field, $delimiter, '+') );
+    var_dump( fputcsv($file_handle, $csv_field, $delimiter, '+', escape: "\\") );
     // check the file pointer position and eof
     var_dump( ftell($file_handle) );
     var_dump( feof($file_handle) );
diff --git a/ext/standard/tests/file/gh15653.phpt b/ext/standard/tests/file/gh15653.phpt
index 2391dee959d42..2511ea0a8d202 100644
--- a/ext/standard/tests/file/gh15653.phpt
+++ b/ext/standard/tests/file/gh15653.phpt
@@ -7,12 +7,12 @@ touch($filename);
 $fp = fopen ($filename, "r");
 
 try {
-	fgetcsv($fp, PHP_INT_MAX);
+	fgetcsv($fp, PHP_INT_MAX, escape: '');
 } catch (\ValueError $e) {
 	echo $e->getMessage() . PHP_EOL;
 }
 
-fgetcsv($fp, PHP_INT_MAX-1);
+fgetcsv($fp, PHP_INT_MAX-1,  escape: '');
 --CLEAN--
 
-  string(5) "32767"
+  string(5) "30719"
   ["display_errors"]=>
   string(1) "1"
   ["display_startup_errors"]=>
diff --git a/ext/standard/tests/general_functions/bug70157.phpt b/ext/standard/tests/general_functions/bug70157.phpt
index 815ccdcf966f2..748435dde6dbc 100644
--- a/ext/standard/tests/general_functions/bug70157.phpt
+++ b/ext/standard/tests/general_functions/bug70157.phpt
@@ -21,7 +21,7 @@ array(%d) {
   ["foo"]=>
   array(%d) {
     [123]=>
-    int(24575)
+    int(22527)
     [456]=>
     int(123)
   }
diff --git a/ext/standard/tests/general_functions/parse_ini_booleans.phpt b/ext/standard/tests/general_functions/parse_ini_booleans.phpt
index 3868147e62644..14459626c7fc3 100644
--- a/ext/standard/tests/general_functions/parse_ini_booleans.phpt
+++ b/ext/standard/tests/general_functions/parse_ini_booleans.phpt
@@ -15,17 +15,17 @@ array(3) {
   ["error_reporting values"]=>
   array(6) {
     ["foo"]=>
-    string(7) "32767 8"
+    string(7) "30719 8"
     ["error_reporting"]=>
-    string(5) "32767"
+    string(5) "30719"
     ["error_reporting1"]=>
     string(4) "4177"
     ["error_reporting2"]=>
-    string(5) "32759"
+    string(5) "30711"
     ["error_reporting3"]=>
-    string(5) "32759"
+    string(5) "30711"
     ["error_reporting4"]=>
-    string(5) "32759"
+    string(5) "30711"
   }
   ["true or false"]=>
   array(8) {
diff --git a/ext/standard/tests/general_functions/phpinfo.phpt b/ext/standard/tests/general_functions/phpinfo.phpt
index 65e439213f4c5..ac7cabd340d83 100644
--- a/ext/standard/tests/general_functions/phpinfo.phpt
+++ b/ext/standard/tests/general_functions/phpinfo.phpt
@@ -16,14 +16,14 @@ phpinfo()
 PHP Version => %s
 
 System => %s
-Build Date => %s%a
+Build Date => %r(.+?)%r
 Configure Command => %s
 Server API => Command Line Interface
 Virtual Directory Support => %s
 Configuration File (php.ini) Path => %s
-Loaded Configuration File => %a
-Scan this dir for additional .ini files => %a
-Additional .ini files parsed => %a
+Loaded Configuration File => %r(.+?)%r
+Scan this dir for additional .ini files => %r(.+?)%r
+Additional .ini files parsed => %r(.+?)%r
 PHP API => %d
 PHP Extension => %d
 Zend Extension => %d
@@ -31,7 +31,7 @@ Zend Extension Build => API%s
 PHP Extension Build => API%s
 PHP Integer Size => %d bits
 Debug Build => %s
-Thread Safety => %s%A
+Thread Safety => %r(.+?)%r
 Zend Signal Handling => %s
 Zend Memory Manager => %s
 Zend Multibyte Support => %s
@@ -43,22 +43,22 @@ Registered PHP Streams => %s
 Registered Stream Socket Transports => %s
 Registered Stream Filters => %s
 
-%a
+%r(.+?)%r
  _______________________________________________________________________
 
 
 Configuration
-%A
+%r(.*?)%r
 Core
-%A
+%r(.*?)%r
 Additional Modules
-%A
+%r(.*?)%r
 Environment
-%A
+%r(.*?)%r
 PHP Variables
-%A
+%r(.*?)%r
 PHP License
-%A
+%r(.*?)%r
 bool(true)
 --
 phpinfo()
@@ -67,5 +67,5 @@ bool(true)
 phpinfo()
 
 PHP License
-%a
+%r(.+?)%r
 bool(true)
diff --git a/ext/standard/tests/http/gh15650.phpt b/ext/standard/tests/http/gh15650.phpt
new file mode 100644
index 0000000000000..239e0c85164cc
--- /dev/null
+++ b/ext/standard/tests/http/gh15650.phpt
@@ -0,0 +1,36 @@
+--TEST--
+GH-15650: http_build_query() with enum
+--FILE--
+ E1::C, 'e2' => E2::C]), "\n";
+
+try {
+    echo http_build_query(['e3' => E3::C]);
+} catch (Throwable $e) {
+    echo get_class($e), ': ', $e->getMessage(), "\n";
+}
+
+try {
+    echo http_build_query(E1::C);
+} catch (Throwable $e) {
+    echo get_class($e), ': ', $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+e1=hello+world%21&e2=42
+ValueError: Unbacked enum E3 cannot be converted to a string
+TypeError: http_build_query(): Argument #1 ($data) must be of type array, E1 given
diff --git a/ext/standard/tests/serialize/gh15169.phpt b/ext/standard/tests/serialize/gh15169.phpt
new file mode 100644
index 0000000000000..9249a593fbb20
--- /dev/null
+++ b/ext/standard/tests/serialize/gh15169.phpt
@@ -0,0 +1,35 @@
+--TEST--
+GH-15169 (stack overflow when var serialization in ext/standard/var)
+--SKIPIF--
+
+--INI--
+zend.max_allowed_stack_size=512K
+--FILE--
+next = $newNode;
+    $node = $newNode;
+}
+
+try {
+    serialize($firstNode);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--EXPECTF--
+Maximum call stack size of %d bytes (zend.max_allowed_stack_size - zend.reserved_stack_size) reached. Infinite recursion?
diff --git a/ext/standard/tests/streams/gh15908.phpt b/ext/standard/tests/streams/gh15908.phpt
new file mode 100644
index 0000000000000..31714b20530af
--- /dev/null
+++ b/ext/standard/tests/streams/gh15908.phpt
@@ -0,0 +1,38 @@
+--TEST--
+GH-15908 (leak / assertion failure in streams.c)
+--CREDITS--
+YuanchengJiang
+LuMingYinDetect
+--FILE--
+s++ == 0)
+            return "a\nbb\ncc";
+        return "";
+    }
+    function stream_eof() {
+        return $this->s >= 2;
+    }
+}
+touch(__DIR__."/gh15908.tmp");
+stream_wrapper_register("test", "TestStream");
+$f = fopen("test://", "r");
+try {
+    file_put_contents(__DIR__."/gh15908.tmp", $f, FILE_USE_INCLUDE_PATH, $f);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+?>
+--CLEAN--
+
+--EXPECT--
+file_put_contents(): supplied resource is not a valid Stream-Context resource
diff --git a/ext/standard/tests/streams/gh15937.phpt b/ext/standard/tests/streams/gh15937.phpt
new file mode 100644
index 0000000000000..db0564342b13b
--- /dev/null
+++ b/ext/standard/tests/streams/gh15937.phpt
@@ -0,0 +1,16 @@
+--TEST--
+GH-15937 (stream overflow on timeout setting)
+--SKIPIF--
+
+--FILE--
+ [
+        'timeout' => PHP_INT_MAX,
+    ],
+];
+$ctx = stream_context_create($config);
+var_dump(fopen("http://www.example.com", "r", false, $ctx));
+?>
+--EXPECTF--
+resource(%d) of type (stream)
diff --git a/ext/standard/tests/streams/gh15980.phpt b/ext/standard/tests/streams/gh15980.phpt
new file mode 100644
index 0000000000000..7a9d8364a90ae
--- /dev/null
+++ b/ext/standard/tests/streams/gh15980.phpt
@@ -0,0 +1,12 @@
+--TEST--
+GH-15980 (Signed integer overflow in main/streams/streams.c)
+--FILE--
+ 1);
+?>
+--EXPECT--
+bool(true)
diff --git a/ext/standard/tests/strings/bug55674.phpt b/ext/standard/tests/strings/bug55674.phpt
index 72ece642a73df..60572e71b3a5a 100644
--- a/ext/standard/tests/strings/bug55674.phpt
+++ b/ext/standard/tests/strings/bug55674.phpt
@@ -2,10 +2,10 @@
 Bug #55674 (fgetcsv & str_getcsv skip empty fields in some tab-separated records)
 --FILE--
 
 --EXPECT--
 array(3) {
diff --git a/ext/standard/tests/strings/bug65947.phpt b/ext/standard/tests/strings/bug65947.phpt
index 0bd50cf1dc628..1df0e004a7695 100644
--- a/ext/standard/tests/strings/bug65947.phpt
+++ b/ext/standard/tests/strings/bug65947.phpt
@@ -5,7 +5,7 @@ Bug #65947 (basename is no more working after fgetcsv in certain situation)
 $filename = 'test.toto';
 // é in ISO-8859-1
 $csv = base64_decode('6Q==');
-$adata = str_getcsv($csv,";");
+$adata = str_getcsv($csv,";", escape: '');
 $b2 = basename($filename);
 if ($filename != $b2)
     print "BUG";
diff --git a/ext/standard/tests/strings/gh11982.phpt b/ext/standard/tests/strings/gh11982.phpt
index 9b500a63c93cb..e5e45e7e19684 100644
--- a/ext/standard/tests/strings/gh11982.phpt
+++ b/ext/standard/tests/strings/gh11982.phpt
@@ -2,9 +2,9 @@
 GH-11982 (str_getcsv returns null byte for unterminated quoted string)
 --FILE--
 
 --EXPECT--
 array(1) {
diff --git a/ext/standard/tests/strings/gh12151.phpt b/ext/standard/tests/strings/gh12151.phpt
index dfbe3facde3ee..6a21f205c83fd 100644
--- a/ext/standard/tests/strings/gh12151.phpt
+++ b/ext/standard/tests/strings/gh12151.phpt
@@ -3,14 +3,13 @@ GH-12151 (str_getcsv ending with escape zero segfualt)
 --FILE--
 
---EXPECTF--
-Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
+--EXPECT--
 array (
   0 => '' . "\0" . '',
 )
-Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
 array (
   0 => '' . "\0" . '',
   1 => '' . "\0" . '',
diff --git a/ext/standard/tests/strings/gh15613.phpt b/ext/standard/tests/strings/gh15613.phpt
new file mode 100644
index 0000000000000..8f40ee820c9a2
--- /dev/null
+++ b/ext/standard/tests/strings/gh15613.phpt
@@ -0,0 +1,25 @@
+--TEST--
+GH-15613 overflow on hex strings repeater value
+--SKIPIF--
+
+--INI--
+memory_limit=-1
+--FILE--
+getMessage() . PHP_EOL;
+}
+
+try {
+	unpack('H2147483647', str_repeat('X', 2**31 + 10));
+} catch (\ValueError $e) {
+	echo $e->getMessage();
+}
+?>
+--EXPECTF--
+unpack(): Argument #1 ($format) repeater must be less than or equal to %d
+unpack(): Argument #1 ($format) repeater must be less than or equal to %d
diff --git a/ext/standard/tests/oss_fuzz_57392.phpt b/ext/standard/tests/strings/oss_fuzz_57392.phpt
similarity index 94%
rename from ext/standard/tests/oss_fuzz_57392.phpt
rename to ext/standard/tests/strings/oss_fuzz_57392.phpt
index 5a7e5b28d1caa..42e551d651038 100644
--- a/ext/standard/tests/oss_fuzz_57392.phpt
+++ b/ext/standard/tests/strings/oss_fuzz_57392.phpt
@@ -6,6 +6,7 @@ var_dump(str_getcsv(
     "aaaaaaaaaaaa\0  ",
     "\0",
     "\0",
+    escape: '',
 ));
 ?>
 --EXPECT--
diff --git a/ext/standard/tests/strings/str_getcsv_001.phpt b/ext/standard/tests/strings/str_getcsv_001.phpt
index 795ce042b27be..3c8f36c686e0f 100644
--- a/ext/standard/tests/strings/str_getcsv_001.phpt
+++ b/ext/standard/tests/strings/str_getcsv_001.phpt
@@ -4,13 +4,13 @@ str_getcsv(): Testing using various arguments
 
@@ -57,8 +57,6 @@ array(2) {
   string(3) "bar"
 }
 -----
-
-Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
 array(3) {
   [0]=>
   string(2) "f."
@@ -68,8 +66,6 @@ array(3) {
   string(4) "-|-."
 }
 -----
-
-Deprecated: str_getcsv(): Passing a non-empty string to the $escape parameter is deprecated since 8.4 in %s on line %d
 array(1) {
   [0]=>
   string(7) "foo.bar"
diff --git a/ext/standard/type.c b/ext/standard/type.c
index 4f3950e278463..4557014ff5a33 100644
--- a/ext/standard/type.c
+++ b/ext/standard/type.c
@@ -15,7 +15,6 @@
 */
 
 #include "php.h"
-#include "php_incomplete_class.h"
 
 /* {{{ Returns the type of the variable */
 PHP_FUNCTION(gettype)
diff --git a/ext/standard/url.c b/ext/standard/url.c
index 093650bf991b9..7d564b510bc9f 100644
--- a/ext/standard/url.c
+++ b/ext/standard/url.c
@@ -49,31 +49,19 @@ PHPAPI void php_url_free(php_url *theurl)
 }
 /* }}} */
 
-/* {{{ php_replace_controlchars_ex */
-PHPAPI char *php_replace_controlchars_ex(char *str, size_t len)
+static void php_replace_controlchars(char *str, size_t len)
 {
 	unsigned char *s = (unsigned char *)str;
 	unsigned char *e = (unsigned char *)str + len;
 
-	if (!str) {
-		return (NULL);
-	}
+	ZEND_ASSERT(str != NULL);
 
 	while (s < e) {
-
 		if (iscntrl(*s)) {
 			*s='_';
 		}
 		s++;
 	}
-
-	return (str);
-}
-/* }}} */
-
-PHPAPI char *php_replace_controlchars(char *str)
-{
-	return php_replace_controlchars_ex(str, strlen(str));
 }
 
 PHPAPI php_url *php_url_parse(char const *str)
@@ -133,7 +121,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
 
 		if (e + 1 == ue) { /* only scheme is available */
 			ret->scheme = zend_string_init(s, (e - s), 0);
-			php_replace_controlchars_ex(ZSTR_VAL(ret->scheme), ZSTR_LEN(ret->scheme));
+			php_replace_controlchars(ZSTR_VAL(ret->scheme), ZSTR_LEN(ret->scheme));
 			return ret;
 		}
 
@@ -155,13 +143,13 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
 			}
 
 			ret->scheme = zend_string_init(s, (e-s), 0);
-			php_replace_controlchars_ex(ZSTR_VAL(ret->scheme), ZSTR_LEN(ret->scheme));
+			php_replace_controlchars(ZSTR_VAL(ret->scheme), ZSTR_LEN(ret->scheme));
 
 			s = e + 1;
 			goto just_path;
 		} else {
 			ret->scheme = zend_string_init(s, (e-s), 0);
-			php_replace_controlchars_ex(ZSTR_VAL(ret->scheme), ZSTR_LEN(ret->scheme));
+			php_replace_controlchars(ZSTR_VAL(ret->scheme), ZSTR_LEN(ret->scheme));
 
 			if (e + 2 < ue && *(e + 2) == '/') {
 				s = e + 3;
@@ -227,14 +215,14 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
 	if ((p = zend_memrchr(s, '@', (e-s)))) {
 		if ((pp = memchr(s, ':', (p-s)))) {
 			ret->user = zend_string_init(s, (pp-s), 0);
-			php_replace_controlchars_ex(ZSTR_VAL(ret->user), ZSTR_LEN(ret->user));
+			php_replace_controlchars(ZSTR_VAL(ret->user), ZSTR_LEN(ret->user));
 
 			pp++;
 			ret->pass = zend_string_init(pp, (p-pp), 0);
-			php_replace_controlchars_ex(ZSTR_VAL(ret->pass), ZSTR_LEN(ret->pass));
+			php_replace_controlchars(ZSTR_VAL(ret->pass), ZSTR_LEN(ret->pass));
 		} else {
 			ret->user = zend_string_init(s, (p-s), 0);
-			php_replace_controlchars_ex(ZSTR_VAL(ret->user), ZSTR_LEN(ret->user));
+			php_replace_controlchars(ZSTR_VAL(ret->user), ZSTR_LEN(ret->user));
 		}
 
 		s = p + 1;
@@ -283,7 +271,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
 	}
 
 	ret->host = zend_string_init(s, (p-s), 0);
-	php_replace_controlchars_ex(ZSTR_VAL(ret->host), ZSTR_LEN(ret->host));
+	php_replace_controlchars(ZSTR_VAL(ret->host), ZSTR_LEN(ret->host));
 
 	if (e == ue) {
 		return ret;
@@ -299,7 +287,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
 		p++;
 		if (p < e) {
 			ret->fragment = zend_string_init(p, (e - p), 0);
-			php_replace_controlchars_ex(ZSTR_VAL(ret->fragment), ZSTR_LEN(ret->fragment));
+			php_replace_controlchars(ZSTR_VAL(ret->fragment), ZSTR_LEN(ret->fragment));
 		} else {
 			ret->fragment = ZSTR_EMPTY_ALLOC();
 		}
@@ -311,7 +299,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
 		p++;
 		if (p < e) {
 			ret->query = zend_string_init(p, (e - p), 0);
-			php_replace_controlchars_ex(ZSTR_VAL(ret->query), ZSTR_LEN(ret->query));
+			php_replace_controlchars(ZSTR_VAL(ret->query), ZSTR_LEN(ret->query));
 		} else {
 			ret->query = ZSTR_EMPTY_ALLOC();
 		}
@@ -320,7 +308,7 @@ PHPAPI php_url *php_url_parse_ex2(char const *str, size_t length, bool *has_port
 
 	if (s < e || s == ue) {
 		ret->path = zend_string_init(s, (e - s), 0);
-		php_replace_controlchars_ex(ZSTR_VAL(ret->path), ZSTR_LEN(ret->path));
+		php_replace_controlchars(ZSTR_VAL(ret->path), ZSTR_LEN(ret->path));
 	}
 
 	return ret;
diff --git a/ext/standard/url.h b/ext/standard/url.h
index 5ce9e756eef06..4126ee6c6db40 100644
--- a/ext/standard/url.h
+++ b/ext/standard/url.h
@@ -36,7 +36,6 @@ PHPAPI size_t php_url_decode(char *str, size_t len); /* return value: length of
 PHPAPI size_t php_raw_url_decode(char *str, size_t len); /* return value: length of decoded string */
 PHPAPI zend_string *php_url_encode(char const *s, size_t len);
 PHPAPI zend_string *php_raw_url_encode(char const *s, size_t len);
-PHPAPI char *php_replace_controlchars_ex(char *str, size_t len);
 
 #define PHP_URL_SCHEME 0
 #define PHP_URL_HOST 1
diff --git a/ext/standard/var.c b/ext/standard/var.c
index 0d08a0a338309..1c2b0eb164a1c 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -1033,6 +1033,17 @@ static void php_var_serialize_class(smart_str *buf, zval *struc, HashTable *ht,
 }
 /* }}} */
 
+static zend_always_inline bool php_serialize_check_stack_limit(void)
+{
+#ifdef ZEND_CHECK_STACK_LIMIT
+	if (UNEXPECTED(zend_call_stack_overflowed(EG(stack_limit)))) {
+		zend_call_stack_size_error();
+		return true;
+	}
+#endif
+	return false;
+}
+
 static void php_var_serialize_intern(smart_str *buf, zval *struc, php_serialize_data_t var_hash, bool in_rcn_array, bool is_root) /* {{{ */
 {
 	zend_long var_already;
@@ -1042,6 +1053,10 @@ static void php_var_serialize_intern(smart_str *buf, zval *struc, php_serialize_
 		return;
 	}
 
+	if (UNEXPECTED(php_serialize_check_stack_limit())) {
+		return;
+	}
+
 	if (var_hash && (var_already = php_add_var_hash(var_hash, struc, in_rcn_array))) {
 		if (var_already == -1) {
 			/* Reference to an object that failed to serialize, replace with null. */
diff --git a/ext/standard/versioning.c b/ext/standard/versioning.c
index aa60d97467229..6995569fbf875 100644
--- a/ext/standard/versioning.c
+++ b/ext/standard/versioning.c
@@ -77,36 +77,36 @@ php_canonicalize_version(const char *version)
 
 typedef struct {
 	const char *name;
+	uint8_t name_len;
 	int order;
 } special_forms_t;
 
-static int
-compare_special_version_forms(char *form1, char *form2)
+static int compare_special_version_forms(char *form1, char *form2)
 {
 	int found1 = -1, found2 = -1;
 	special_forms_t special_forms[11] = {
-		{"dev", 0},
-		{"alpha", 1},
-		{"a", 1},
-		{"beta", 2},
-		{"b", 2},
-		{"RC", 3},
-		{"rc", 3},
-		{"#", 4},
-		{"pl", 5},
-		{"p", 5},
-		{NULL, 0},
+		{ZEND_STRL("dev"), 0},
+		{ZEND_STRL("alpha"), 1},
+		{ZEND_STRL("a"), 1},
+		{ZEND_STRL("beta"), 2},
+		{ZEND_STRL("b"), 2},
+		{ZEND_STRL("RC"), 3},
+		{ZEND_STRL("rc"), 3},
+		{ZEND_STRL("#"), 4},
+		{ZEND_STRL("pl"), 5},
+		{ZEND_STRL("p"), 5},
+		{NULL, 0, 0},
 	};
 	special_forms_t *pp;
 
 	for (pp = special_forms; pp && pp->name; pp++) {
-		if (strncmp(form1, pp->name, strlen(pp->name)) == 0) {
+		if (strncmp(form1, pp->name, pp->name_len) == 0) {
 			found1 = pp->order;
 			break;
 		}
 	}
 	for (pp = special_forms; pp && pp->name; pp++) {
-		if (strncmp(form2, pp->name, strlen(pp->name)) == 0) {
+		if (strncmp(form2, pp->name, pp->name_len) == 0) {
 			found2 = pp->order;
 			break;
 		}
diff --git a/ext/tidy/tidy_arginfo.h b/ext/tidy/tidy_arginfo.h
index 56c0b78c32e47..b7dae788ef316 100644
--- a/ext/tidy/tidy_arginfo.h
+++ b/ext/tidy/tidy_arginfo.h
@@ -536,9 +536,7 @@ static zend_class_entry *register_class_tidy(void)
 
 	zval property_value_default_value;
 	ZVAL_NULL(&property_value_default_value);
-	zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1);
-	zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
-	zend_string_release(property_value_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_VALUE), &property_value_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING|MAY_BE_NULL));
 
 	return class_entry;
 }
@@ -552,27 +550,19 @@ static zend_class_entry *register_class_tidyNode(void)
 
 	zval property_value_default_value;
 	ZVAL_UNDEF(&property_value_default_value);
-	zend_string *property_value_name = zend_string_init("value", sizeof("value") - 1, 1);
-	zend_declare_typed_property(class_entry, property_value_name, &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_value_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_VALUE), &property_value_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_name_default_value;
 	ZVAL_UNDEF(&property_name_default_value);
-	zend_string *property_name_name = zend_string_init("name", sizeof("name") - 1, 1);
-	zend_declare_typed_property(class_entry, property_name_name, &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
-	zend_string_release(property_name_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_NAME), &property_name_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
 
 	zval property_type_default_value;
 	ZVAL_UNDEF(&property_type_default_value);
-	zend_string *property_type_name = zend_string_init("type", sizeof("type") - 1, 1);
-	zend_declare_typed_property(class_entry, property_type_name, &property_type_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(property_type_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_TYPE), &property_type_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 
 	zval property_line_default_value;
 	ZVAL_UNDEF(&property_line_default_value);
-	zend_string *property_line_name = zend_string_init("line", sizeof("line") - 1, 1);
-	zend_declare_typed_property(class_entry, property_line_name, &property_line_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(property_line_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_LINE), &property_line_default_value, ZEND_ACC_PUBLIC|ZEND_ACC_READONLY, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 
 	zval property_column_default_value;
 	ZVAL_UNDEF(&property_column_default_value);
diff --git a/ext/tokenizer/tokenizer_arginfo.h b/ext/tokenizer/tokenizer_arginfo.h
index 04b7406596130..b98a5655b6c74 100644
--- a/ext/tokenizer/tokenizer_arginfo.h
+++ b/ext/tokenizer/tokenizer_arginfo.h
@@ -84,9 +84,7 @@ static zend_class_entry *register_class_PhpToken(zend_class_entry *class_entry_S
 
 	zval property_line_default_value;
 	ZVAL_UNDEF(&property_line_default_value);
-	zend_string *property_line_name = zend_string_init("line", sizeof("line") - 1, 1);
-	zend_declare_typed_property(class_entry, property_line_name, &property_line_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
-	zend_string_release(property_line_name);
+	zend_declare_typed_property(class_entry, ZSTR_KNOWN(ZEND_STR_LINE), &property_line_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 
 	zval property_pos_default_value;
 	ZVAL_UNDEF(&property_pos_default_value);
diff --git a/ext/xml/tests/gh15868.phpt b/ext/xml/tests/gh15868.phpt
new file mode 100644
index 0000000000000..17ed80558d786
--- /dev/null
+++ b/ext/xml/tests/gh15868.phpt
@@ -0,0 +1,46 @@
+--TEST--
+GH-15868 (Assertion failure in xml_parse_into_struct after exception)
+--EXTENSIONS--
+xml
+--FILE--
+", $values, $tags);
+} catch (Error $e) {
+    echo $e->getMessage(), "\n";
+}
+
+$parser = xml_parser_create();
+xml_set_element_handler($parser,
+    function ($parser, $name, $attrs) {
+    }, function ($parser, $name) {
+        throw new Error('stop 2');
+    }
+);
+try {
+    xml_parse_into_struct($parser, "new book 
+--FILE--
+loadXML('
+    
+        Namespace "NULL":  
+        , Namespace "http://www.php.net/test":  
+         
+ 
+XML);
+
+$proc = new XSLTProcessor();
+$proc->importStyleSheet($xslDom);
+
+echo "--- Set both empty and non-empty namespace ---\n";
+
+$proc->setParameter("", "foo", "SET1");
+$proc->setParameter("http://www.php.net/test", "foo", "SET2");
+var_dump($proc->getParameter("", "foo"));
+var_dump($proc->getParameter("http://www.php.net/test", "foo"));
+
+print $proc->transformToXML($xmlDom);
+
+echo "--- Remove empty namespace entry ---\n";
+
+var_dump($proc->removeParameter("", "foo"));
+var_dump($proc->getParameter("", "foo"));
+var_dump($proc->getParameter("http://www.php.net/test", "foo"));
+
+print $proc->transformToXML($xmlDom);
+
+echo "--- Remove non-empty namespace entry ---\n";
+
+var_dump($proc->removeParameter("http://www.php.net/test", "foo"));
+var_dump($proc->getParameter("", "foo"));
+var_dump($proc->getParameter("http://www.php.net/test", "foo"));
+
+print $proc->transformToXML($xmlDom);
+
+echo "--- Set via array ---\n";
+
+$proc->setParameter("", ["foo" => "SET1"]);
+$proc->setParameter("http://www.php.net/test", ["foo" => "SET2"]);
+
+print $proc->transformToXML($xmlDom);
+
+?>
+--EXPECT--
+--- Set both empty and non-empty namespace ---
+string(4) "SET1"
+string(4) "SET2"
+
+Namespace "NULL": SET1, Namespace "http://www.php.net/test": SET2
+--- Remove empty namespace entry ---
+bool(true)
+bool(false)
+string(4) "SET2"
+
+Namespace "NULL": EMPTY, Namespace "http://www.php.net/test": SET2
+--- Remove non-empty namespace entry ---
+bool(true)
+bool(false)
+bool(false)
+
+Namespace "NULL": EMPTY, Namespace "http://www.php.net/test": EMPTY
+--- Set via array ---
+
+Namespace "NULL": SET1, Namespace "http://www.php.net/test": SET2
diff --git a/ext/xsl/tests/req30622_errors.phpt b/ext/xsl/tests/req30622_errors.phpt
new file mode 100644
index 0000000000000..75ec592305255
--- /dev/null
+++ b/ext/xsl/tests/req30622_errors.phpt
@@ -0,0 +1,59 @@
+--TEST--
+Request #30622 (XSLT: xsltProcessor->setParameter() cannot set namespace URI) - error cases
+--EXTENSIONS--
+xsl
+--CREDITS--
+Based on a test by 
+--FILE--
+setParameter("urn:x", "{urn:a}x", "");
+} catch (ValueError $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $proc->setParameter("urn:x", "a:b", "");
+} catch (ValueError $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $proc->getParameter("urn:x", "{urn:a}x");
+} catch (ValueError $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $proc->getParameter("urn:x", "a:b");
+} catch (ValueError $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $proc->removeParameter("urn:x", "{urn:a}x");
+} catch (ValueError $e) {
+    echo $e->getMessage(), "\n";
+}
+
+try {
+    $proc->removeParameter("urn:x", "a:b");
+} catch (ValueError $e) {
+    echo $e->getMessage(), "\n";
+}
+
+// Edge cases, should work
+$proc->setParameter("urn:x", ":b", "");
+$proc->setParameter("urn:x", ":", "");
+
+?>
+--EXPECT--
+XSLTProcessor::setParameter(): Argument #2 ($name) must not use clark notation when argument #1 ($namespace) is not empty
+XSLTProcessor::setParameter(): Argument #2 ($name) must not be a QName when argument #1 ($namespace) is not empty
+XSLTProcessor::getParameter(): Argument #2 ($name) must not use clark notation when argument #1 ($namespace) is not empty
+XSLTProcessor::getParameter(): Argument #2 ($name) must not be a QName when argument #1 ($namespace) is not empty
+XSLTProcessor::removeParameter(): Argument #2 ($name) must not use clark notation when argument #1 ($namespace) is not empty
+XSLTProcessor::removeParameter(): Argument #2 ($name) must not be a QName when argument #1 ($namespace) is not empty
diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c
index eaefdb2f8ef7c..ea0f9232aced4 100644
--- a/ext/xsl/xsltprocessor.c
+++ b/ext/xsl/xsltprocessor.c
@@ -549,6 +549,32 @@ PHP_METHOD(XSLTProcessor, transformToXml)
 }
 /* }}} end XSLTProcessor::transformToXml */
 
+static zend_string *xsl_create_parameter_key(uint32_t arg_num, const zend_string *namespace, zend_string *name)
+{
+	if (ZSTR_LEN(namespace) == 0) {
+		return zend_string_copy(name);
+	}
+
+	/* Clark notation already sets the namespace and we cannot have a double namespace declaration. */
+	if (ZSTR_VAL(name)[0] == '{') {
+		zend_argument_value_error(arg_num, "must not use clark notation when argument #1 ($namespace) is not empty");
+		return NULL;
+	}
+
+	/* Cannot be a QName as that would cause a namespace lookup in the document. */
+	if (ZSTR_VAL(name)[0] != ':' && strchr(ZSTR_VAL(name), ':')) {
+		zend_argument_value_error(arg_num, "must not be a QName when argument #1 ($namespace) is not empty");
+		return NULL;
+	}
+
+	zend_string *clark_str = zend_string_safe_alloc(1, ZSTR_LEN(name), 2 + ZSTR_LEN(namespace), false);
+	ZSTR_VAL(clark_str)[0] = '{';
+	memcpy(ZSTR_VAL(clark_str) + 1, ZSTR_VAL(namespace), ZSTR_LEN(namespace));
+	ZSTR_VAL(clark_str)[ZSTR_LEN(namespace) + 1] = '}';
+	memcpy(ZSTR_VAL(clark_str) + 2 + ZSTR_LEN(namespace), ZSTR_VAL(name), ZSTR_LEN(name) + 1 /* include '\0' */);
+	return clark_str;
+}
+
 /* {{{ */
 PHP_METHOD(XSLTProcessor, setParameter)
 {
@@ -557,12 +583,10 @@ PHP_METHOD(XSLTProcessor, setParameter)
 	zval *entry, new_string;
 	HashTable *array_value;
 	xsl_object *intern;
-	char *namespace;
-	size_t namespace_len;
-	zend_string *string_key, *name, *value = NULL;
+	zend_string *namespace, *string_key, *name, *value = NULL;
 
 	ZEND_PARSE_PARAMETERS_START(2, 3)
-		Z_PARAM_STRING(namespace, namespace_len)
+		Z_PARAM_PATH_STR(namespace)
 		Z_PARAM_ARRAY_HT_OR_STR(array_value, name)
 		Z_PARAM_OPTIONAL
 		Z_PARAM_PATH_STR_OR_NULL(value)
@@ -590,19 +614,27 @@ PHP_METHOD(XSLTProcessor, setParameter)
 				RETURN_THROWS();
 			}
 
+			zend_string *ht_key = xsl_create_parameter_key(2, namespace, string_key);
+			if (!ht_key) {
+				RETURN_THROWS();
+			}
+
 			str = zval_try_get_string(entry);
 			if (UNEXPECTED(!str)) {
+				zend_string_release_ex(ht_key, false);
 				RETURN_THROWS();
 			}
 
 			if (UNEXPECTED(CHECK_NULL_PATH(ZSTR_VAL(str), ZSTR_LEN(str)))) {
 				zend_string_release(str);
+				zend_string_release_ex(ht_key, false);
 				zend_argument_value_error(3, "must not contain values with any null bytes");
 				RETURN_THROWS();
 			}
 
 			ZVAL_STR(&tmp, str);
-			zend_hash_update(intern->parameter, string_key, &tmp);
+			zend_hash_update(intern->parameter, ht_key, &tmp);
+			zend_string_release_ex(ht_key, false);
 		} ZEND_HASH_FOREACH_END();
 		RETURN_TRUE;
 	} else {
@@ -616,9 +648,15 @@ PHP_METHOD(XSLTProcessor, setParameter)
 			RETURN_THROWS();
 		}
 
+		zend_string *key = xsl_create_parameter_key(2, namespace, name);
+		if (!key) {
+			RETURN_THROWS();
+		}
+
 		ZVAL_STR_COPY(&new_string, value);
 
-		zend_hash_update(intern->parameter, name, &new_string);
+		zend_hash_update(intern->parameter, key, &new_string);
+		zend_string_release_ex(key, false);
 		RETURN_TRUE;
 	}
 }
@@ -628,17 +666,21 @@ PHP_METHOD(XSLTProcessor, setParameter)
 PHP_METHOD(XSLTProcessor, getParameter)
 {
 	zval *id = ZEND_THIS;
-	char *namespace;
-	size_t namespace_len = 0;
 	zval *value;
-	zend_string *name;
+	zend_string *namespace, *name;
 	xsl_object *intern;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "sS", &namespace, &namespace_len, &name) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "PP", &namespace, &name) == FAILURE) {
+		RETURN_THROWS();
+	}
+	zend_string *key = xsl_create_parameter_key(2, namespace, name);
+	if (!key) {
 		RETURN_THROWS();
 	}
 	intern = Z_XSL_P(id);
-	if ((value = zend_hash_find(intern->parameter, name)) != NULL) {
+	value = zend_hash_find(intern->parameter, key);
+	zend_string_release_ex(key, false);
+	if (value != NULL) {
 		RETURN_STR_COPY(Z_STR_P(value));
 	} else {
 		RETURN_FALSE;
@@ -650,20 +692,23 @@ PHP_METHOD(XSLTProcessor, getParameter)
 PHP_METHOD(XSLTProcessor, removeParameter)
 {
 	zval *id = ZEND_THIS;
-	size_t namespace_len = 0;
-	char *namespace;
-	zend_string *name;
+	zend_string *namespace, *name;
 	xsl_object *intern;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "sS", &namespace, &namespace_len, &name) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "PP", &namespace, &name) == FAILURE) {
+		RETURN_THROWS();
+	}
+	zend_string *key = xsl_create_parameter_key(2, namespace, name);
+	if (!key) {
 		RETURN_THROWS();
 	}
 	intern = Z_XSL_P(id);
-	if (zend_hash_del(intern->parameter, name) == SUCCESS) {
-		RETURN_TRUE;
+	if (zend_hash_del(intern->parameter, key) == SUCCESS) {
+		RETVAL_TRUE;
 	} else {
-		RETURN_FALSE;
+		RETVAL_FALSE;
 	}
+	zend_string_release_ex(key, false);
 }
 /* }}} end XSLTProcessor::removeParameter */
 
diff --git a/ext/zend_test/fiber.c b/ext/zend_test/fiber.c
index 30dbfa06e5bdc..199d1b28b8cd6 100644
--- a/ext/zend_test/fiber.c
+++ b/ext/zend_test/fiber.c
@@ -91,6 +91,7 @@ static ZEND_STACK_ALIGNED void zend_test_fiber_execute(zend_fiber_transfer *tran
 		execute_data = (zend_execute_data *) stack->top;
 
 		memset(execute_data, 0, sizeof(zend_execute_data));
+		execute_data->func = (zend_function *) &zend_pass_function;
 
 		EG(current_execute_data) = execute_data;
 		EG(jit_trace_num) = 0;
@@ -352,4 +353,5 @@ void zend_test_fiber_init(void)
 	zend_test_fiber_handlers = std_object_handlers;
 	zend_test_fiber_handlers.dtor_obj = zend_test_fiber_object_destroy;
 	zend_test_fiber_handlers.free_obj = zend_test_fiber_object_free;
+	zend_test_fiber_handlers.clone_obj = NULL;
 }
diff --git a/ext/zend_test/observer.c b/ext/zend_test/observer.c
index 37bbdbbd3c8f5..d413450bf9dec 100644
--- a/ext/zend_test/observer.c
+++ b/ext/zend_test/observer.c
@@ -288,7 +288,7 @@ static void zend_test_execute_internal(zend_execute_data *execute_data, zval *re
 		} else {
 			php_printf("%*s\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->common.function_name));
 		}
-	} else {
+	} else if (ZEND_USER_CODE(fbc->type)) {
 		php_printf("%*s\n", 2 * ZT_G(observer_nesting_depth), "", ZSTR_VAL(fbc->op_array.filename));
 	}
 
diff --git a/ext/zend_test/test.c b/ext/zend_test/test.c
index 11fb978ef176e..37b3f7a2c5e49 100644
--- a/ext/zend_test/test.c
+++ b/ext/zend_test/test.c
@@ -1091,6 +1091,23 @@ static ZEND_METHOD(_ZendTestMagicCall, __call)
 	RETURN_ARR(zend_new_pair(&name_zv, arguments));
 }
 
+static ZEND_METHOD(_ZendTestMagicCallForward, __call)
+{
+	zend_string *name;
+	zval *arguments;
+
+	ZEND_PARSE_PARAMETERS_START(2, 2)
+		Z_PARAM_STR(name)
+		Z_PARAM_ARRAY(arguments)
+	ZEND_PARSE_PARAMETERS_END();
+
+	ZEND_IGNORE_VALUE(arguments);
+
+	zval func;
+	ZVAL_STR(&func, name);
+	call_user_function(NULL, NULL, &func, return_value, 0, NULL);
+}
+
 PHP_INI_BEGIN()
 	STD_PHP_INI_BOOLEAN("zend_test.replace_zend_execute_ex", "0", PHP_INI_SYSTEM, OnUpdateBool, replace_zend_execute_ex, zend_zend_test_globals, zend_test_globals)
 	STD_PHP_INI_BOOLEAN("zend_test.register_passes", "0", PHP_INI_SYSTEM, OnUpdateBool, register_passes, zend_zend_test_globals, zend_test_globals)
@@ -1280,6 +1297,8 @@ PHP_MINIT_FUNCTION(zend_test)
 
 	zend_test_magic_call = register_class__ZendTestMagicCall();
 
+	register_class__ZendTestMagicCallForward();
+
 	zend_register_functions(NULL, ext_function_legacy, NULL, EG(current_module)->type);
 
 	// Loading via dl() not supported with the observer API
@@ -1335,11 +1354,7 @@ PHP_RINIT_FUNCTION(zend_test)
 
 PHP_RSHUTDOWN_FUNCTION(zend_test)
 {
-	zend_ulong obj_key;
-	ZEND_HASH_FOREACH_NUM_KEY(&ZT_G(global_weakmap), obj_key) {
-		zend_weakrefs_hash_del(&ZT_G(global_weakmap), zend_weakref_key_to_object(obj_key));
-	} ZEND_HASH_FOREACH_END();
-	zend_hash_destroy(&ZT_G(global_weakmap));
+	zend_weakrefs_hash_destroy(&ZT_G(global_weakmap));
 
 	if (ZT_G(zend_test_heap))  {
 		free(ZT_G(zend_test_heap));
diff --git a/ext/zend_test/test.stub.php b/ext/zend_test/test.stub.php
index bb00bbd2c9b56..407c0f344ab1e 100644
--- a/ext/zend_test/test.stub.php
+++ b/ext/zend_test/test.stub.php
@@ -75,6 +75,11 @@ class _ZendTestMagicCall
         public function __call(string $name, array $args): mixed {}
     }
 
+    class _ZendTestMagicCallForward
+    {
+        public function __call(string $name, array $args): mixed {}
+    }
+
     class _ZendTestChildClass extends _ZendTestClass
     {
         public function returnsThrowable(): Exception {}
diff --git a/ext/zend_test/test_arginfo.h b/ext/zend_test/test_arginfo.h
index 8207182ff9277..e660a49b4a785 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 the .stub.php file instead.
- * Stub hash: 470b6d507911cf05279de3557df03831858dd8c1 */
+ * Stub hash: 5ba6aceffff4e81330182eb84014928630fc9cdd */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0)
 ZEND_END_ARG_INFO()
@@ -204,6 +204,8 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class__ZendTestMagicCall___call,
 	ZEND_ARG_TYPE_INFO(0, args, IS_ARRAY, 0)
 ZEND_END_ARG_INFO()
 
+#define arginfo_class__ZendTestMagicCallForward___call arginfo_class__ZendTestMagicCall___call
+
 ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class__ZendTestChildClass_returnsThrowable, 0, 0, Exception, 0)
 ZEND_END_ARG_INFO()
 
@@ -307,6 +309,7 @@ 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);
@@ -457,6 +460,11 @@ static const zend_function_entry class__ZendTestMagicCall_methods[] = {
 	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
@@ -732,6 +740,20 @@ static zend_class_entry *register_class__ZendTestMagicCall(void)
 	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;
diff --git a/ext/zend_test/tests/gh16230.phpt b/ext/zend_test/tests/gh16230.phpt
new file mode 100644
index 0000000000000..0d056e3d52a22
--- /dev/null
+++ b/ext/zend_test/tests/gh16230.phpt
@@ -0,0 +1,22 @@
+--TEST--
+GH-16230: Segfault on debug_backtrace() inside _ZendTestFiber
+--EXTENSIONS--
+zend_test
+--FILE--
+start();
+?>
+--EXPECTF--
+array(1) {
+  [0]=>
+  array(2) {
+    ["function"]=>
+    string(%d) "{closure:%s:%d}"
+    ["args"]=>
+    array(0) {
+    }
+  }
+}
diff --git a/ext/zend_test/tests/gh16233.phpt b/ext/zend_test/tests/gh16233.phpt
new file mode 100644
index 0000000000000..e3143b6c7ce11
--- /dev/null
+++ b/ext/zend_test/tests/gh16233.phpt
@@ -0,0 +1,32 @@
+--TEST--
+GH-16233 (Observer segfault when calling user function in internal function via trampoline)
+--EXTENSIONS--
+zend_test
+--INI--
+zend_test.observer.enabled=1
+zend_test.observer.show_output=1
+zend_test.observer.observe_all=1
+--FILE--
+callee();
+echo "done\n";
+
+?>
+--EXPECTF--
+
+
+  
+  <_ZendTestMagicCallForward::__call>
+    
+    
+in callee
+     
+  
+done
+ 
diff --git a/ext/zend_test/tests/gh16294.phpt b/ext/zend_test/tests/gh16294.phpt
new file mode 100644
index 0000000000000..1a85586d1def0
--- /dev/null
+++ b/ext/zend_test/tests/gh16294.phpt
@@ -0,0 +1,16 @@
+--TEST--
+GH-16294: Segfault in test observer on zend_pass_function
+--EXTENSIONS--
+zend_test
+--INI--
+zend_test.observer.execute_internal=1
+--FILE--
+
+===DONE===
+--EXPECT--
+===DONE===
diff --git a/ext/zend_test/tests/gh16388.phpt b/ext/zend_test/tests/gh16388.phpt
new file mode 100644
index 0000000000000..521171f756c44
--- /dev/null
+++ b/ext/zend_test/tests/gh16388.phpt
@@ -0,0 +1,12 @@
+--TEST--
+GH-16388 (UB when freeing a cloned _ZendTestFiber)
+--EXTENSIONS--
+zend_test
+--FILE--
+
+--EXPECTF--
+Fatal error: Uncaught Error: Trying to clone an uncloneable object of class _ZendTestFiber in %s:%d
+%A
diff --git a/ext/zend_test/tests/observer_error_04.phpt b/ext/zend_test/tests/observer_error_04.phpt
index bb3ee1013ec47..2a45bfe78c48d 100644
--- a/ext/zend_test/tests/observer_error_04.phpt
+++ b/ext/zend_test/tests/observer_error_04.phpt
@@ -47,9 +47,9 @@ echo 'Done.' . PHP_EOL;
   
   
   
-  
-SOAP-ERROR: Parsing WSDL: Couldn't load from 'foo' : failed to load external entity "foo"
+SOAP-ERROR: Parsing WSDL: %s
 
 Done.
 
diff --git a/ext/zend_test/tests/observer_fiber_functions_03.phpt b/ext/zend_test/tests/observer_fiber_functions_03.phpt
index 7c61067ab71a2..8e267ea65a037 100644
--- a/ext/zend_test/tests/observer_fiber_functions_03.phpt
+++ b/ext/zend_test/tests/observer_fiber_functions_03.phpt
@@ -10,6 +10,10 @@ zend_test.observer.fiber_init=1
 zend_test.observer.fiber_switch=1
 zend_test.observer.fiber_destroy=1
 memory_limit=100M
+--SKIPIF--
+
 --FILE--
 args[1].value, &attribute_Deprecated_func_zip_open_0_arg1);
 	attribute_Deprecated_func_zip_open_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_zip_close_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_close", sizeof("zip_close") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_zip_close_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_close", sizeof("zip_close") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_zip_close_0_arg0;
 	zend_string *attribute_Deprecated_func_zip_close_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_zip_close_0_arg0, attribute_Deprecated_func_zip_close_0_arg0_str);
@@ -488,7 +488,7 @@ static void register_php_zip_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_zip_close_0->args[1].value, &attribute_Deprecated_func_zip_close_0_arg1);
 	attribute_Deprecated_func_zip_close_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_zip_read_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_read", sizeof("zip_read") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_zip_read_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_read", sizeof("zip_read") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_zip_read_0_arg0;
 	zend_string *attribute_Deprecated_func_zip_read_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_zip_read_0_arg0, attribute_Deprecated_func_zip_read_0_arg0_str);
@@ -500,21 +500,21 @@ static void register_php_zip_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_zip_read_0->args[1].value, &attribute_Deprecated_func_zip_read_0_arg1);
 	attribute_Deprecated_func_zip_read_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_zip_entry_open_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_open", sizeof("zip_entry_open") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_zip_entry_open_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_open", sizeof("zip_entry_open") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_zip_entry_open_0_arg0;
 	zend_string *attribute_Deprecated_func_zip_entry_open_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_zip_entry_open_0_arg0, attribute_Deprecated_func_zip_entry_open_0_arg0_str);
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_zip_entry_open_0->args[0].value, &attribute_Deprecated_func_zip_entry_open_0_arg0);
 	attribute_Deprecated_func_zip_entry_open_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
 
-	zend_attribute *attribute_Deprecated_func_zip_entry_close_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_close", sizeof("zip_entry_close") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_func_zip_entry_close_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_close", sizeof("zip_entry_close") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_func_zip_entry_close_0_arg0;
 	zend_string *attribute_Deprecated_func_zip_entry_close_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_zip_entry_close_0_arg0, attribute_Deprecated_func_zip_entry_close_0_arg0_str);
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_zip_entry_close_0->args[0].value, &attribute_Deprecated_func_zip_entry_close_0_arg0);
 	attribute_Deprecated_func_zip_entry_close_0->args[0].name = ZSTR_KNOWN(ZEND_STR_SINCE);
 
-	zend_attribute *attribute_Deprecated_func_zip_entry_read_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_read", sizeof("zip_entry_read") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_zip_entry_read_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_read", sizeof("zip_entry_read") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_zip_entry_read_0_arg0;
 	zend_string *attribute_Deprecated_func_zip_entry_read_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_zip_entry_read_0_arg0, attribute_Deprecated_func_zip_entry_read_0_arg0_str);
@@ -526,7 +526,7 @@ static void register_php_zip_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_zip_entry_read_0->args[1].value, &attribute_Deprecated_func_zip_entry_read_0_arg1);
 	attribute_Deprecated_func_zip_entry_read_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_zip_entry_name_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_name", sizeof("zip_entry_name") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_zip_entry_name_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_name", sizeof("zip_entry_name") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_zip_entry_name_0_arg0;
 	zend_string *attribute_Deprecated_func_zip_entry_name_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_zip_entry_name_0_arg0, attribute_Deprecated_func_zip_entry_name_0_arg0_str);
@@ -538,7 +538,7 @@ static void register_php_zip_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_zip_entry_name_0->args[1].value, &attribute_Deprecated_func_zip_entry_name_0_arg1);
 	attribute_Deprecated_func_zip_entry_name_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_zip_entry_compressedsize_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_compressedsize", sizeof("zip_entry_compressedsize") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_zip_entry_compressedsize_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_compressedsize", sizeof("zip_entry_compressedsize") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_zip_entry_compressedsize_0_arg0;
 	zend_string *attribute_Deprecated_func_zip_entry_compressedsize_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_zip_entry_compressedsize_0_arg0, attribute_Deprecated_func_zip_entry_compressedsize_0_arg0_str);
@@ -550,7 +550,7 @@ static void register_php_zip_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_zip_entry_compressedsize_0->args[1].value, &attribute_Deprecated_func_zip_entry_compressedsize_0_arg1);
 	attribute_Deprecated_func_zip_entry_compressedsize_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_zip_entry_filesize_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_filesize", sizeof("zip_entry_filesize") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_zip_entry_filesize_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_filesize", sizeof("zip_entry_filesize") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_zip_entry_filesize_0_arg0;
 	zend_string *attribute_Deprecated_func_zip_entry_filesize_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_zip_entry_filesize_0_arg0, attribute_Deprecated_func_zip_entry_filesize_0_arg0_str);
@@ -562,7 +562,7 @@ static void register_php_zip_symbols(int module_number)
 	ZVAL_COPY_VALUE(&attribute_Deprecated_func_zip_entry_filesize_0->args[1].value, &attribute_Deprecated_func_zip_entry_filesize_0_arg1);
 	attribute_Deprecated_func_zip_entry_filesize_0->args[1].name = ZSTR_KNOWN(ZEND_STR_MESSAGE);
 
-	zend_attribute *attribute_Deprecated_func_zip_entry_compressionmethod_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_compressionmethod", sizeof("zip_entry_compressionmethod") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED), 2);
+	zend_attribute *attribute_Deprecated_func_zip_entry_compressionmethod_0 = zend_add_function_attribute(zend_hash_str_find_ptr(CG(function_table), "zip_entry_compressionmethod", sizeof("zip_entry_compressionmethod") - 1), ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 2);
 	zval attribute_Deprecated_func_zip_entry_compressionmethod_0_arg0;
 	zend_string *attribute_Deprecated_func_zip_entry_compressionmethod_0_arg0_str = zend_string_init("8.0", strlen("8.0"), 1);
 	ZVAL_STR(&attribute_Deprecated_func_zip_entry_compressionmethod_0_arg0, attribute_Deprecated_func_zip_entry_compressionmethod_0_arg0_str);
@@ -1056,6 +1056,14 @@ static zend_class_entry *register_class_ZipArchive(zend_class_entry *class_entry
 	zend_declare_typed_class_constant(class_entry, const_ER_NOT_ALLOWED_name, &const_ER_NOT_ALLOWED_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
 	zend_string_release(const_ER_NOT_ALLOWED_name);
 #endif
+#if defined(ZIP_ER_TRUNCATED_ZIP)
+
+	zval const_ER_TRUNCATED_ZIP_value;
+	ZVAL_LONG(&const_ER_TRUNCATED_ZIP_value, ZIP_ER_TRUNCATED_ZIP);
+	zend_string *const_ER_TRUNCATED_ZIP_name = zend_string_init_interned("ER_TRUNCATED_ZIP", sizeof("ER_TRUNCATED_ZIP") - 1, 1);
+	zend_declare_typed_class_constant(class_entry, const_ER_TRUNCATED_ZIP_name, &const_ER_TRUNCATED_ZIP_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_LONG));
+	zend_string_release(const_ER_TRUNCATED_ZIP_name);
+#endif
 #if defined(ZIP_AFL_RDONLY)
 
 	zval const_AFL_RDONLY_value;
@@ -1358,7 +1366,7 @@ static zend_class_entry *register_class_ZipArchive(zend_class_entry *class_entry
 
 #if defined(ZIP_FL_RECOMPRESS)
 
-	zend_attribute *attribute_Deprecated_const_FL_RECOMPRESS_0 = zend_add_class_constant_attribute(class_entry, const_FL_RECOMPRESS, ZSTR_KNOWN(ZEND_STR_DEPRECATED), 1);
+	zend_attribute *attribute_Deprecated_const_FL_RECOMPRESS_0 = zend_add_class_constant_attribute(class_entry, const_FL_RECOMPRESS, ZSTR_KNOWN(ZEND_STR_DEPRECATED_CAPITALIZED), 1);
 	zval attribute_Deprecated_const_FL_RECOMPRESS_0_arg0;
 	zend_string *attribute_Deprecated_const_FL_RECOMPRESS_0_arg0_str = zend_string_init("8.3", strlen("8.3"), 1);
 	ZVAL_STR(&attribute_Deprecated_const_FL_RECOMPRESS_0_arg0, attribute_Deprecated_const_FL_RECOMPRESS_0_arg0_str);
diff --git a/ext/zlib/tests/gh16326.phpt b/ext/zlib/tests/gh16326.phpt
new file mode 100644
index 0000000000000..b4997368549f7
--- /dev/null
+++ b/ext/zlib/tests/gh16326.phpt
@@ -0,0 +1,26 @@
+--TEST--
+GH-16326 (Memory management is broken for bad dictionaries)
+--EXTENSIONS--
+zlib
+--FILE--
+ [" ", ""]]);
+} catch (ValueError $ex) {
+    echo $ex->getMessage(), "\n";
+}
+try {
+    deflate_init(ZLIB_ENCODING_DEFLATE, ["dictionary" => ["hello", "wor\0ld"]]);
+} catch (ValueError $ex) {
+    echo $ex->getMessage(), "\n";
+}
+try {
+    deflate_init(ZLIB_ENCODING_DEFLATE, ["dictionary" => [" ", new stdClass]]);
+} catch (Error $ex) {
+    echo $ex->getMessage(), "\n";
+}
+?>
+--EXPECT--
+deflate_init(): Argument #2 ($options) must not contain empty strings
+deflate_init(): Argument #2 ($options) must not contain strings with null bytes
+Object of class stdClass could not be converted to string
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index 3c9f72e82bc2f..df3d270217d45 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -609,10 +609,10 @@ PHP_FUNCTION(gzfile)
 	int flags = REPORT_ERRORS;
 	char buf[8192] = {0};
 	int i = 0;
-	zend_long use_include_path = 0;
+	bool use_include_path = false;
 	php_stream *stream;
 
-	if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "p|l", &filename, &filename_len, &use_include_path)) {
+	if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS(), "p|b", &filename, &filename_len, &use_include_path)) {
 		RETURN_THROWS();
 	}
 
@@ -649,9 +649,9 @@ PHP_FUNCTION(gzopen)
 	size_t filename_len, mode_len;
 	int flags = REPORT_ERRORS;
 	php_stream *stream;
-	zend_long use_include_path = 0;
+	bool use_include_path = false;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "ps|l", &filename, &filename_len, &mode, &mode_len, &use_include_path) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "ps|b", &filename, &filename_len, &mode, &mode_len, &use_include_path) == FAILURE) {
 		RETURN_THROWS();
 	}
 
@@ -676,9 +676,9 @@ PHP_FUNCTION(readgzfile)
 	int flags = REPORT_ERRORS;
 	php_stream *stream;
 	size_t size;
-	zend_long use_include_path = 0;
+	bool use_include_path = false;
 
-	if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|l", &filename, &filename_len, &use_include_path) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "p|b", &filename, &filename_len, &use_include_path) == FAILURE) {
 		RETURN_THROWS();
 	}
 
@@ -796,67 +796,62 @@ static bool zlib_create_dictionary_string(HashTable *options, char **dict, size_
 				*dict = emalloc(ZSTR_LEN(str));
 				memcpy(*dict, ZSTR_VAL(str), ZSTR_LEN(str));
 				*dictlen = ZSTR_LEN(str);
-			} break;
+
+				return 1;
+			}
 
 			case IS_ARRAY: {
 				HashTable *dictionary = Z_ARR_P(option_buffer);
+				bool result = 1;
 
 				if (zend_hash_num_elements(dictionary) > 0) {
-					char *dictptr;
-					zval *cur;
-					zend_string **strings = emalloc(sizeof(zend_string *) * zend_hash_num_elements(dictionary));
-					zend_string **end, **ptr = strings - 1;
+					zend_string **strings = safe_emalloc(zend_hash_num_elements(dictionary), sizeof(zend_string *), 0);
+					size_t total = 0;
 
+					zval *cur;
 					ZEND_HASH_FOREACH_VAL(dictionary, cur) {
-						size_t i;
-
-						*++ptr = zval_get_string(cur);
-						if (!*ptr || ZSTR_LEN(*ptr) == 0 || EG(exception)) {
-							if (*ptr) {
-								efree(*ptr);
-							}
-							while (--ptr >= strings) {
-								efree(ptr);
-							}
-							efree(strings);
-							if (!EG(exception)) {
-								zend_argument_value_error(2, "must not contain empty strings");
-							}
-							return 0;
+						zend_string *string = zval_try_get_string(cur);
+						if (string == NULL) {
+							result = 0;
+							break;
 						}
-						for (i = 0; i < ZSTR_LEN(*ptr); i++) {
-							if (ZSTR_VAL(*ptr)[i] == 0) {
-								do {
-									efree(ptr);
-								} while (--ptr >= strings);
-								efree(strings);
-								zend_argument_value_error(2, "must not contain strings with null bytes");
-								return 0;
-							}
+						*dictlen += ZSTR_LEN(string) + 1;
+						strings[total++] = string;
+						if (ZSTR_LEN(string) == 0) {
+							result = 0;
+							zend_argument_value_error(2, "must not contain empty strings");
+							break;
+						}
+						if (zend_str_has_nul_byte(string)) {
+							result = 0;
+							zend_argument_value_error(2, "must not contain strings with null bytes");
+							break;
 						}
-
-						*dictlen += ZSTR_LEN(*ptr) + 1;
 					} ZEND_HASH_FOREACH_END();
 
-					dictptr = *dict = emalloc(*dictlen);
-					ptr = strings;
-					end = strings + zend_hash_num_elements(dictionary);
-					do {
-						memcpy(dictptr, ZSTR_VAL(*ptr), ZSTR_LEN(*ptr));
-						dictptr += ZSTR_LEN(*ptr);
+					char *dictptr = emalloc(*dictlen);
+					*dict = dictptr;
+					for (size_t i = 0; i < total; i++) {
+						zend_string *string = strings[i];
+						dictptr = zend_mempcpy(dictptr, ZSTR_VAL(string), ZSTR_LEN(string));
 						*dictptr++ = 0;
-						zend_string_release_ex(*ptr, 0);
-					} while (++ptr != end);
+						zend_string_release(string);
+					}
 					efree(strings);
+					if (!result) {
+						efree(*dict);
+						*dict = NULL;
+					}
 				}
-			} break;
+
+				return result;
+			}
 
 			default:
 				zend_argument_type_error(2, "must be of type zero-terminated string or array, %s given", zend_zval_value_name(option_buffer));
 				return 0;
 		}
 	}
-
 	return 1;
 }
 
diff --git a/ext/zlib/zlib.stub.php b/ext/zlib/zlib.stub.php
index 1083564f76505..5708d9242d3a8 100644
--- a/ext/zlib/zlib.stub.php
+++ b/ext/zlib/zlib.stub.php
@@ -169,15 +169,15 @@ function zlib_get_coding_type(): string|false {}
  * @return array|false
  * @refcount 1
  */
-function gzfile(string $filename, int $use_include_path = 0): array|false {}
+function gzfile(string $filename, bool $use_include_path = false): array|false {}
 
 /**
  * @return resource|false
  * @refcount 1
  */
-function gzopen(string $filename, string $mode, int $use_include_path = 0) {}
+function gzopen(string $filename, string $mode, bool $use_include_path = false) {}
 
-function readgzfile(string $filename, int $use_include_path = 0): int|false {}
+function readgzfile(string $filename, bool $use_include_path = false): int|false {}
 
 /** @refcount 1 */
 function zlib_encode(string $data, int $encoding, int $level = -1): string|false {}
diff --git a/ext/zlib/zlib_arginfo.h b/ext/zlib/zlib_arginfo.h
index 1b89be7ecd847..de5a538453861 100644
--- a/ext/zlib/zlib_arginfo.h
+++ b/ext/zlib/zlib_arginfo.h
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 3660ad3239f93c84b6909c36ddfcc92dd0773c70 */
+ * Stub hash: 65271ce06d23b397180a8dbbcecdb0cde5c6942b */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_ob_gzhandler, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0)
@@ -11,18 +11,18 @@ ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_gzfile, 0, 1, MAY_BE_ARRAY|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, use_include_path, IS_LONG, 0, "0")
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, use_include_path, _IS_BOOL, 0, "false")
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_gzopen, 0, 0, 2)
 	ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
 	ZEND_ARG_TYPE_INFO(0, mode, IS_STRING, 0)
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, use_include_path, IS_LONG, 0, "0")
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, use_include_path, _IS_BOOL, 0, "false")
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_readgzfile, 0, 1, MAY_BE_LONG|MAY_BE_FALSE)
 	ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
-	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, use_include_path, IS_LONG, 0, "0")
+	ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, use_include_path, _IS_BOOL, 0, "false")
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_zlib_encode, 0, 2, MAY_BE_STRING|MAY_BE_FALSE)
diff --git a/main/SAPI.c b/main/SAPI.c
index ba34f7ef63860..866b44c3eac7d 100644
--- a/main/SAPI.c
+++ b/main/SAPI.c
@@ -509,12 +509,15 @@ SAPI_API void sapi_deactivate_module(void)
 	}
 	if (SG(request_info).auth_user) {
 		efree(SG(request_info).auth_user);
+		SG(request_info).auth_user = NULL;
 	}
 	if (SG(request_info).auth_password) {
 		efree(SG(request_info).auth_password);
+		SG(request_info).auth_password = NULL;
 	}
 	if (SG(request_info).auth_digest) {
 		efree(SG(request_info).auth_digest);
+		SG(request_info).auth_digest = NULL;
 	}
 	if (SG(request_info).content_type_dup) {
 		efree(SG(request_info).content_type_dup);
diff --git a/main/debug_gdb_scripts.c b/main/debug_gdb_scripts.c
index ad03a2c2ba62f..13288fc9adc8d 100644
--- a/main/debug_gdb_scripts.c
+++ b/main/debug_gdb_scripts.c
@@ -737,6 +737,12 @@ asm(
     ".ascii \"\\n\"\n"
     ".ascii \"pp_set.add_printer('zend_string', '^_zend_string$', ZendStringPrettyPrinter)\\n\"\n"
     ".ascii \"\\n\"\n"
+    ".ascii \"def zendStringPointerPrinter(ptr):\\n\"\n"
+    ".ascii \"    \\\"Given a pointer to a zend_string, show the contents (if non-NULL)\\\"\\n\"\n"
+    ".ascii \"    if int(ptr) == 0:\\n\"\n"
+    ".ascii \"        return '0x0'\\n\"\n"
+    ".ascii \"    return ZendStringPrettyPrinter(ptr.dereference()).to_string()\\n\"\n"
+    ".ascii \"\\n\"\n"
     ".ascii \"class ZendTypePrettyPrinter(gdb.printing.PrettyPrinter):\\n\"\n"
     ".ascii \"    \\\"Print a zend_type\\\"\\n\"\n"
     ".ascii \"\\n\"\n"
@@ -959,6 +965,52 @@ asm(
     ".ascii \"\\n\"\n"
     ".ascii \"pp_set.add_printer('zval', '^_zval_struct$', ZvalPrettyPrinter)\\n\"\n"
     ".ascii \"\\n\"\n"
+    ".ascii \"class ZendClassEntryPrettyPrinter(gdb.printing.PrettyPrinter):\\n\"\n"
+    ".ascii \"    \\\"Print a zend_class_entry\\\"\\n\"\n"
+    ".ascii \"\\n\"\n"
+    ".ascii \"    # String pointers, show the string contents if possible\\n\"\n"
+    ".ascii \"    STRING_FIELDS = [ 'name', 'doc_comment' ]\\n\"\n"
+    ".ascii \"\\n\"\n"
+    ".ascii \"    def __init__(self, val):\\n\"\n"
+    ".ascii \"        self.val = val\\n\"\n"
+    ".ascii \"\\n\"\n"
+    ".ascii \"    def to_string(self):\\n\"\n"
+    ".ascii \"        return zendStringPointerPrinter(self.val['name'])\\n\"\n"
+    ".ascii \"\\n\"\n"
+    ".ascii \"    def children(self):\\n\"\n"
+    ".ascii \"        for field in self.val.type.fields():\\n\"\n"
+    ".ascii \"            if field.name is not None:\\n\"\n"
+    ".ascii \"                if field.name in self.STRING_FIELDS:\\n\"\n"
+    ".ascii \"                    yield (field.name, zendStringPointerPrinter(self.val[field.name]))\\n\"\n"
+    ".ascii \"                else:\\n\"\n"
+    ".ascii \"                    yield (field.name, self.val[field.name])\\n\"\n"
+    ".ascii \"            else:\\n\"\n"
+    ".ascii \"                # Don't break on the union fields. Unfortunately, pretty\\n\"\n"
+    ".ascii \"                # printers done in python cannot match the default formatting of\\n\"\n"
+    ".ascii \"                # C anonymous fields, which omit the name entirely, see\\n\"\n"
+    ".ascii \"                # binutils-gdb/gdb/cp-valprint.c#248 (as of commit\\n\"\n"
+    ".ascii \"                # b6532accdd8e24329cc69bb58bc2883796008776)\\n\"\n"
+    ".ascii \"                yield ('', self.val[field])\\n\"\n"
+    ".ascii \"\\n\"\n"
+    ".ascii \"pp_set.add_printer('zend_class_entry', '^_zend_class_entry$', ZendClassEntryPrettyPrinter)\\n\"\n"
+    ".ascii \"\\n\"\n"
+    ".ascii \"class ZendClassConstantPrettyPrinter(gdb.printing.PrettyPrinter):\\n\"\n"
+    ".ascii \"    \\\"Print a zend_class_constant\\\"\\n\"\n"
+    ".ascii \"\\n\"\n"
+    ".ascii \"    def __init__(self, val):\\n\"\n"
+    ".ascii \"        self.val = val\\n\"\n"
+    ".ascii \"\\n\"\n"
+    ".ascii \"    def children(self):\\n\"\n"
+    ".ascii \"        for field in self.val.type.fields():\\n\"\n"
+    ".ascii \"            if field.name == 'doc_comment':\\n\"\n"
+    ".ascii \"                yield ('doc_comment', zendStringPointerPrinter(self.val['doc_comment']))\\n\"\n"
+    ".ascii \"            elif field.name == 'ce':\\n\"\n"
+    ".ascii \"                yield ('ce', zendStringPointerPrinter(self.val['ce']['name']))\\n\"\n"
+    ".ascii \"            else:\\n\"\n"
+    ".ascii \"                yield (field.name, self.val[field.name])\\n\"\n"
+    ".ascii \"\\n\"\n"
+    ".ascii \"pp_set.add_printer('zend_class_constant', '^_zend_class_constant$', ZendClassConstantPrettyPrinter)\\n\"\n"
+    ".ascii \"\\n\"\n"
     ".ascii \"type_bit_to_name = None\\n\"\n"
     ".ascii \"type_name_to_bit = None\\n\"\n"
     ".ascii \"\\n\"\n"
@@ -971,7 +1023,7 @@ asm(
     ".ascii \"\\n\"\n"
     ".ascii \"    (symbol,_) = gdb.lookup_symbol(\\\"zend_gc_refcount\\\")\\n\"\n"
     ".ascii \"    if symbol == None:\\n\"\n"
-    ".ascii \"        raise \\\"Could not find zend_types.h: symbol zend_gc_refcount not found\\\"\\n\"\n"
+    ".ascii \"        raise Exception(\\\"Could not find zend_types.h: symbol zend_gc_refcount not found\\\")\\n\"\n"
     ".ascii \"    filename = symbol.symtab.fullname()\\n\"\n"
     ".ascii \"\\n\"\n"
     ".ascii \"    bits = {}\\n\"\n"
diff --git a/main/main.c b/main/main.c
index d31de566f48b8..0b38f303c58fc 100644
--- a/main/main.c
+++ b/main/main.c
@@ -1369,10 +1369,6 @@ static ZEND_COLD void php_error_cb(int orig_type, zend_string *error_filename, c
 				error_type_str = "Notice";
 				syslog_type_int = LOG_NOTICE;
 				break;
-			case E_STRICT:
-				error_type_str = "Strict Standards";
-				syslog_type_int = LOG_INFO;
-				break;
 			case E_DEPRECATED:
 			case E_USER_DEPRECATED:
 				error_type_str = "Deprecated";
@@ -2684,7 +2680,9 @@ PHPAPI int php_handle_auth_data(const char *auth)
 			if (pass) {
 				*pass++ = '\0';
 				SG(request_info).auth_user = estrndup(ZSTR_VAL(user), ZSTR_LEN(user));
-				SG(request_info).auth_password = estrdup(pass);
+				if (strlen(pass) > 0) {
+					SG(request_info).auth_password = estrdup(pass);
+				}
 				ret = 0;
 			}
 			zend_string_free(user);
diff --git a/main/network.c b/main/network.c
index fd2e49d79d20b..7d45cc8b78e90 100644
--- a/main/network.c
+++ b/main/network.c
@@ -207,7 +207,7 @@ PHPAPI int php_network_getaddresses(const char *host, int socktype, struct socka
 		} else {
 			php_error_docref(NULL, E_WARNING, "php_network_getaddresses: getaddrinfo for %s failed: %s", host, gai_error);
 		}
-# if PHP_WIN32
+# ifdef PHP_WIN32
 		php_win32_error_msg_free(gai_error);
 # endif
 		return 0;
diff --git a/main/php.h b/main/php.h
index 2ab4c39de5bf7..c00777a1b40a0 100644
--- a/main/php.h
+++ b/main/php.h
@@ -22,7 +22,7 @@
 #include 
 #endif
 
-#define PHP_API_VERSION 20230901
+#define PHP_API_VERSION 20240925
 #define PHP_HAVE_STREAMS
 #define YYDEBUG 0
 #define PHP_DEFAULT_CHARSET "UTF-8"
@@ -225,14 +225,6 @@ typedef unsigned int socklen_t;
 
 #include 
 
-#ifndef LONG_MAX
-#define LONG_MAX 2147483647L
-#endif
-
-#ifndef LONG_MIN
-#define LONG_MIN (- LONG_MAX - 1)
-#endif
-
 #ifndef INT_MAX
 #define INT_MAX 2147483647
 #endif
diff --git a/main/php_network.h b/main/php_network.h
index 06da95dd68ce6..0a0da4cf7084a 100644
--- a/main/php_network.h
+++ b/main/php_network.h
@@ -160,7 +160,7 @@ PHPAPI int php_poll2(php_pollfd *ufds, unsigned int nfds, int timeout);
 /* timeval-to-timeout (for poll(2)) */
 static inline int php_tvtoto(struct timeval *timeouttv)
 {
-	if (timeouttv) {
+	if (timeouttv && timeouttv->tv_sec >= 0 && timeouttv->tv_sec <= ((INT_MAX - 1000) / 1000)) {
 		return (timeouttv->tv_sec * 1000) + (timeouttv->tv_usec / 1000);
 	}
 	return -1;
diff --git a/main/php_output.h b/main/php_output.h
index 25a8d370707b5..55bf62f62237a 100644
--- a/main/php_output.h
+++ b/main/php_output.h
@@ -81,8 +81,8 @@ typedef enum _php_output_handler_hook_t {
 } php_output_handler_hook_t;
 
 #define PHP_OUTPUT_HANDLER_INITBUF_SIZE(s) \
-( ((s) > 1) ? \
-	(s) + PHP_OUTPUT_HANDLER_ALIGNTO_SIZE - ((s) % (PHP_OUTPUT_HANDLER_ALIGNTO_SIZE)) : \
+( ((s) > 0) ? \
+	ZEND_MM_ALIGNED_SIZE_EX(s, PHP_OUTPUT_HANDLER_ALIGNTO_SIZE) : \
 	PHP_OUTPUT_HANDLER_DEFAULT_SIZE \
 )
 #define PHP_OUTPUT_HANDLER_ALIGNTO_SIZE		0x1000
diff --git a/main/php_variables.c b/main/php_variables.c
index c3b773516e37f..7569fd43e900c 100644
--- a/main/php_variables.c
+++ b/main/php_variables.c
@@ -893,6 +893,7 @@ static bool php_auto_globals_create_server(zend_string *name)
 	} else {
 		zval_ptr_dtor_nogc(&PG(http_globals)[TRACK_VARS_SERVER]);
 		array_init(&PG(http_globals)[TRACK_VARS_SERVER]);
+		zend_hash_real_init_mixed(Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]));
 	}
 
 	check_http_proxy(Z_ARRVAL(PG(http_globals)[TRACK_VARS_SERVER]));
diff --git a/main/php_version.h b/main/php_version.h
index 1cbfc9afcada9..269397ba11e18 100644
--- a/main/php_version.h
+++ b/main/php_version.h
@@ -1,8 +1,8 @@
 /* automatically generated by configure */
 /* edit configure.ac to change version number */
 #define PHP_MAJOR_VERSION 8
-#define PHP_MINOR_VERSION 4
+#define PHP_MINOR_VERSION 5
 #define PHP_RELEASE_VERSION 0
 #define PHP_EXTRA_VERSION "-dev"
-#define PHP_VERSION "8.4.0-dev"
-#define PHP_VERSION_ID 80400
+#define PHP_VERSION "8.5.0-dev"
+#define PHP_VERSION_ID 80500
diff --git a/main/rfc1867.c b/main/rfc1867.c
index 3ba78f7382191..8a5cd5a5e36c5 100644
--- a/main/rfc1867.c
+++ b/main/rfc1867.c
@@ -742,6 +742,13 @@ SAPI_API SAPI_POST_HANDLER_FUNC(rfc1867_post_handler)
 		boundary_len = boundary_end-boundary;
 	}
 
+	/* Boundaries larger than FILLUNIT-strlen("\r\n--") characters lead to
+	 * erroneous parsing */
+	if (boundary_len > FILLUNIT-strlen("\r\n--")) {
+		sapi_module.sapi_error(E_WARNING, "Boundary too large in multipart/form-data POST data");
+		return;
+	}
+
 	/* Initialize the buffer */
 	mbuff = multipart_buffer_new(boundary, boundary_len);
 
diff --git a/main/streams/plain_wrapper.c b/main/streams/plain_wrapper.c
index fb2addb9e6de2..7b0813c3db623 100644
--- a/main/streams/plain_wrapper.c
+++ b/main/streams/plain_wrapper.c
@@ -1374,7 +1374,17 @@ static int php_plain_files_mkdir(php_stream_wrapper *wrapper, const char *dir, i
 	}
 
 	if (!(options & PHP_STREAM_MKDIR_RECURSIVE)) {
-		return php_mkdir(dir, mode) == 0;
+		if (php_check_open_basedir(dir)) {
+			return 0;
+		}
+
+		int ret = VCWD_MKDIR(dir, (mode_t)mode);
+		if (ret < 0 && (options & REPORT_ERRORS)) {
+			php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
+			return 0;
+		}
+
+		return 1;
 	}
 
 	char buf[MAXPATHLEN];
diff --git a/main/streams/streams.c b/main/streams/streams.c
index f3fb5e3cda544..dc8a8780a242d 100644
--- a/main/streams/streams.c
+++ b/main/streams/streams.c
@@ -1382,8 +1382,13 @@ PHPAPI int _php_stream_seek(php_stream *stream, zend_off_t offset, int whence)
 
 		switch(whence) {
 			case SEEK_CUR:
-				offset = stream->position + offset;
-				whence = SEEK_SET;
+				ZEND_ASSERT(stream->position >= 0);
+				if (UNEXPECTED(offset > ZEND_LONG_MAX - stream->position)) {
+					offset = ZEND_LONG_MAX;
+				} else {
+					offset = stream->position + offset;
+				}
+ 				whence = SEEK_SET;
 				break;
 		}
 		ret = stream->ops->seek(stream, offset, whence, &stream->position);
@@ -2211,7 +2216,9 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(const char *path, const char *mod
 			options &= ~USE_PATH;
 		}
 		if (EG(exception)) {
-			ZEND_ASSERT(resolved_path == NULL);
+			if (resolved_path) {
+				zend_string_release_ex(resolved_path, false);
+			}
 			return NULL;
 		}
 	}
diff --git a/php.ini-development b/php.ini-development
index 3fd5fd578ee04..6e5064dd44751 100644
--- a/php.ini-development
+++ b/php.ini-development
@@ -107,7 +107,7 @@
 ; error_reporting
 ;   Default Value: E_ALL
 ;   Development Value: E_ALL
-;   Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
+;   Production Value: E_ALL & ~E_DEPRECATED
 
 ; log_errors
 ;   Default Value: Off
@@ -442,7 +442,7 @@ memory_limit = 128M
 ; operators. The error level constants are below here for convenience as well as
 ; some common settings and their meanings.
 ; By default, PHP is set to take action on all errors, notices and warnings EXCEPT
-; those related to E_NOTICE and E_STRICT, which together cover best practices and
+; those related to E_NOTICE, which together cover best practices and
 ; recommended coding standards in PHP. For performance reasons, this is the
 ; recommend error reporting setting. Your production server shouldn't be wasting
 ; resources complaining about best practices and coding standards. That's what
@@ -462,9 +462,6 @@ memory_limit = 128M
 ;                     intentional (e.g., using an uninitialized variable and
 ;                     relying on the fact it is automatically initialized to an
 ;                     empty string)
-; E_STRICT          - run-time notices, enable to have PHP suggest changes
-;                     to your code which will ensure the best interoperability
-;                     and forward compatibility of your code
 ; E_CORE_ERROR      - fatal errors that occur during PHP's initial startup
 ; E_CORE_WARNING    - warnings (non-fatal errors) that occur during PHP's
 ;                     initial startup
@@ -480,11 +477,10 @@ memory_limit = 128M
 ; Common Values:
 ;   E_ALL (Show all errors, warnings and notices including coding standards.)
 ;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
-;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
 ;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
 ; Default Value: E_ALL
 ; Development Value: E_ALL
-; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
+; Production Value: E_ALL & ~E_DEPRECATED
 ; https://php.net/error-reporting
 error_reporting = E_ALL
 
diff --git a/php.ini-production b/php.ini-production
index 41f1578a2e786..c62faf52b6732 100644
--- a/php.ini-production
+++ b/php.ini-production
@@ -107,7 +107,7 @@
 ; error_reporting
 ;   Default Value: E_ALL
 ;   Development Value: E_ALL
-;   Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
+;   Production Value: E_ALL & ~E_DEPRECATED
 
 ; log_errors
 ;   Default Value: Off
@@ -444,7 +444,7 @@ memory_limit = 128M
 ; operators. The error level constants are below here for convenience as well as
 ; some common settings and their meanings.
 ; By default, PHP is set to take action on all errors, notices and warnings EXCEPT
-; those related to E_NOTICE and E_STRICT, which together cover best practices and
+; those related to E_NOTICE, which together cover best practices and
 ; recommended coding standards in PHP. For performance reasons, this is the
 ; recommend error reporting setting. Your production server shouldn't be wasting
 ; resources complaining about best practices and coding standards. That's what
@@ -464,9 +464,6 @@ memory_limit = 128M
 ;                     intentional (e.g., using an uninitialized variable and
 ;                     relying on the fact it is automatically initialized to an
 ;                     empty string)
-; E_STRICT          - run-time notices, enable to have PHP suggest changes
-;                     to your code which will ensure the best interoperability
-;                     and forward compatibility of your code
 ; E_CORE_ERROR      - fatal errors that occur during PHP's initial startup
 ; E_CORE_WARNING    - warnings (non-fatal errors) that occur during PHP's
 ;                     initial startup
@@ -482,13 +479,12 @@ memory_limit = 128M
 ; Common Values:
 ;   E_ALL (Show all errors, warnings and notices including coding standards.)
 ;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
-;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
 ;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
 ; Default Value: E_ALL
 ; Development Value: E_ALL
-; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
+; Production Value: E_ALL & ~E_DEPRECATED
 ; https://php.net/error-reporting
-error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
+error_reporting = E_ALL & ~E_DEPRECATED
 
 ; This directive controls whether or not and where PHP will output errors,
 ; notices and warnings too. Error output is very useful during development, but
diff --git a/run-tests.php b/run-tests.php
index e545c302f4e8e..bd03a7f882a79 100755
--- a/run-tests.php
+++ b/run-tests.php
@@ -867,7 +867,7 @@ function write_information(array $user_tests, $phpdbg): void
         $ext_dir = ini_get('extension_dir');
         foreach (scandir($ext_dir) as $file) {
             if (preg_match('/^(?:php_)?([_a-zA-Z0-9]+)\.(?:so|dll)$/', $file, $matches)) {
-                if (!extension_loaded($matches[1]) && @dl($matches[1])) {
+                if (!extension_loaded($matches[1])) {
                     $exts[] = $matches[1];
                 }
             }
@@ -1616,7 +1616,6 @@ function run_all_tests_parallel(array $test_files, array $env, ?string $redir_te
                                 'E_USER_ERROR',
                                 'E_USER_WARNING',
                                 'E_USER_NOTICE',
-                                'E_STRICT', // TODO Cleanup when removed from Zend Engine.
                                 'E_RECOVERABLE_ERROR',
                                 'E_DEPRECATED',
                                 'E_USER_DEPRECATED'
@@ -2177,6 +2176,9 @@ function run_test(string $php, $file, array $env): string
         } elseif (!strncasecmp('xleak', $output, 5)) {
             // Pretend we have an XLEAK section
             $test->setSection('XLEAK', ltrim(substr($output, 5)));
+        } elseif (!strncasecmp('flaky', $output, 5)) {
+            // Pretend we have a FLAKY section
+            $test->setSection('FLAKY', ltrim(substr($output, 5)));
         } elseif ($output !== '') {
             show_result("BORK", $output, $tested_file, 'reason: invalid output from SKIPIF');
             $PHP_FAILED_TESTS['BORKED'][] = [
@@ -2870,8 +2872,8 @@ function expectf_to_regex(?string $wanted): string
         '%e' => preg_quote(DIRECTORY_SEPARATOR, '/'),
         '%s' => '[^\r\n]+',
         '%S' => '[^\r\n]*',
-        '%a' => '.+',
-        '%A' => '.*',
+        '%a' => '.+?',
+        '%A' => '.*?',
         '%w' => '\s*',
         '%i' => '[+-]?\d+',
         '%d' => '\d+',
diff --git a/sapi/apache2handler/php_functions.c b/sapi/apache2handler/php_functions.c
index b0434f2e43223..84437f12ebe9f 100644
--- a/sapi/apache2handler/php_functions.c
+++ b/sapi/apache2handler/php_functions.c
@@ -249,22 +249,19 @@ PHP_FUNCTION(apache_setenv)
 	php_struct *ctx;
 	char *variable=NULL, *string_val=NULL;
 	size_t variable_len, string_val_len;
-	bool walk_to_top = 0;
-	int arg_count = ZEND_NUM_ARGS();
+	bool walk_to_top = false;
 	request_rec *r;
 
-	if (zend_parse_parameters(arg_count, "ss|b", &variable, &variable_len, &string_val, &string_val_len, &walk_to_top) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|b", &variable, &variable_len, &string_val, &string_val_len, &walk_to_top) == FAILURE) {
 		RETURN_THROWS();
 	}
 
 	ctx = SG(server_context);
 
 	r = ctx->r;
-	if (arg_count == 3) {
-		if (walk_to_top) {
-			while(r->prev) {
-				r = r->prev;
-			}
+	if (walk_to_top) {
+		while(r->prev) {
+			r = r->prev;
 		}
 	}
 
@@ -284,22 +281,19 @@ PHP_FUNCTION(apache_getenv)
 	char *variable;
 	size_t variable_len;
 	bool walk_to_top = 0;
-	int arg_count = ZEND_NUM_ARGS();
 	char *env_val=NULL;
 	request_rec *r;
 
-	if (zend_parse_parameters(arg_count, "s|b", &variable, &variable_len, &walk_to_top) == FAILURE) {
+	if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|b", &variable, &variable_len, &walk_to_top) == FAILURE) {
 		RETURN_THROWS();
 	}
 
 	ctx = SG(server_context);
 
 	r = ctx->r;
-	if (arg_count == 2) {
-		if (walk_to_top) {
-			while(r->prev) {
-				r = r->prev;
-			}
+	if (walk_to_top) {
+		while(r->prev) {
+			r = r->prev;
 		}
 	}
 
diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c
index 4096b8d665cb2..5ede45e766674 100644
--- a/sapi/cgi/cgi_main.c
+++ b/sapi/cgi/cgi_main.c
@@ -968,9 +968,9 @@ static int sapi_cgi_deactivate(void)
 	return SUCCESS;
 }
 
-static int php_cgi_startup(sapi_module_struct *sapi_module)
+static int php_cgi_startup(sapi_module_struct *sapi_module_ptr)
 {
-	return php_module_startup(sapi_module, &cgi_module_entry);
+	return php_module_startup(sapi_module_ptr, &cgi_module_entry);
 }
 
 /* {{{ sapi_module_struct cgi_sapi_module */
@@ -1518,23 +1518,23 @@ PHP_INI_BEGIN()
 PHP_INI_END()
 
 /* {{{ php_cgi_globals_ctor */
-static void php_cgi_globals_ctor(php_cgi_globals_struct *php_cgi_globals)
+static void php_cgi_globals_ctor(php_cgi_globals_struct *php_cgi_globals_ptr)
 {
 #if defined(ZTS) && defined(PHP_WIN32)
 	ZEND_TSRMLS_CACHE_UPDATE();
 #endif
-	php_cgi_globals->rfc2616_headers = 0;
-	php_cgi_globals->nph = 0;
-	php_cgi_globals->check_shebang_line = 1;
-	php_cgi_globals->force_redirect = 1;
-	php_cgi_globals->redirect_status_env = NULL;
-	php_cgi_globals->fix_pathinfo = 1;
-	php_cgi_globals->discard_path = 0;
-	php_cgi_globals->fcgi_logging = 1;
+	php_cgi_globals_ptr->rfc2616_headers = 0;
+	php_cgi_globals_ptr->nph = 0;
+	php_cgi_globals_ptr->check_shebang_line = 1;
+	php_cgi_globals_ptr->force_redirect = 1;
+	php_cgi_globals_ptr->redirect_status_env = NULL;
+	php_cgi_globals_ptr->fix_pathinfo = 1;
+	php_cgi_globals_ptr->discard_path = 0;
+	php_cgi_globals_ptr->fcgi_logging = 1;
 #ifdef PHP_WIN32
-	php_cgi_globals->impersonate = 0;
+	php_cgi_globals_ptr->impersonate = 0;
 #endif
-	zend_hash_init(&php_cgi_globals->user_config_cache, 8, NULL, user_config_cache_entry_dtor, 1);
+	zend_hash_init(&php_cgi_globals_ptr->user_config_cache, 8, NULL, user_config_cache_entry_dtor, 1);
 }
 /* }}} */
 
@@ -1749,7 +1749,6 @@ int main(int argc, char *argv[])
 	int status = 0;
 #endif
 	char *query_string;
-	char *decoded_query_string;
 	int skip_getopt = 0;
 
 #if defined(SIGPIPE) && defined(SIG_IGN)
@@ -1804,10 +1803,15 @@ int main(int argc, char *argv[])
 	 * the executable. Ideally we skip argument parsing when we're in cgi or fastcgi mode,
 	 * but that breaks PHP scripts on Linux with a hashbang: `#!/php-cgi -d option=value`.
 	 * Therefore, this code only prevents passing arguments if the query string starts with a '-'.
-	 * Similarly, scripts spawned in subprocesses on Windows may have the same issue. */
+	 * Similarly, scripts spawned in subprocesses on Windows may have the same issue.
+	 * However, Windows has lots of conversion rules and command line parsing rules that
+	 * are too difficult and dangerous to reliably emulate. */
 	if((query_string = getenv("QUERY_STRING")) != NULL && strchr(query_string, '=') == NULL) {
+#ifdef PHP_WIN32
+		skip_getopt = cgi || fastcgi;
+#else
 		unsigned char *p;
-		decoded_query_string = strdup(query_string);
+		char *decoded_query_string = strdup(query_string);
 		php_url_decode(decoded_query_string, strlen(decoded_query_string));
 		for (p = (unsigned char *)decoded_query_string; *p &&  *p <= ' '; p++) {
 			/* skip all leading spaces */
@@ -1816,22 +1820,8 @@ int main(int argc, char *argv[])
 			skip_getopt = 1;
 		}
 
-		/* On Windows we have to take into account the "best fit" mapping behaviour. */
-#ifdef PHP_WIN32
-		if (*p >= 0x80) {
-			wchar_t wide_buf[1];
-			wide_buf[0] = *p;
-			char char_buf[4];
-			size_t wide_buf_len = sizeof(wide_buf) / sizeof(wide_buf[0]);
-			size_t char_buf_len = sizeof(char_buf) / sizeof(char_buf[0]);
-			if (WideCharToMultiByte(CP_ACP, 0, wide_buf, wide_buf_len, char_buf, char_buf_len, NULL, NULL) == 0
-				|| char_buf[0] == '-') {
-				skip_getopt = 1;
-			}
-		}
-#endif
-
 		free(decoded_query_string);
+#endif
 	}
 
 	php_ini_builder_init(&ini_builder);
@@ -1898,18 +1888,17 @@ int main(int argc, char *argv[])
 
 	/* check force_cgi after startup, so we have proper output */
 	if (cgi && CGIG(force_redirect)) {
-		/* Apache will generate REDIRECT_STATUS,
-		 * Netscape and redirect.so will generate HTTP_REDIRECT_STATUS.
-		 * redirect.so and installation instructions available from
-		 * http://www.koehntopp.de/php.
-		 *   -- kk@netuse.de
-		 */
-		if (!getenv("REDIRECT_STATUS") &&
-			!getenv ("HTTP_REDIRECT_STATUS") &&
-			/* this is to allow a different env var to be configured
-			 * in case some server does something different than above */
-			(!CGIG(redirect_status_env) || !getenv(CGIG(redirect_status_env)))
-		) {
+		/* This is to allow a different environment variable to be configured
+		 * in case the we cannot auto-detect which environment variable to use.
+		 * Checking this first to allow user overrides in case the environment
+		 * variable can be set by an untrusted party. */
+		const char *redirect_status_env = CGIG(redirect_status_env);
+		if (!redirect_status_env) {
+			/* Apache will generate REDIRECT_STATUS. */
+			redirect_status_env = "REDIRECT_STATUS";
+		}
+
+		if (!getenv(redirect_status_env)) {
 			zend_try {
 				SG(sapi_headers).http_response_code = 400;
 				PUTS("Security Alert!  The PHP CGI cannot be accessed directly.\n\n\
@@ -2559,11 +2548,11 @@ consult the installation file that came with this distribution, or visit \n\
 					break;
 				case PHP_MODE_HIGHLIGHT:
 					{
-						zend_syntax_highlighter_ini syntax_highlighter_ini;
+						zend_syntax_highlighter_ini default_syntax_highlighter_ini;
 
 						if (open_file_for_scanning(&file_handle) == SUCCESS) {
-							php_get_highlight_struct(&syntax_highlighter_ini);
-							zend_highlight(&syntax_highlighter_ini);
+							php_get_highlight_struct(&default_syntax_highlighter_ini);
+							zend_highlight(&default_syntax_highlighter_ini);
 						}
 					}
 					break;
diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c
index 11214465d064c..2731a1f93738a 100644
--- a/sapi/cli/php_cli.c
+++ b/sapi/cli/php_cli.c
@@ -392,9 +392,9 @@ static void sapi_cli_send_header(sapi_header_struct *sapi_header, void *server_c
 }
 /* }}} */
 
-static int php_cli_startup(sapi_module_struct *sapi_module) /* {{{ */
+static int php_cli_startup(sapi_module_struct *sapi_module_ptr) /* {{{ */
 {
-	return php_module_startup(sapi_module, NULL);
+	return php_module_startup(sapi_module_ptr, NULL);
 }
 /* }}} */
 
@@ -951,11 +951,11 @@ static int do_cli(int argc, char **argv) /* {{{ */
 			break;
 		case PHP_CLI_MODE_HIGHLIGHT:
 			{
-				zend_syntax_highlighter_ini syntax_highlighter_ini;
+				zend_syntax_highlighter_ini default_syntax_highlighter_ini;
 
 				if (open_file_for_scanning(&file_handle) == SUCCESS) {
-					php_get_highlight_struct(&syntax_highlighter_ini);
-					zend_highlight(&syntax_highlighter_ini);
+					php_get_highlight_struct(&default_syntax_highlighter_ini);
+					zend_highlight(&default_syntax_highlighter_ini);
 				}
 				goto out;
 			}
@@ -1045,6 +1045,7 @@ static int do_cli(int argc, char **argv) /* {{{ */
 				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);
@@ -1154,7 +1155,7 @@ int main(int argc, char *argv[])
 	char *ini_path_override = NULL;
 	struct php_ini_builder ini_builder;
 	int ini_ignore = 0;
-	sapi_module_struct *sapi_module = &cli_sapi_module;
+	sapi_module_struct *sapi_module_ptr = &cli_sapi_module;
 
 	/*
 	 * Do not move this initialization. It needs to happen before argv is used
@@ -1233,7 +1234,7 @@ int main(int argc, char *argv[])
 				break;
 #ifndef PHP_CLI_WIN32_NO_CONSOLE
 			case 'S':
-				sapi_module = &cli_server_sapi_module;
+				sapi_module_ptr = &cli_server_sapi_module;
 				cli_server_sapi_module.additional_functions = server_additional_functions;
 				break;
 #endif
@@ -1246,7 +1247,7 @@ int main(int argc, char *argv[])
 				exit_status = 1;
 				goto out;
 			case 'i': case 'v': case 'm':
-				sapi_module = &cli_sapi_module;
+				sapi_module_ptr = &cli_sapi_module;
 				goto exit_loop;
 			case 'e': /* enable extended info output */
 				use_extended_info = 1;
@@ -1255,25 +1256,25 @@ int main(int argc, char *argv[])
 	}
 exit_loop:
 
-	sapi_module->ini_defaults = sapi_cli_ini_defaults;
-	sapi_module->php_ini_path_override = ini_path_override;
-	sapi_module->phpinfo_as_text = 1;
-	sapi_module->php_ini_ignore_cwd = 1;
-	sapi_startup(sapi_module);
+	sapi_module_ptr->ini_defaults = sapi_cli_ini_defaults;
+	sapi_module_ptr->php_ini_path_override = ini_path_override;
+	sapi_module_ptr->phpinfo_as_text = 1;
+	sapi_module_ptr->php_ini_ignore_cwd = 1;
+	sapi_startup(sapi_module_ptr);
 	sapi_started = 1;
 
-	sapi_module->php_ini_ignore = ini_ignore;
+	sapi_module_ptr->php_ini_ignore = ini_ignore;
 
-	sapi_module->executable_location = argv[0];
+	sapi_module_ptr->executable_location = argv[0];
 
-	if (sapi_module == &cli_sapi_module) {
+	if (sapi_module_ptr == &cli_sapi_module) {
 		php_ini_builder_prepend_literal(&ini_builder, HARDCODED_INI);
 	}
 
-	sapi_module->ini_entries = php_ini_builder_finish(&ini_builder);
+	sapi_module_ptr->ini_entries = php_ini_builder_finish(&ini_builder);
 
 	/* startup after we get the above ini override so we get things right */
-	if (sapi_module->startup(sapi_module) == FAILURE) {
+	if (sapi_module_ptr->startup(sapi_module_ptr) == FAILURE) {
 		/* there is no way to see if we must call zend_ini_deactivate()
 		 * since we cannot check if EG(ini_directives) has been initialized
 		 * because the executor's constructor does not set initialize it.
@@ -1304,7 +1305,7 @@ int main(int argc, char *argv[])
 
 	zend_first_try {
 #ifndef PHP_CLI_WIN32_NO_CONSOLE
-		if (sapi_module == &cli_sapi_module) {
+		if (sapi_module_ptr == &cli_sapi_module) {
 #endif
 			exit_status = do_cli(argc, argv);
 #ifndef PHP_CLI_WIN32_NO_CONSOLE
diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c
index a720ce32e356c..fc2e282995644 100644
--- a/sapi/cli/php_cli_server.c
+++ b/sapi/cli/php_cli_server.c
@@ -510,9 +510,9 @@ const zend_function_entry server_additional_functions[] = {
 	PHP_FE_END
 };
 
-static int sapi_cli_server_startup(sapi_module_struct *sapi_module) /* {{{ */
+static int sapi_cli_server_startup(sapi_module_struct *sapi_module_ptr) /* {{{ */
 {
-	return php_module_startup(sapi_module, &cli_server_module_entry);
+	return php_module_startup(sapi_module_ptr, &cli_server_module_entry);
 } /* }}} */
 
 static size_t sapi_cli_server_ub_write(const char *str, size_t str_length) /* {{{ */
@@ -1680,14 +1680,33 @@ static void php_cli_server_client_save_header(php_cli_server_client *client)
 {
 	/* Wrap header value in a zval to add is to the HashTable which acts as an array */
 	zval tmp;
-	ZVAL_STR(&tmp, client->current_header_value);
 	/* strip off the colon */
 	zend_string *lc_header_name = zend_string_tolower_ex(client->current_header_name, /* persistent */ true);
 	GC_MAKE_PERSISTENT_LOCAL(lc_header_name);
 
-	/* Add the wrapped zend_string to the HashTable */
-	zend_hash_add(&client->request.headers, lc_header_name, &tmp);
-	zend_hash_add(&client->request.headers_original_case, client->current_header_name, &tmp);
+	zval *entry = zend_hash_find(&client->request.headers, lc_header_name);
+	bool with_comma = !zend_string_equals_literal(lc_header_name, "set-cookie");
+
+	/**
+	 * `Set-Cookie` HTTP header being the exception, they can have 1 or more values separated
+	 * by a comma while still possibly be set separately by the client.
+	 **/
+	if (!with_comma || entry == NULL) {
+		ZVAL_STR(&tmp, client->current_header_value);
+	} else {
+		zend_string *curval = Z_STR_P(entry);
+		zend_string *newval = zend_string_safe_alloc(1, ZSTR_LEN(curval),  ZSTR_LEN(client->current_header_value) + 2, /* persistent */true);
+
+		memcpy(ZSTR_VAL(newval), ZSTR_VAL(curval), ZSTR_LEN(curval));
+		memcpy(ZSTR_VAL(newval) + ZSTR_LEN(curval), ", ", 2);
+		memcpy(ZSTR_VAL(newval) + ZSTR_LEN(curval) + 2, ZSTR_VAL(client->current_header_value), ZSTR_LEN(client->current_header_value) + 1);
+
+		ZVAL_STR(&tmp, newval);
+	}
+
+	/* Add/Update the wrapped zend_string to the HashTable */
+	zend_hash_update(&client->request.headers, lc_header_name, &tmp);
+	zend_hash_update(&client->request.headers_original_case, client->current_header_name, &tmp);
 
 	zend_string_release_ex(lc_header_name, /* persistent */ true);
 	zend_string_release_ex(client->current_header_name, /* persistent */ true);
@@ -2247,6 +2266,7 @@ static bool php_cli_server_dispatch_router(php_cli_server *server, php_cli_serve
 		int sg_options_back = SG(options);
 		/* Don't chdir to the router script because the file path may be relative. */
 		SG(options) |= SAPI_OPTION_NO_CHDIR;
+		CG(skip_shebang) = true;
 		bool result = php_execute_script_ex(&zfd, &retval);
 		SG(options) = sg_options_back;
 		if (result) {
@@ -2333,14 +2353,14 @@ static zend_result php_cli_server_dispatch(php_cli_server *server, php_cli_serve
 }
 /* }}} */
 
-static void php_cli_server_mime_type_ctor(php_cli_server *server, const php_cli_server_ext_mime_type_pair *mime_type_map) /* {{{ */
+static void php_cli_server_mime_type_ctor(php_cli_server *server, const php_cli_server_ext_mime_type_pair *mime_type_map_ptr) /* {{{ */
 {
 	const php_cli_server_ext_mime_type_pair *pair;
 
 	zend_hash_init(&server->extension_mime_types, 0, NULL, NULL, 1);
 	GC_MAKE_PERSISTENT_LOCAL(&server->extension_mime_types);
 
-	for (pair = mime_type_map; pair->ext; pair++) {
+	for (pair = mime_type_map_ptr; pair->ext; pair++) {
 		size_t ext_len = strlen(pair->ext);
 		zend_hash_str_add_ptr(&server->extension_mime_types, pair->ext, ext_len, (void*)pair->mime_type);
 	}
@@ -2376,7 +2396,7 @@ static void php_cli_server_dtor(php_cli_server *server) /* {{{ */
 			 do {
 				if (waitpid(php_cli_server_workers[php_cli_server_worker],
 						   &php_cli_server_worker_status,
-						   0) == FAILURE) {
+						   0) == (pid_t) -1) {
 					/* an extremely bad thing happened */
 					break;
 				}
diff --git a/sapi/cli/tests/gh16137.phpt b/sapi/cli/tests/gh16137.phpt
new file mode 100644
index 0000000000000..165b8b1afd300
--- /dev/null
+++ b/sapi/cli/tests/gh16137.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug GH-16137 duplicate *Forwarded* HTTP headers values.
+--INI--
+allow_url_fopen=1
+--SKIPIF--
+
+--FILE--
+ array (
+    'method' => 'POST',
+    'header' => array('x-forwarded-for: 127.0.0.1', 'x-forwarded-for: 192.168.1.254')
+)));
+var_dump(file_get_contents("http://" . PHP_CLI_SERVER_ADDRESS, true, $ctx));
+?>
+--EXPECT--
+string(24) "127.0.0.1, 192.168.1.254"
diff --git a/sapi/fpm/fpm/fpm_main.c b/sapi/fpm/fpm/fpm_main.c
index d138738b27981..57006a15c7a08 100644
--- a/sapi/fpm/fpm/fpm_main.c
+++ b/sapi/fpm/fpm/fpm_main.c
@@ -143,11 +143,9 @@ typedef struct _php_cgi_globals_struct {
 	bool rfc2616_headers;
 	bool nph;
 	bool fix_pathinfo;
-	bool force_redirect;
 	bool discard_path;
 	bool fcgi_logging;
 	bool fcgi_logging_request_started;
-	char *redirect_status_env;
 	HashTable user_config_cache;
 	char *error_header;
 	char *fpm_config;
@@ -1423,8 +1421,6 @@ static void fastcgi_ini_parser(zval *arg1, zval *arg2, zval *arg3, int callback_
 PHP_INI_BEGIN()
 	STD_PHP_INI_BOOLEAN("cgi.rfc2616_headers",     "0",  PHP_INI_ALL,    OnUpdateBool,   rfc2616_headers, php_cgi_globals_struct, php_cgi_globals)
 	STD_PHP_INI_BOOLEAN("cgi.nph",                 "0",  PHP_INI_ALL,    OnUpdateBool,   nph, php_cgi_globals_struct, php_cgi_globals)
-	STD_PHP_INI_BOOLEAN("cgi.force_redirect",      "1",  PHP_INI_SYSTEM, OnUpdateBool,   force_redirect, php_cgi_globals_struct, php_cgi_globals)
-	STD_PHP_INI_ENTRY("cgi.redirect_status_env", NULL, PHP_INI_SYSTEM, OnUpdateString, redirect_status_env, php_cgi_globals_struct, php_cgi_globals)
 	STD_PHP_INI_BOOLEAN("cgi.fix_pathinfo",        "1",  PHP_INI_SYSTEM, OnUpdateBool,   fix_pathinfo, php_cgi_globals_struct, php_cgi_globals)
 	STD_PHP_INI_BOOLEAN("cgi.discard_path",        "0",  PHP_INI_SYSTEM, OnUpdateBool,   discard_path, php_cgi_globals_struct, php_cgi_globals)
 	STD_PHP_INI_BOOLEAN("fastcgi.logging",         "1",  PHP_INI_SYSTEM, OnUpdateBool,   fcgi_logging, php_cgi_globals_struct, php_cgi_globals)
@@ -1437,8 +1433,6 @@ static void php_cgi_globals_ctor(php_cgi_globals_struct *php_cgi_globals)
 {
 	php_cgi_globals->rfc2616_headers = 0;
 	php_cgi_globals->nph = 0;
-	php_cgi_globals->force_redirect = 1;
-	php_cgi_globals->redirect_status_env = NULL;
 	php_cgi_globals->fix_pathinfo = 1;
 	php_cgi_globals->discard_path = 0;
 	php_cgi_globals->fcgi_logging = 1;
@@ -1549,7 +1543,7 @@ static zend_module_entry cgi_module_entry = {
 int main(int argc, char *argv[])
 {
 	int exit_status = FPM_EXIT_OK;
-	int cgi = 0, c, use_extended_info = 0;
+	int c, use_extended_info = 0;
 	zend_file_handle file_handle;
 
 	/* temporary locals */
@@ -1767,46 +1761,6 @@ int main(int argc, char *argv[])
 		CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;
 	}
 
-	/* check force_cgi after startup, so we have proper output */
-	if (cgi && CGIG(force_redirect)) {
-		/* Apache will generate REDIRECT_STATUS,
-		 * Netscape and redirect.so will generate HTTP_REDIRECT_STATUS.
-		 * redirect.so and installation instructions available from
-		 * http://www.koehntopp.de/php.
-		 *   -- kk@netuse.de
-		 */
-		if (!getenv("REDIRECT_STATUS") &&
-			!getenv ("HTTP_REDIRECT_STATUS") &&
-			/* this is to allow a different env var to be configured
-			 * in case some server does something different than above */
-			(!CGIG(redirect_status_env) || !getenv(CGIG(redirect_status_env)))
-		) {
-			zend_try {
-				SG(sapi_headers).http_response_code = 400;
-				PUTS("Security Alert!  The PHP CGI cannot be accessed directly.\n\n\
-This PHP CGI binary was compiled with force-cgi-redirect enabled.  This\n\
-means that a page will only be served up if the REDIRECT_STATUS CGI variable is\n\
-set, e.g. via an Apache Action directive.
\n\
-For more information as to why  this behaviour exists, see the \
-manual page for CGI security .
\n\
-For more information about changing this behaviour or re-enabling this webserver,\n\
-consult the installation file that came with this distribution, or visit \n\
-the manual page .
\n");
-			} zend_catch {
-			} zend_end_try();
-#if defined(ZTS) && !PHP_DEBUG
-			/* XXX we're crashing here in msvc6 debug builds at
-			 * php_message_handler_for_zend:839 because
-			 * SG(request_info).path_translated is an invalid pointer.
-			 * It still happens even though I set it to null, so something
-			 * weird is going on.
-			 */
-			tsrm_shutdown();
-#endif
-			return FPM_EXIT_SOFTWARE;
-		}
-	}
-
 #if ZEND_RC_DEBUG
 	old_rc_debug = zend_rc_debug;
 	zend_rc_debug = 0;
diff --git a/sapi/fpm/fpm/fpm_stdio.c b/sapi/fpm/fpm/fpm_stdio.c
index 55139a0e02ec1..c9386f941f18f 100644
--- a/sapi/fpm/fpm/fpm_stdio.c
+++ b/sapi/fpm/fpm/fpm_stdio.c
@@ -228,7 +228,7 @@ static void fpm_stdio_child_said(struct fpm_event_s *ev, short which, void *arg)
 			if 	((sizeof(FPM_STDIO_CMD_FLUSH) - cmd_pos) <= in_buf &&
 					!memcmp(buf, &FPM_STDIO_CMD_FLUSH[cmd_pos], sizeof(FPM_STDIO_CMD_FLUSH) - cmd_pos)) {
 				zlog_stream_finish(log_stream);
-				start = cmd_pos;
+				start = sizeof(FPM_STDIO_CMD_FLUSH) - cmd_pos;
 			} else {
 				zlog_stream_str(log_stream, &FPM_STDIO_CMD_FLUSH[0], cmd_pos);
 			}
diff --git a/sapi/fpm/tests/config-array.phpt b/sapi/fpm/tests/config-array.phpt
index 8d97afcac589a..4e5ff81da2b7d 100644
--- a/sapi/fpm/tests/config-array.phpt
+++ b/sapi/fpm/tests/config-array.phpt
@@ -29,7 +29,7 @@ $tester->start(['-tt']);
 $tester->expectLogConfigOptions([
     'access.suppress_path[] = /ping',
     'access.suppress_path[] = /health_check.php',
-    'php_value[error_reporting] = 32767',
+    'php_value[error_reporting] = 30719',
     'php_value[date.timezone] = Europe/London',
     'php_value[display_errors] = 1',
     'php_admin_value[disable_functions] = eval',
diff --git a/sapi/fpm/tests/gh15395-php-auth-shutdown.phpt b/sapi/fpm/tests/gh15395-php-auth-shutdown.phpt
new file mode 100644
index 0000000000000..b9875dd10ef5e
--- /dev/null
+++ b/sapi/fpm/tests/gh15395-php-auth-shutdown.phpt
@@ -0,0 +1,61 @@
+--TEST--
+FPM: GH-15335 - PHP_AUTH shutdown  use after free
+--SKIPIF--
+
+--FILE--
+createSourceFileAndScriptName();
+$tester->start();
+$tester->expectLogStartNotices();
+$tester
+    ->request(
+        headers: [ "HTTP_AUTHORIZATION" => "Basic Zm9vOg==", "REQUEST_METHOD" => "GET"],
+        uri: $scriptName,
+        address: '{{ADDR}}',
+        scriptFilename: __DIR__ . "/__unknown.php",
+        scriptName: "/",
+    )
+    ->expectStatus('404 Not Found');
+$tester
+    ->request(
+        uri: $scriptName,
+        address: '{{ADDR}}',
+        params: [],
+    );
+$tester->expectNoLogPattern("/zend_mm_heap corrupted/");
+$tester->terminate();
+$tester->expectLogTerminatingNotices();
+$tester->close();
+
+?>
+Done
+--EXPECT--
+Done
+--CLEAN--
+
diff --git a/sapi/fpm/tests/log-bwp-msg-flush-split-sep-pos-end.phpt b/sapi/fpm/tests/log-bwp-msg-flush-split-sep-pos-end.phpt
new file mode 100644
index 0000000000000..528263200803e
--- /dev/null
+++ b/sapi/fpm/tests/log-bwp-msg-flush-split-sep-pos-end.phpt
@@ -0,0 +1,47 @@
+--TEST--
+FPM: Buffered worker output plain log with msg with flush split position towards separator end
+--SKIPIF--
+
+--FILE--
+start();
+$tester->expectLogStartNotices();
+$tester->request()->expectEmptyBody();
+$tester->expectLogLine(str_repeat('a', 1013)  . "Quarkslab", decorated: false);
+$tester->expectLogLine("Quarkslab", decorated: false);
+$tester->terminate();
+$tester->expectLogTerminatingNotices();
+$tester->close();
+
+?>
+Done
+--EXPECT--
+Done
+--CLEAN--
+
diff --git a/sapi/fpm/tests/log-bwp-msg-flush-split-sep-pos-start.phpt b/sapi/fpm/tests/log-bwp-msg-flush-split-sep-pos-start.phpt
new file mode 100644
index 0000000000000..3490593855328
--- /dev/null
+++ b/sapi/fpm/tests/log-bwp-msg-flush-split-sep-pos-start.phpt
@@ -0,0 +1,47 @@
+--TEST--
+FPM: Buffered worker output plain log with msg with flush split position towards separator start
+--SKIPIF--
+
+--FILE--
+start();
+$tester->expectLogStartNotices();
+$tester->request()->expectEmptyBody();
+$tester->expectLogLine(str_repeat('a', 1009)  . "Quarkslab", decorated: false);
+$tester->expectLogLine("Quarkslab", decorated: false);
+$tester->terminate();
+$tester->expectLogTerminatingNotices();
+$tester->close();
+
+?>
+Done
+--EXPECT--
+Done
+--CLEAN--
+
diff --git a/sapi/fpm/tests/tester.inc b/sapi/fpm/tests/tester.inc
index bbd6394e21373..48a2a5d5f60dc 100644
--- a/sapi/fpm/tests/tester.inc
+++ b/sapi/fpm/tests/tester.inc
@@ -838,6 +838,7 @@ class Tester
         int $readLimit = -1,
         int $writeDelay = 0,
         ?string $method = null,
+        ?array $params = null,
     ): Response {
         if ($this->hasError()) {
             return $this->createResponse(expectInvalid: true);
@@ -847,7 +848,7 @@ class Tester
             $stdin = $this->parseStdin($stdin, $headers);
         }
 
-        $params = $this->getRequestParams($query, $headers, $uri, $scriptFilename, $scriptName, $stdin, $method);
+        $params = $params ?? $this->getRequestParams($query, $headers, $uri, $scriptFilename, $scriptName, $stdin, $method);
         $this->trace('Request params', $params);
 
         try {
diff --git a/sapi/phpdbg/Makefile.frag b/sapi/phpdbg/Makefile.frag
index a069a23685d92..3b09f6a2c8854 100644
--- a/sapi/phpdbg/Makefile.frag
+++ b/sapi/phpdbg/Makefile.frag
@@ -1,11 +1,11 @@
-phpdbg: $(BUILD_BINARY)
+phpdbg: $(SAPI_PHPDBG_PATH)
 
-phpdbg-shared: $(BUILD_SHARED)
+phpdbg-shared: $(SAPI_PHPDBG_SHARED_PATH)
 
-$(BUILD_SHARED): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS)
+$(SAPI_PHPDBG_SHARED_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS)
 	$(BUILD_PHPDBG_SHARED)
 
-$(BUILD_BINARY): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS)
+$(SAPI_PHPDBG_PATH): $(PHP_GLOBAL_OBJS) $(PHP_BINARY_OBJS) $(PHP_PHPDBG_OBJS)
 	$(BUILD_PHPDBG)
 
 %.c: %.y
@@ -20,12 +20,12 @@ $(srcdir)/phpdbg_parser.h: $(srcdir)/phpdbg_parser.c
 $(srcdir)/phpdbg_parser.c: $(srcdir)/phpdbg_parser.y
 	@$(YACC) $(YFLAGS) -v -d $(srcdir)/phpdbg_parser.y -o $@
 
-install-phpdbg: $(BUILD_BINARY)
+install-phpdbg: $(SAPI_PHPDBG_PATH)
 	@echo "Installing phpdbg binary:         $(INSTALL_ROOT)$(bindir)/"
 	@$(mkinstalldirs) $(INSTALL_ROOT)$(bindir)
 	@$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/log
 	@$(mkinstalldirs) $(INSTALL_ROOT)$(localstatedir)/run
-	@$(INSTALL) -m 0755 $(BUILD_BINARY) $(INSTALL_ROOT)$(bindir)/$(program_prefix)phpdbg$(program_suffix)$(EXEEXT)
+	@$(INSTALL) -m 0755 $(SAPI_PHPDBG_PATH) $(INSTALL_ROOT)$(bindir)/$(program_prefix)phpdbg$(program_suffix)$(EXEEXT)
 	@echo "Installing phpdbg man page:       $(INSTALL_ROOT)$(mandir)/man1/"
 	@$(mkinstalldirs) $(INSTALL_ROOT)$(mandir)/man1
 	@$(INSTALL_DATA) sapi/phpdbg/phpdbg.1 $(INSTALL_ROOT)$(mandir)/man1/$(program_prefix)phpdbg$(program_suffix).1
diff --git a/sapi/phpdbg/config.m4 b/sapi/phpdbg/config.m4
index 55f8fa3a8aa02..3b6c237959652 100644
--- a/sapi/phpdbg/config.m4
+++ b/sapi/phpdbg/config.m4
@@ -90,8 +90,8 @@ if test "$PHP_PHPDBG" != "no"; then
     ]),
     [$PHP_PHPDBG_CFLAGS])
 
-  BUILD_BINARY="sapi/phpdbg/phpdbg"
-  BUILD_SHARED="sapi/phpdbg/libphpdbg.la"
+  SAPI_PHPDBG_PATH="sapi/phpdbg/phpdbg"
+  SAPI_PHPDBG_SHARED_PATH="sapi/phpdbg/libphpdbg.la"
 
   BUILD_PHPDBG="\$(LIBTOOL) --tag=CC --mode=link \
         \$(CC) -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \
@@ -102,7 +102,7 @@ if test "$PHP_PHPDBG" != "no"; then
                 \$(PHPDBG_EXTRA_LIBS) \
                 \$(ZEND_EXTRA_LIBS) \
                 \$(PHP_FRAMEWORKS) \
-         -o \$(BUILD_BINARY)"
+         -o \$(SAPI_PHPDBG_PATH)"
 
   BUILD_PHPDBG_SHARED="\$(LIBTOOL) --tag=CC --mode=link \
         \$(CC) -shared -Wl,-soname,libphpdbg.so -export-dynamic \$(CFLAGS_CLEAN) \$(EXTRA_CFLAGS) \$(EXTRA_LDFLAGS_PROGRAM) \$(LDFLAGS) \$(PHP_RPATHS) \
@@ -112,11 +112,11 @@ if test "$PHP_PHPDBG" != "no"; then
                 \$(EXTRA_LIBS) \
                 \$(PHPDBG_EXTRA_LIBS) \
                 \$(ZEND_EXTRA_LIBS) \
-         -o \$(BUILD_SHARED)"
+         -o \$(SAPI_PHPDBG_SHARED_PATH)"
 
   PHP_SUBST([PHPDBG_EXTRA_LIBS])
-  PHP_SUBST([BUILD_BINARY])
-  PHP_SUBST([BUILD_SHARED])
+  PHP_SUBST([SAPI_PHPDBG_PATH])
+  PHP_SUBST([SAPI_PHPDBG_SHARED_PATH])
   PHP_SUBST([BUILD_PHPDBG])
   PHP_SUBST([BUILD_PHPDBG_SHARED])
 
diff --git a/sapi/phpdbg/phpdbg.c b/sapi/phpdbg/phpdbg.c
index 76b3c7f725951..f298a8029faea 100644
--- a/sapi/phpdbg/phpdbg.c
+++ b/sapi/phpdbg/phpdbg.c
@@ -1124,8 +1124,8 @@ int main(int argc, char **argv) /* {{{ */
 	sapi_module_struct *phpdbg = &phpdbg_sapi_module;
 	char *sapi_name;
 	struct php_ini_builder ini_builder;
-	char **zend_extensions = NULL;
-	zend_ulong zend_extensions_len = 0L;
+	char **zend_extensions_list = NULL;
+	size_t zend_extensions_len = 0;
 	bool ini_ignore;
 	char *ini_override;
 	char *exec = NULL;
@@ -1177,8 +1177,6 @@ int main(int argc, char **argv) /* {{{ */
 	php_ini_builder_init(&ini_builder);
 	ini_ignore = 0;
 	ini_override = NULL;
-	zend_extensions = NULL;
-	zend_extensions_len = 0L;
 	init_file = NULL;
 	init_file_len = 0;
 	init_file_default = 1;
@@ -1216,10 +1214,12 @@ int main(int argc, char **argv) /* {{{ */
 
 			case 'z':
 				zend_extensions_len++;
-				if (zend_extensions) {
-					zend_extensions = realloc(zend_extensions, sizeof(char*) * zend_extensions_len);
-				} else zend_extensions = malloc(sizeof(char*) * zend_extensions_len);
-				zend_extensions[zend_extensions_len-1] = strdup(php_optarg);
+				if (zend_extensions_list) {
+					zend_extensions_list = realloc(zend_extensions_list, sizeof(char*) * zend_extensions_len);
+				} else {
+					zend_extensions_list = malloc(sizeof(char*) * zend_extensions_len);
+				}
+				zend_extensions_list[zend_extensions_len-1] = strdup(php_optarg);
 			break;
 
 			/* begin phpdbg options */
@@ -1316,19 +1316,19 @@ int main(int argc, char **argv) /* {{{ */
 	php_ini_builder_prepend_literal(&ini_builder, phpdbg_ini_hardcoded);
 
 	if (zend_extensions_len) {
-		zend_ulong zend_extension = 0L;
+		size_t zend_extension_index = 0;
 
-		while (zend_extension < zend_extensions_len) {
-			const char *ze = zend_extensions[zend_extension];
+		while (zend_extension_index < zend_extensions_len) {
+			const char *ze = zend_extensions_list[zend_extension_index];
 			size_t ze_len = strlen(ze);
 
 			php_ini_builder_unquoted(&ini_builder, "zend_extension", strlen("zend_extension"), ze, ze_len);
 
-			free(zend_extensions[zend_extension]);
-			zend_extension++;
+			free(zend_extensions_list[zend_extension_index]);
+			zend_extension_index++;
 		}
 
-		free(zend_extensions);
+		free(zend_extensions_list);
 	}
 
 	phpdbg->ini_entries = php_ini_builder_finish(&ini_builder);
diff --git a/sapi/phpdbg/phpdbg.h b/sapi/phpdbg/phpdbg.h
index 41fe8faecf99b..e5f6413b060ed 100644
--- a/sapi/phpdbg/phpdbg.h
+++ b/sapi/phpdbg/phpdbg.h
@@ -193,8 +193,10 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input);
 
 #define phpdbg_try_access \
 	{                                                            \
+		ZEND_DIAGNOSTIC_IGNORED_START("-Wshadow") \
 		JMP_BUF *__orig_bailout = PHPDBG_G(sigsegv_bailout); \
 		JMP_BUF __bailout;                                   \
+		ZEND_DIAGNOSTIC_IGNORED_END \
                                                                      \
 		PHPDBG_G(sigsegv_bailout) = &__bailout;              \
 		if (SETJMP(__bailout) == 0) {
diff --git a/sapi/phpdbg/phpdbg_bp.c b/sapi/phpdbg/phpdbg_bp.c
index 90f8ed7bb1295..0a94adf21305a 100644
--- a/sapi/phpdbg/phpdbg_bp.c
+++ b/sapi/phpdbg/phpdbg_bp.c
@@ -1510,28 +1510,28 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type) /* {{{ */
 			phpdbg_out(SEPARATE "\n");
 			phpdbg_out("Opline Breakpoints:\n");
 			ZEND_HASH_MAP_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], brake) {
-				const char *type;
+				const char *str_type;
 				switch (brake->type) {
 					case PHPDBG_BREAK_METHOD_OPLINE:
-						type = "method";
+						str_type = "method";
 						goto print_opline;
 					case PHPDBG_BREAK_FUNCTION_OPLINE:
-						type = "function";
+						str_type = "function";
 						goto print_opline;
 					case PHPDBG_BREAK_FILE_OPLINE:
-						type = "method";
+						str_type = "method";
 
 					print_opline: {
 						if (brake->type == PHPDBG_BREAK_METHOD_OPLINE) {
-							type = "method";
+							str_type = "method";
 						} else if (brake->type == PHPDBG_BREAK_FUNCTION_OPLINE) {
-							type = "function";
+							str_type = "function";
 						} else if (brake->type == PHPDBG_BREAK_FILE_OPLINE) {
-							type = "file";
+							str_type = "file";
 						}
 
 						phpdbg_writeln("#%d\t\t#"ZEND_ULONG_FMT"\t\t(%s breakpoint)%s",
-							brake->id, brake->opline, type,
+							brake->id, brake->opline, str_type,
 							((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : "");
 					} break;
 
diff --git a/sapi/phpdbg/phpdbg_frame.c b/sapi/phpdbg/phpdbg_frame.c
index efb35e5cdf503..a8f1bf01433b7 100644
--- a/sapi/phpdbg/phpdbg_frame.c
+++ b/sapi/phpdbg/phpdbg_frame.c
@@ -245,12 +245,10 @@ static void phpdbg_dump_prototype(zval *tmp) /* {{{ */
 
 void phpdbg_dump_backtrace(size_t num) /* {{{ */
 {
-	HashPosition position;
 	zval zbacktrace;
 	zval *tmp;
-	zval startline, startfile;
-	const char *startfilename;
-	zval *file = &startfile, *line = &startline;
+	zend_string *file = NULL;
+	zend_long line = 0;
 	int i = 0, limit = num;
 
 	PHPDBG_OUTPUT_BACKUP();
@@ -269,18 +267,15 @@ void phpdbg_dump_backtrace(size_t num) /* {{{ */
 		return;
 	} phpdbg_end_try_access();
 
-	Z_LVAL(startline) = zend_get_executed_lineno();
-	startfilename = zend_get_executed_filename();
-	Z_STR(startfile) = zend_string_init(startfilename, strlen(startfilename), 0);
-
-	zend_hash_internal_pointer_reset_ex(Z_ARRVAL(zbacktrace), &position);
+	line = zend_get_executed_lineno();
+	file = zend_get_executed_filename_ex();
 
 	zval *function_name = NULL;
-	while ((tmp = zend_hash_get_current_data_ex(Z_ARRVAL(zbacktrace), &position))) {
+	ZEND_HASH_FOREACH_VAL(Z_ARRVAL(zbacktrace), tmp) {
 		if (file) { /* userland */
 			phpdbg_out("frame #%d: ", i);
 			phpdbg_dump_prototype(tmp);
-			phpdbg_out(" at %s:"ZEND_LONG_FMT"\n", Z_STRVAL_P(file), Z_LVAL_P(line));
+			phpdbg_out(" at %s:"ZEND_LONG_FMT"\n", ZSTR_VAL(file), line);
 			i++;
 		} else {
 			phpdbg_out(" => ");
@@ -288,23 +283,23 @@ void phpdbg_dump_backtrace(size_t num) /* {{{ */
 			phpdbg_out(" (internal function)\n");
 		}
 
-		file = zend_hash_find(Z_ARRVAL_P(tmp), ZSTR_KNOWN(ZEND_STR_FILE));
-		line = zend_hash_find(Z_ARRVAL_P(tmp), ZSTR_KNOWN(ZEND_STR_LINE));
+		file = zend_hash_find_ptr(Z_ARRVAL_P(tmp), ZSTR_KNOWN(ZEND_STR_FILE));
+		zval *line_zv = zend_hash_find(Z_ARRVAL_P(tmp), ZSTR_KNOWN(ZEND_STR_LINE));
+		if (line_zv) {
+			line = Z_LVAL_P(line_zv);
+		}
 		function_name = zend_hash_find(Z_ARRVAL_P(tmp), ZSTR_KNOWN(ZEND_STR_FUNCTION));
-
-		zend_hash_move_forward_ex(Z_ARRVAL(zbacktrace), &position);
-	}
+	} ZEND_HASH_FOREACH_END();
 
 	/* This is possible for fibers' start closure for example, which have a frame that doesn't contain the info
 	 * of which location stated the fiber if that stack frame is already torn down. same behaviour with debug_backtrace(). */
 	if (file == NULL) {
 		phpdbg_writeln(" => %s (internal function)", Z_STRVAL_P(function_name));
 	} else {
-		phpdbg_writeln("frame #%d: {main} at %s:"ZEND_LONG_FMT, i, Z_STRVAL_P(file), Z_LVAL_P(line));
+		phpdbg_writeln("frame #%d: {main} at %s:"ZEND_LONG_FMT, i, ZSTR_VAL(file), line);
 	}
 
 	zval_ptr_dtor_nogc(&zbacktrace);
-	zend_string_release(Z_STR(startfile));
 
 	PHPDBG_OUTPUT_BACKUP_RESTORE();
 } /* }}} */
diff --git a/sapi/phpdbg/phpdbg_info.c b/sapi/phpdbg/phpdbg_info.c
index b6c48d548f1f0..d64703755cbe0 100644
--- a/sapi/phpdbg/phpdbg_info.c
+++ b/sapi/phpdbg/phpdbg_info.c
@@ -399,27 +399,29 @@ PHPDBG_INFO(classes) /* {{{ */
 	phpdbg_notice("User Classes (%d)", zend_hash_num_elements(&classes));
 
 	/* once added, assume that classes are stable... until shutdown. */
-	ZEND_HASH_PACKED_FOREACH_PTR(&classes, ce) {
-		phpdbg_print_class_name(ce);
-
-		if (ce->parent) {
-			if (ce->ce_flags & ZEND_ACC_LINKED) {
-				zend_class_entry *pce = ce->parent;
-				do {
-					phpdbg_out("|-------- ");
-					phpdbg_print_class_name(pce);
-				} while ((pce = pce->parent));
-			} else {
-				phpdbg_writeln("|-------- User Class %s (not yet linked because declaration for parent was not encountered when declaring the class)", ZSTR_VAL(ce->parent_name));
+	if (HT_IS_INITIALIZED(&classes)) {
+		ZEND_HASH_PACKED_FOREACH_PTR(&classes, ce) {
+			phpdbg_print_class_name(ce);
+
+			if (ce->parent) {
+				if (ce->ce_flags & ZEND_ACC_LINKED) {
+					zend_class_entry *pce = ce->parent;
+					do {
+						phpdbg_out("|-------- ");
+						phpdbg_print_class_name(pce);
+					} while ((pce = pce->parent));
+				} else {
+					phpdbg_writeln("|-------- User Class %s (not yet linked because declaration for parent was not encountered when declaring the class)", ZSTR_VAL(ce->parent_name));
+				}
 			}
-		}
 
-		if (ce->info.user.filename) {
-			phpdbg_writeln("|---- in %s on line %u", ZSTR_VAL(ce->info.user.filename), ce->info.user.line_start);
-		} else {
-			phpdbg_writeln("|---- no source code");
-		}
-	} ZEND_HASH_FOREACH_END();
+			if (ce->info.user.filename) {
+				phpdbg_writeln("|---- in %s on line %u", ZSTR_VAL(ce->info.user.filename), ce->info.user.line_start);
+			} else {
+				phpdbg_writeln("|---- no source code");
+			}
+		} ZEND_HASH_FOREACH_END();
+	}
 
 	zend_hash_destroy(&classes);
 
@@ -445,17 +447,19 @@ PHPDBG_INFO(funcs) /* {{{ */
 
 	phpdbg_notice("User Functions (%d)", zend_hash_num_elements(&functions));
 
-	ZEND_HASH_PACKED_FOREACH_PTR(&functions, zf) {
-		zend_op_array *op_array = &zf->op_array;
+	if (HT_IS_INITIALIZED(&functions)) {
+		ZEND_HASH_PACKED_FOREACH_PTR(&functions, zf) {
+			zend_op_array *op_array = &zf->op_array;
 
-		phpdbg_write("|-------- %s", op_array->function_name ? ZSTR_VAL(op_array->function_name) : "{main}");
+			phpdbg_write("|-------- %s", op_array->function_name ? ZSTR_VAL(op_array->function_name) : "{main}");
 
-		if (op_array->filename) {
-			phpdbg_writeln(" in %s on line %d", ZSTR_VAL(op_array->filename), op_array->line_start);
-		} else {
-			phpdbg_writeln(" (no source code)");
-		}
-	} ZEND_HASH_FOREACH_END();
+			if (op_array->filename) {
+				phpdbg_writeln(" in %s on line %d", ZSTR_VAL(op_array->filename), op_array->line_start);
+			} else {
+				phpdbg_writeln(" (no source code)");
+			}
+		} ZEND_HASH_FOREACH_END();
+	}
 
 	zend_hash_destroy(&functions);
 
diff --git a/sapi/phpdbg/phpdbg_lexer.l b/sapi/phpdbg/phpdbg_lexer.l
index eb159bdef1c7a..6245262a00598 100644
--- a/sapi/phpdbg/phpdbg_lexer.l
+++ b/sapi/phpdbg/phpdbg_lexer.l
@@ -82,7 +82,7 @@ ID          [^ \r\n\t:#\000]+
 GENERIC_ID  ([^ \r\n\t:#\000"']|":\\")+|["]([^\n\000"\\]|"\\\\"|"\\"["])+["]|[']([^\n\000'\\]|"\\\\"|"\\"['])+[']
 ADDR        [0][x][a-fA-F0-9]+
 OPCODE      (ZEND_|zend_)([A-Z_a-z])+
-INPUT       ("\\"[#"']|["]("\\\\"|"\\"["]|[^\n\000"])+["]|[']("\\"[']|"\\\\"|[^\n\000'])+[']|[^\n\000#"'])+
+INPUT       ("\\"[#"']|["]("\\\\"|"\\"["]|[^\n\000"])*["]|[']("\\"[']|"\\\\"|[^\n\000'])*[']|[^\n\000#"'])+
 
  := yyleng = (size_t) YYCURSOR - (size_t) yytext;
 
diff --git a/sapi/phpdbg/phpdbg_prompt.c b/sapi/phpdbg/phpdbg_prompt.c
index 2314068044fb8..6333fdcb76554 100644
--- a/sapi/phpdbg/phpdbg_prompt.c
+++ b/sapi/phpdbg/phpdbg_prompt.c
@@ -904,7 +904,7 @@ PHPDBG_COMMAND(run) /* {{{ */
 				}
 			} zend_end_try();
 
-			if (EG(exception)) {
+			if (EG(exception) && !zend_is_unwind_exit(EG(exception))) {
 				phpdbg_handle_exception();
 			}
 		}
@@ -1652,6 +1652,15 @@ void phpdbg_execute_ex(zend_execute_data *execute_data) /* {{{ */
 
 	PHPDBG_G(in_execution) = 1;
 
+#ifdef ZEND_CHECK_STACK_LIMIT
+	if (UNEXPECTED(zend_call_stack_overflowed(EG(stack_limit)))) {
+		zend_call_stack_size_error();
+		/* No opline was executed before exception */
+		EG(opline_before_exception) = NULL;
+		/* Fall through to handle exception below. */
+	}
+#endif /* ZEND_CHECK_STACK_LIMIT */
+
 	while (1) {
 		zend_object *exception = EG(exception);
 
diff --git a/sapi/phpdbg/phpdbg_watch.c b/sapi/phpdbg/phpdbg_watch.c
index 2f546a71d6064..4478dca0516ba 100644
--- a/sapi/phpdbg/phpdbg_watch.c
+++ b/sapi/phpdbg/phpdbg_watch.c
@@ -138,10 +138,10 @@ const phpdbg_command_t phpdbg_watch_commands[] = {
 bool phpdbg_check_watch_diff(phpdbg_watchtype type, void *oldPtr, void *newPtr) {
 	switch (type) {
 		case WATCH_ON_BUCKET:
-			if (memcmp(&((Bucket *) oldPtr)->h, &((Bucket *) newPtr)->h, sizeof(Bucket) - sizeof(zval) /* key/val comparison */) != 0) {
+			if (memcmp(&((Bucket *) oldPtr)->h, &((Bucket *) newPtr)->h, sizeof(Bucket) - sizeof(zval) /* hash+key comparison */) != 0) {
 				return 2;
 			}
-			/* TODO: Is this intentional? */
+			/* Fall through to also compare the value from the bucket. */
 			ZEND_FALLTHROUGH;
 		case WATCH_ON_ZVAL:
 			return memcmp(oldPtr, newPtr, sizeof(zend_value) + sizeof(uint32_t) /* value + typeinfo */) != 0;
@@ -310,9 +310,9 @@ int phpdbg_watchpoint_segfault_handler(siginfo_t *info, void *context) {
 # if defined(__GNUC__) && !defined(__clang__)
 __attribute__((no_sanitize_address))
 # endif
-void *phpdbg_watchpoint_userfaultfd_thread(void *phpdbg_globals) {
+void *phpdbg_watchpoint_userfaultfd_thread(void *phpdbg_globals_ptr) {
 	pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
-	zend_phpdbg_globals *globals = (zend_phpdbg_globals *) phpdbg_globals;
+	zend_phpdbg_globals *globals = (zend_phpdbg_globals *) phpdbg_globals_ptr;
 
 	struct uffd_msg fault_msg = {0};
 	while (read(globals->watch_userfaultfd, &fault_msg, sizeof(fault_msg)) == sizeof(fault_msg)) {
diff --git a/sapi/phpdbg/tests/gh15901.phpt b/sapi/phpdbg/tests/gh15901.phpt
new file mode 100644
index 0000000000000..00783b71968a2
--- /dev/null
+++ b/sapi/phpdbg/tests/gh15901.phpt
@@ -0,0 +1,10 @@
+--TEST--
+GH-15901 (phpdbg: Assertion failure on `i funcs`)
+--PHPDBG--
+i funcs
+i classes
+--EXPECT--
+prompt> [User Functions (0)]
+prompt> [User Classes (0)]
+prompt> [User Classes (0)]
+prompt>
diff --git a/sapi/phpdbg/tests/gh16174.phpt b/sapi/phpdbg/tests/gh16174.phpt
new file mode 100644
index 0000000000000..f108cd66be9a2
--- /dev/null
+++ b/sapi/phpdbg/tests/gh16174.phpt
@@ -0,0 +1,10 @@
+--TEST--
+GH-16174 (Empty string is an invalid expression for phpdbg-ev)
+--PHPDBG--
+ev $e = ""
+ev $f = ''
+--EXPECT--
+prompt> 
+prompt> 
+prompt> 
+prompt>
diff --git a/sapi/phpdbg/tests/gh16181.phpt b/sapi/phpdbg/tests/gh16181.phpt
new file mode 100644
index 0000000000000..478bbb98ca0d9
--- /dev/null
+++ b/sapi/phpdbg/tests/gh16181.phpt
@@ -0,0 +1,26 @@
+--TEST--
+GH-16181 (phpdbg: exit in exception handler reports fatal error)
+--PHPDBG--
+r
+c
+q
+--FILE--
+
+--EXPECTF--
+[Successful compilation of %s]
+prompt> throwing exception
+[Uncaught Exception in %s on line %d: oh noes]
+>00008: throw new \Exception("oh noes");
+ 00009: ?>
+ 00010: 
+prompt> exception caught
+[Script ended normally]
+prompt>
diff --git a/scripts/gdb/php_gdb.py b/scripts/gdb/php_gdb.py
index d4db760812687..b7258fb78f1a9 100644
--- a/scripts/gdb/php_gdb.py
+++ b/scripts/gdb/php_gdb.py
@@ -67,6 +67,12 @@ def format_string(self):
 
 pp_set.add_printer('zend_string', '^_zend_string$', ZendStringPrettyPrinter)
 
+def zendStringPointerPrinter(ptr):
+    "Given a pointer to a zend_string, show the contents (if non-NULL)"
+    if int(ptr) == 0:
+        return '0x0'
+    return ZendStringPrettyPrinter(ptr.dereference()).to_string()
+
 class ZendTypePrettyPrinter(gdb.printing.PrettyPrinter):
     "Print a zend_type"
 
@@ -289,6 +295,52 @@ def children(self):
 
 pp_set.add_printer('zval', '^_zval_struct$', ZvalPrettyPrinter)
 
+class ZendClassEntryPrettyPrinter(gdb.printing.PrettyPrinter):
+    "Print a zend_class_entry"
+
+    # String pointers, show the string contents if possible
+    STRING_FIELDS = [ 'name', 'doc_comment' ]
+
+    def __init__(self, val):
+        self.val = val
+
+    def to_string(self):
+        return zendStringPointerPrinter(self.val['name'])
+
+    def children(self):
+        for field in self.val.type.fields():
+            if field.name is not None:
+                if field.name in self.STRING_FIELDS:
+                    yield (field.name, zendStringPointerPrinter(self.val[field.name]))
+                else:
+                    yield (field.name, self.val[field.name])
+            else:
+                # Don't break on the union fields. Unfortunately, pretty
+                # printers done in python cannot match the default formatting of
+                # C anonymous fields, which omit the name entirely, see
+                # binutils-gdb/gdb/cp-valprint.c#248 (as of commit
+                # b6532accdd8e24329cc69bb58bc2883796008776)
+                yield ('', self.val[field])
+
+pp_set.add_printer('zend_class_entry', '^_zend_class_entry$', ZendClassEntryPrettyPrinter)
+
+class ZendClassConstantPrettyPrinter(gdb.printing.PrettyPrinter):
+    "Print a zend_class_constant"
+
+    def __init__(self, val):
+        self.val = val
+
+    def children(self):
+        for field in self.val.type.fields():
+            if field.name == 'doc_comment':
+                yield ('doc_comment', zendStringPointerPrinter(self.val['doc_comment']))
+            elif field.name == 'ce':
+                yield ('ce', zendStringPointerPrinter(self.val['ce']['name']))
+            else:
+                yield (field.name, self.val[field.name])
+
+pp_set.add_printer('zend_class_constant', '^_zend_class_constant$', ZendClassConstantPrettyPrinter)
+
 type_bit_to_name = None
 type_name_to_bit = None
 
@@ -301,7 +353,7 @@ def load_type_bits():
 
     (symbol,_) = gdb.lookup_symbol("zend_gc_refcount")
     if symbol == None:
-        raise "Could not find zend_types.h: symbol zend_gc_refcount not found"
+        raise Exception("Could not find zend_types.h: symbol zend_gc_refcount not found")
     filename = symbol.symtab.fullname()
 
     bits = {}
diff --git a/scripts/phpize.m4 b/scripts/phpize.m4
index e59a1c03a5789..be7065b786d96 100644
--- a/scripts/phpize.m4
+++ b/scripts/phpize.m4
@@ -104,11 +104,7 @@ dnl Discard optimization flags when debugging is enabled.
 AS_VAR_IF([PHP_DEBUG], [yes], [
   PHP_DEBUG=1
   ZEND_DEBUG=yes
-  changequote({,})
-  dnl Discard known '-O...' flags, including just '-O', but do not remove only '-O' in '-Ounknown'
-  CFLAGS=$(echo "$CFLAGS" | $SED -e 's/-O\([0-9gsz]\|fast\|\)\([\t ]\|$\)//g')
-  CXXFLAGS=$(echo "$CXXFLAGS" | $SED -e 's/-O\([0-9gsz]\|fast\|\)\([\t ]\|$\)//g')
-  changequote([,])
+  PHP_REMOVE_OPTIMIZATION_FLAGS
   dnl Add -O0 only if GCC or ICC is used.
   if test "$GCC" = "yes" || test "$ICC" = "yes"; then
     CFLAGS="$CFLAGS -O0"
diff --git a/tests/basic/GHSA-9pqp-7h25-4f32.inc b/tests/basic/GHSA-9pqp-7h25-4f32.inc
new file mode 100644
index 0000000000000..adf72a361a2cb
--- /dev/null
+++ b/tests/basic/GHSA-9pqp-7h25-4f32.inc
@@ -0,0 +1,3 @@
+
+--FILE--
+ '1',
+        'CONTENT_TYPE' => "multipart/form-data; boundary=$boundary",
+        'CONTENT_LENGTH' => strlen($body),
+        'REQUEST_METHOD' => 'POST',
+        'SCRIPT_FILENAME' => __DIR__ . '/GHSA-9pqp-7h25-4f32.inc',
+    ]);
+
+    $spec = [
+        0 => ['pipe', 'r'],
+        1 => STDOUT,
+        2 => STDOUT,
+    ];
+
+    $pipes = [];
+
+    print "Starting...\n";
+
+    $handle = proc_open($cmd, $spec, $pipes, getcwd(), $env);
+
+    fwrite($pipes[0], $body);
+
+    $status = proc_close($handle);
+
+    print "\n";
+}
+
+for ($offset = -1; $offset <= 1; $offset++) {
+    test(FILLUNIT - strlen("\r\n--") + $offset);
+}
+
+?>
+--EXPECTF--
+Boundary len: 5115
+Starting...
+X-Powered-By: %s
+Content-type: text/html; charset=UTF-8
+
+Hello world
+array(1) {
+  ["koko"]=>
+  string(5124) "BBB
+--AAA%sCCC"
+}
+
+Boundary len: 5116
+Starting...
+X-Powered-By: %s
+Content-type: text/html; charset=UTF-8
+
+Hello world
+array(1) {
+  ["koko"]=>
+  string(5125) "BBB
+--AAA%sCCC"
+}
+
+Boundary len: 5117
+Starting...
+X-Powered-By: %s
+Content-type: text/html; charset=UTF-8
+
+Warning :  Boundary too large in multipart/form-data POST data in Unknown  on line 0 
        
-           
-           
 
 #include 
-#include 
 
 #ifdef HAVE_LIBXML
 #include 
@@ -34,30 +33,6 @@ BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID dummy)
 {
 	BOOL ret = TRUE;
 
-	switch (reason)
-	{
-		case DLL_PROCESS_ATTACH:
-			ret = ret && php_win32_ioutil_init();
-			if (!ret) {
-				fprintf(stderr, "ioutil initialization failed");
-				return ret;
-			}
-			break;
-#if 0 /* prepared */
-		case DLL_PROCESS_DETACH:
-			/* pass */
-			break;
-
-		case DLL_THREAD_ATTACH:
-			/* pass */
-			break;
-
-		case DLL_THREAD_DETACH:
-			/* pass */
-			break;
-#endif
-	}
-
 #ifdef HAVE_LIBXML
 	/* This imply that only LIBXML_STATIC_FOR_DLL is supported ATM.
 		If that changes, this place will need some rework.
diff --git a/win32/ioutil.c b/win32/ioutil.c
index a6f2fe2ae2fc1..acd4103c613b1 100644
--- a/win32/ioutil.c
+++ b/win32/ioutil.c
@@ -67,10 +67,6 @@
 #include 
 */
 
-typedef HRESULT (__stdcall *MyPathCchCanonicalizeEx)(wchar_t *pszPathOut, size_t cchPathOut, const wchar_t *pszPathIn, unsigned long dwFlags);
-
-static MyPathCchCanonicalizeEx canonicalize_path_w = NULL;
-
 PW32IO BOOL php_win32_ioutil_posix_to_open_opts(int flags, mode_t mode, php_ioutil_open_opts *opts)
 {/*{{{*/
 	int current_umask;
@@ -619,7 +615,7 @@ PW32IO php_win32_ioutil_normalization_result php_win32_ioutil_normalize_path_w(w
 		}
 	}
 
-	if (S_OK != canonicalize_path_w(canonicalw, MAXPATHLEN, _tmp, PATHCCH_ALLOW_LONG_PATHS)) {
+	if (S_OK != PathCchCanonicalizeEx(canonicalw, MAXPATHLEN, _tmp, PATHCCH_ALLOW_LONG_PATHS)) {
 		/* Length unchanged. */
 		*new_len = len;
 		return PHP_WIN32_IOUTIL_NORM_PARTIAL;
@@ -643,27 +639,6 @@ PW32IO php_win32_ioutil_normalization_result php_win32_ioutil_normalize_path_w(w
 	return PHP_WIN32_IOUTIL_NORM_OK;
 }/*}}}*/
 
-static HRESULT __stdcall MyPathCchCanonicalizeExFallback(wchar_t *pszPathOut, size_t cchPathOut, const wchar_t *pszPathIn, unsigned long dwFlags)
-{/*{{{*/
-	return -42;
-}/*}}}*/
-
-BOOL php_win32_ioutil_init(void)
-{/*{{{*/
-	HMODULE hMod = GetModuleHandle("api-ms-win-core-path-l1-1-0");
-
-	if (hMod) {
-		canonicalize_path_w = (MyPathCchCanonicalizeEx)GetProcAddress(hMod, "PathCchCanonicalizeEx");
-		if (!canonicalize_path_w) {
-			canonicalize_path_w = (MyPathCchCanonicalizeEx)MyPathCchCanonicalizeExFallback;
-		}
-	} else {
-		canonicalize_path_w = (MyPathCchCanonicalizeEx)MyPathCchCanonicalizeExFallback;
-	}
-
-	return TRUE;
-}/*}}}*/
-
 PW32IO int php_win32_ioutil_access_w(const wchar_t *path, mode_t mode)
 {/*{{{*/
 	DWORD attr;
diff --git a/win32/ioutil.h b/win32/ioutil.h
index f6105a87f2468..6a7055fc71a77 100644
--- a/win32/ioutil.h
+++ b/win32/ioutil.h
@@ -169,11 +169,6 @@ typedef enum {
 } while (0);
 
 PW32IO php_win32_ioutil_normalization_result php_win32_ioutil_normalize_path_w(wchar_t **buf, size_t len, size_t *new_len);
-#ifdef PHP_EXPORTS
-/* This symbols are needed only for the DllMain, but should not be exported
-	or be available when used with PHP binaries. */
-BOOL php_win32_ioutil_init(void);
-#endif
 
 /* Keep these functions aliased for case some additional handling
    is needed later. */
diff --git a/win32/winutil.c b/win32/winutil.c
index e09944d131b9b..e41bc899452f0 100644
--- a/win32/winutil.c
+++ b/win32/winutil.c
@@ -486,7 +486,7 @@ PHP_WINUTIL_API BOOL php_win32_crt_compatible(char **err)
 {/*{{{*/
 #if PHP_LINKER_MAJOR == 14
 	/* Extend for other CRT if needed. */
-# if PHP_DEBUG
+# ifdef _DEBUG
 	const char *crt_name = "vcruntime140d.dll";
 # else
 	const char *crt_name = "vcruntime140.dll";